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

时间:2010-05-20 09:50:23

标签: 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的某些部分的后期加载:我稍后添加了一些代码以等待相关元素,关键的是,消息永远不会被记录以用于某些转换。例如,当我从“消息”切换到“新闻源”并返回时。

1 个答案:

答案 0 :(得分:3)

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

当您点击某个内容并且网址发生变化,但网址上有#并且在此之后有一些文字时,表示文字不是路径,它是参数,浏览器不会更改页面你是,所以既然GreaseMonkey在页面上注入脚本,它就不会再次注入,因为页面没有重新加载。 在您的示例中,网址facebook.com/#!/sk=messages不会导航facebook.com/,它不会触发window.load事件。 因此,您需要找到正在更改的元素并向该元素添加事件侦听器,您可以使用我之前提到的Firebug。

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

所以在GM脚本中你会有(“空气代码”)

document.getElement('dynamic_div').addEvent('load', /*your script*/);