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