Firefox addon-sdk - 监听页面导航

时间:2012-02-27 07:56:32

标签: javascript firefox-addon firefox-addon-sdk

我正在尝试使用addon-sdk将Chrome插件移植到Firefox,但我找不到用于收听标签导航事件的等效方法。

我需要做的是保持每页数据(从DOM检测到),并在用户导航到选项卡中的新页面时立即删除(但是,在刷新时维护数据)

我是Chrome,要在标签更改网址时执行某些操作,我可以使用:

chrome.tabs.onUpdated.addListener(function(tab_id, changeInfo, tab) {
    if(changeInfo.status == 'loading' && changeInfo.url) {
        //DO STUFF AS THE URL CHANGED
    }
});

在使用addon-sdk的Firefox中,我尝试过使用:

tabs.on('open', function(tab){
  tab.on('ready', function(tab){
    if(tab.cachedURL != tab.url) {
      //DO STUFF AND SET CACHE
    }
  });
});

问题在于我无法挂钩初始导航事件,所以在开始导航的用户和准备好的新页面的DOM之间,旧数据可用。

基本上我需要一种方法来连接标签的初始导航,理想情况下看看它的位置(就像我在Chrome中一样)。

有什么想法吗?

2 个答案:

答案 0 :(得分:11)

目前无法通过标签检测页面加载。但是,你可以使用page-mods中的start事件来完成它。我也有兴趣以正确的方式做到这一点,所以如果你找到一种不使用page-mods的方法,请点击我:

var pageMod = require("page-mod");
pageMod.PageMod({
    include: "*", // All DOM windows (ie. all pages + all iframes).
    contentScriptWhen: "start", // page starts loading, at this point you have
                                // the head of the document and no more
    contentScript: "", // inject no script, you can even omit this
    onAttach: function onAttach(worker) {
            if (worker.tab.url == worker.url) // test if at top level
                doStuff(worker.tab.url);
            // cleanup the attached worker
            worker.destroy();
        }
    }
);

另外,我不知道onAttach触发器的速度,就像在ff扩展中传递的所有消息一样,它可能会增加一些时间(可能是150ms?如果您对此有基准,请回到我身边)< / p>

答案 1 :(得分:0)

据我所知,这应该捕获所有打开标签,在标签之间切换以及在标签内导航的情况。全局变量url应始终包含活动标签的网址,console.log调用应记录影响该标记的所有事件。

var tabs = require("sdk/tabs");
var url;

var updateURL = function (tab) {
  var oldURL = url;
  url = tab.url;
  console.log(oldURL+" --> "+url);
};

tabs.on("activate", updateURL);
tabs.on("pageshow", updateURL);

updateURL(tabs.activeTab);