Firefox插件sdk / tabs:"准备就绪"所有页面加载都不会触发事件?

时间:2014-07-19 16:48:40

标签: javascript firefox-addon-sdk

我正在使用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);
        });
    }
});

2 个答案:

答案 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的偷偷摸摸的页面更新。