使用异常内容加载时不执行 Greasemonkey 脚本
Posted
技术标签:
【中文标题】使用异常内容加载时不执行 Greasemonkey 脚本【英文标题】:Greasemonkey script not executed when unusual content loading is being used 【发布时间】:2010-05-20 09:50:23 【问题描述】:我正在尝试为 Facebook 编写一个 Greasemonkey 脚本,但在加载时髦的页面/内容时遇到了一些麻烦(我不太明白这一点 - 很多链接实际上只是在更改 GET,但是我认为他们会进行某种服务器重定向以使 URL 在浏览器中看起来也一样?)。本质上,唯一需要的测试是在脚本中单独放置一个GM_log()
。如果您在 Facebook 周围单击,即使使用 facebook.com/* 作为模式,它通常也不会执行。有什么我可以做的,或者是在 Greasemonkey 中修复了“页面加载”的想法,而 FB 正在通过使用单个 URL “欺骗”它不运行?
如果我尝试像这样进行一些基本的内容操作:
GM.log("starting");
var GM_FB=new Object;
GM_FB.birthdays = document.evaluate("//div[@class='UIUpcoming_Item']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (i = GM_FB.birthdays.snapshotLength - 1; i >= 0; i--)
if (GM_FB.birthdayRegex.test(GM_FB.birthdays.snapshotItem(i).innerhtml))
GM_FB.birthdays.snapshotItem(i).setAttribute('style','font-weight: bold; background: #fffe88');
结果是有时只需手动刷新页面即可使其正常工作。拉起 Firebug 控制台并强制代码运行工作正常。请注意,这不是由于 DOM 某些部分的延迟加载:我稍后添加了一些代码来等待相关元素 和,至关重要的是,对于某些转换,消息永远不会被记录。例如,当我从消息切换到动态消息并返回时。
【问题讨论】:
【参考方案1】:他们不是使用 ajax 在 div 中加载内容吗?例如,您可以使用Firebug 找到正在更新的元素。
当你点击某些东西并且 URL 改变了,但是在 URL 上带有 #
并且在这之后一些文本,这意味着文本不是路径,它是一个参数,浏览器不会改变你所在的页面,所以由于 GreaseMonkey 在页面加载时注入脚本,它不会再次注入,因为页面没有重新加载。
在您的示例中,URL facebook.com/#!/sk=messages
没有从 facebook.com/
导航,它不会触发 window.load
事件。
因此,您需要找到正在更改的元素并为该元素添加事件侦听器,您可以使用我之前提到的 Firebug。
在找出获取内容的元素后,您必须为该元素而不是页面添加事件侦听器(GreaseMonkey 仅在窗口加载事件上添加)。
因此,在您的 GM 脚本中,您将拥有(“航空代码”)
document.getElement('dynamic_div').addEvent('load', /*your script*/);
【讨论】:
我检查的大部分内容看起来像普通链接,但它们将内容附加到 URL GET 参数而不是更改(即它始终保持为 facebook.com/?blahfoo)。出于某种原因,当这种情况发生时,我似乎不会再执行一次 GM。 URL 上是否有#
?页面 URL 可以更改,但不会重新加载页面。没有其他方法可以从网站执行脚本。
在这种情况下,服务器端重定向是否也会阻止 GM 运行?例如重新加载 FB,Messages href 是 facebook.com/?sk=messages 但当您单击它时,它会转到 facebook.com/#!/sk=messages 并且 GM 不会运行。这可以解释部分问题。当然,它也弄乱了我的 setTimeout (而且我没有将函数名作为字符串错误)来检查元素是否到达。编写脚本的网站有点尴尬。
好的,这解释了大部分内容。另一个问题是,通过保留 DOM 元素但不显示,DOM 子元素似乎不会触发插入事件,因此您必须单独查找每种“类型”的重新加载。仍然不知道为什么有时它似乎没有重新加载(使用#)但是然后像它一样触发 GM 脚本,然后其中的 setTimeout 失败。如果您在“duh, it's the # anchor”的效果上添加答案,我将接受并单独排序最后的内容。
好的,我也将你提到的URL作为例子添加。以上是关于使用异常内容加载时不执行 Greasemonkey 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何在与有条件呈现的内容相关联的页面加载时不初始化 bean
如何用 Greasemonkey 的用户脚本替换 JSON 字符串中的文本