我正在使用sdk/tabs监听页面加载:
require('sdk/tabs').on('ready', function(tab) { console.log(tab.url); } );
在正常导航期间,它按预期工作,但在一些具有脚本导航的页面上,“ready”事件不会触发。例如,加载Flickr照片页面:
https://www.flickr.com/photos/42559357@N04/14696401803
使用GUI导航(侧边的箭头或底部的图标)浏览其他照片。选项卡URL会更改,但监听器从未被调用。
这是正常现象吗?有没有办法跟踪此类页面加载?
预计时间:我注意到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);
});
}
});
history.pushState
更改URL:https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState%28%29_method。使用DOMSubtreeModified比轮询要好得多。 - serv-inc