2

我正在尝试为 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 某些部分的延迟加载:我稍后添加了一些代码来等待相关元素,而且至关重要的是,对于某些转换,消息永远不会被记录。例如,当我从消息切换到新闻提要并返回时。

4

1 回答 1

3

他们不是使用 ajax 在 div 中加载内容吗?例如,您可以使用Firebug找到正在更新的元素。

当您单击某些内容并且 URL 发生更改时,但#在 URL 上带有 a 并且在此之后有一些文本,这意味着该文本不是路径,它是一个参数,浏览器不会更改您所在的页面,所以由于 GreaseMonkey 注入页面上的脚本加载它不会再次注入,因为页面没有重新加载。如在您的示例中,URLfacebook.com/#!/sk=messages没有离开facebook.com/它不会触发window.load事件。因此,您需要找到正在更改的元素并向该元素添加事件侦听器,您可以使用我之前提到的 Firebug。

在找出获取内容的元素后,您必须向该元素而不是页面添加事件侦听器(GreaseMonkey 仅在窗口加载事件上添加)。

因此,在您的 GM 脚本中,您将拥有(“空气代码”)

document.getElement('dynamic_div').addEvent('load', /*your script*/);
于 2010-05-20T11:40:23.803 回答