【问题标题】:Firefox addon-sdk - listen for page navigationFirefox addon-sdk - 监听页面导航
【发布时间】:2012-02-27 07:56:32
【问题描述】:

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

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

我是 Chrome,当标签更改 URL 时,我可以使用:

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

在 Firefox 中使用我尝试过的插件 SDK:

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

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

基本上,我需要一种方法来挂钩选项卡的初始导航,并在理想情况下查看它的去向(就像我在 Chrome 中一样)。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    目前无法检测带有标签的页面加载。但是,您可以使用 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 扩展中传递的消息一样,它可能会增加一些时间(可能是 150 毫秒?如果你有这方面的基准,请回复我)

    【讨论】:

    • 感谢您的回答,我将不得不试一试。看起来它会做我想做的事(尽管是以迂回的方式)。希望 FF 将来会实现更正确的 API。
    • @AdamHeath 是的,如果 Mozilla 和 Chromium 的人就通用 API 达成一致,编写规范的 HTML5 流程样式,那就太好了。
    【解决方案2】:

    据我所知,这应该捕获所有打开选项卡、在选项卡之间切换和在选项卡内导航的情况。全局变量 url 应始终包含活动选项卡的 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);
    

    【讨论】:

    • 我认为“url = tab.url”这一行应该在console.log输出之上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多