下面的用户脚本适用于我自己的 Twitter 个人资料页面(而不是时间线)。
// ==UserScript==
// @name CoolScript
// @include https://twitter.com/IJNanayakkara
// @include https://twitter.com/IJNanayakkara/status/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @version 1.0
// @license GPL v3 or any later version (http://www.gnu.org/copyleft/gpl.html)
// @grant GM_addStyle
// ==/UserScript==
function prependToTweet(jNode) {
jNode.prepend("Hello World ");
}
waitForKeyElements("p.js-tweet-text", prependToTweet);
它的作用是将给定的文本字符串附加到页面中每条推文的开头。
尽管脚本满足了我的要求,但我面临两个问题。
1. 脚本影响除中定义的页面之外的页面@include
.
我安装脚本并转到我的 Twitter 个人资料。所有的推文都有你好世界字符串添加到开头。这是预料之中的。
但后来我进入我的时间线页面,那里的所有推文也都有你好世界附加到它们的字符串这不是预期的行为。
我需要知道为什么会发生这种情况。
2. 你好世界字符串 字符串重复自身。
假设我单击一条推文以在单个页面中查看它。工作正常。
然后我回到我的个人资料页面。
如果我转到其他页面并再次返回,该字符串会再次重复。
这是我面临的两个问题。我认为这些问题是由于 AJAX 造成的,但我无法找到解决方法。
似乎发生了一些事情:
当 twitter 更改为“新”页面时,它有时会保留修改后的文本,但会丢弃原来的 jQuery 数据waitForKeyElements
用于跟踪节点。
当导航到“新”、“不需要的”页面时,由于没有页面加载,脚本不会重新触发,旧的页面waitForKeyElements
仍然活跃。
如果您从不想进行调整的页面开始,然后导航到您想要进行调整的页面,则脚本不会触发,因为 twitter 只是显示了一个新 URL,它实际上并未加载太多任何内容。
Twitter 正在加载 iframe,并且脚本也在这些 iframe 上触发。
为了解决这些问题,我们:
- 还可以通过硬属性跟踪更改的节点——twitter 不会丢弃该属性。
- 改变
@include
开火https://twitter.com/*
然后使用location.pathname
进一步完善这一点。
- 停用
waitForKeyElements
当 AJAX 访问不需要的页面时。
- Monitor
<title>
更改作为检测“新”页面的可靠方法。
- Use
@noframes
.
所以,这个脚本应该更适合你(只在 Greasemonkey 上测试过,但是should在 Tampermonkey 上工作):
// ==UserScript==
// @name Twitter: Modify tweets on select pages.
// @include https://twitter.com/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// @noframes
// ==/UserScript==
var tweetSelector = "p.js-tweet-text";
function fireMainCode () {
/*--- Only fire on desired pages. This fires on:
twitter.com/IJNanayakkara*
twitter.com/IJNanayakkara/status/*
*/
if (/^\/IJNanayakkara(\/status\/)?/.test (location.pathname) ) {
if ( ! this.WFKE_fired) {
waitForKeyElements (tweetSelector, prependToTweet);
this.WFKE_fired = true;
}
}
else {
//--- Undesired page, shut off waitForKeyElements
if (this.WFKE_fired) {
this.WFKE_fired = null;
var controlObj = waitForKeyElements.controlObj || {};
var controlKey = tweetSelector.replace (/[^\w]/g, "_");
var timeControl = controlObj [controlKey];
if (timeControl) {
clearInterval (timeControl);
delete controlObj [controlKey]
}
}
}
}
fireMainCode ();
function prependToTweet (jNode) {
var altDoneFlag = jNode.attr ("data-altdoneflag");
if ( ! altDoneFlag) {
jNode.prepend ("XXXXX => ")
.attr ("data-altdoneflag", "yes");
}
}
/*--- Twitter uses some pretty screwy AJAX to "change" pages, but it at least
changes the title. So listen for that to (re) trigger waitForKeyElements.
*/
var myObserver = new MutationObserver (titleChangeDetector);
var obsConfig = {
//-- Subtree needed.
childList: true, characterData: true, subtree: true
};
myObserver.observe (document, obsConfig);
function titleChangeDetector (mutationRecords) {
mutationRecords.forEach ( function (mutation) {
//-- Sensible, Firefox
if ( mutation.type == "childList"
&& mutation.target.nodeName == "TITLE"
) {
fireMainCode ();
}
//-- WTF, Chrome
else if (mutation.type == "characterData"
&& mutation.target.parentNode.nodeName == "TITLE"
) {
fireMainCode ();
}
} );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)