我正在使用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);
});
}
});
答案 0 :(得分:1)
您应该考虑改为监听pageshow
事件:
https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/tabs#pageshow
此api专门用于解决至少其中一些类型的问题。如果UI更改你需要钩子纯粹来自JS,你可能需要为特定于框架的事件添加监听器。
答案 1 :(得分:0)
两年后,Firefox结束了对旧版插件平台的支持,迫使每个人都切换到WebExtensions。但是对于我的Flickr插件来说这是一个祝福,因为现在我可以通过从后台脚本中监听选项卡URL更改来做我想做的事情:
chrome.tabs.onUpdated.addListener(onTabChange)
function onTabChange(tabId, changeInfo) {
if (changeInfo.url) {
// do stuff
}
}
这确实适用于Flickr的偷偷摸摸的页面更新。