我正在使用 sdk/tabs 监听页面加载:
require('sdk/tabs').on('ready', function(tab) { console.log(tab.url); } );
它在正常导航期间按预期工作,但在某些使用脚本导航的页面上,“就绪”事件不会触发。例如,加载一个 Flickr 照片页面:
https://www.flickr.com/photos/42559357@N04/14696401803
并使用 GUI 导航(照片两侧的箭头或照片底部的图标)导航到其他照片。选项卡 URL 更改,但从未调用监听器。
这正常吗?有什么方法可以跟踪此类页面加载吗?
ETA:我注意到 sdk/context-menu 没有遇到同样的问题,这给了我一个解决方法的想法:
var cm = require("sdk/context-menu");
cm.Item({
label: "dummy",
contentScript: 'self.on("context", function (node) {' +
' self.postMessage(document.URL);' +
' return false;' +
'});',
onMessage: function (pageUrl) {
console.log(pageUrl);
}
});
只要在页面上打开上下文菜单,就会触发 onMessage 下的函数,并且像上面描述的那样棘手的页面更改不会混淆脚本:它会准确地记录当前 URL。
碰巧,为页面 URL 定制的上下文菜单正是我的目标,所以这可能对我有用(我将添加 URL 过滤和一种方法来确保每次只传送一次有效负载页)。但我仍然想要原始问题的答案。
ETA2:page-mod 与选项卡有同样的问题:下面将监听 Flickr 上的新页面打开,但不会在通过 Flickr UI 加载新页面时监听:
var pageMod = require("sdk/page-mod");
pageMod.PageMod({
include: '*.flickr.com',
contentScriptWhen: 'start',
contentScript: 'self.port.emit("pageOpened", document.URL);',
onAttach: function(worker) {
worker.port.on("pageOpened", function(pageUrl) {
console.log(pageUrl);
});
}
});
最佳答案
我有这个问题。这是因为 Firefox“预加载”了页面,所以它加载了 state="ready"。因此,页面状态没有变化,事件也没有被触发。
为了克服这个问题,我监听了“打开”事件 (tabs.on("open", ...)
) 并检查页面是否处于“就绪”状态:
tabs.on("open", function (tab) {
tab.on("pageshow", doSomething);
if (tab.readyState == "complete") {
doSomething(tab);
}
});
关于javascript - Firefox 插件 sdk/tabs : "ready" event doesn't fire on all page loads?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24842698/