facebook - 使用异常内容加载时不执行 Greasemonkey 脚本

标签 facebook greasemonkey pageload

我正在尝试为 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/

相关文章:

facebook - 我如何重新配置​​ Meteor 的 accounts-facebook,或者 Meteor 的 Facebook 配置在哪里?

javascript - 在不丢失事件的情况下替换 HTML 中数据绑定(bind)中的值

javascript - 用 Greasemonkey 替换对象参数的值

javascript - 如何压缩/解压缩用户脚本中的字符串?

javascript - 页面加载后出现 Logo 图像该怎么办?

javascript - 使用 JavaScript 转到页面并自动执行该页面上的功能

android - 使用 Android 应用程序和网络服务处理 Facebook token 过期

ios - 如何获取当前 PFUser 的 Facebook 访问 token

javascript - Facebook 上的提示-许可吗?

c# - 为什么要加载另一个页面时会触发 Page_Load 事件?