我正在尝试为 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 的某些部分延迟加载造成的:我稍后添加了一些代码来等待相关元素和,最重要的是,对于某些转换,消息永远不会被记录。例如,当我从“消息”切换到“新闻源”并切换回来时。
最佳答案
他们不是使用ajax加载div中的内容吗?您可以使用 Firebug 找到正在更新的元素。例如。
当你点击某个东西并且 URL 发生变化,但是 URL 上有一个 #
以及后面的一些文本时,这意味着该文本不是路径,而是一个参数,浏览器不会更改您所在的页面,因此由于 GreaseMonkey 在页面加载时注入(inject)脚本,因此不会再次注入(inject),因为页面不会重新加载。
正如您的示例中所示,URL facebook.com/#!/sk=messages
不会离开 facebook.com/
它不会触发 window.load
事件。
因此,您需要找到正在更改的元素并向该元素添加事件监听器,您可以使用我之前提到的 Firebug。
找出哪个元素正在获取内容后,您必须向该元素而不是页面添加事件监听器(GreaseMonkey 仅添加窗口加载事件)。
所以在你的GM脚本中你会有(“空中代码”)
document.getElement('dynamic_div').addEvent('load', /*your script*/);
关于facebook - 使用异常内容加载时不执行 Greasemonkey 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2872589/