Chrome扩展程序,javascript:为什么这次解雇两次?

Rya*_*yan 14 javascript google-chrome google-chrome-extension

我的(测试)Chrome扩展程序中有一个非常简单的代码:

    function test()
    {
    alert("In test!");
    }

   chrome.tabs.onUpdated.addListener(function(tabid, changeinfo, tab) {
    var url = tab.url;
        if (url !== undefined) {

        test();
    }
   });
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么要开test()两次?更重要的是,我如何才能一次点火?

Nik*_*las 33

查看事件发送时的不同状态.我认为,当状态为"加载"或状态为"完成"时,它将被调度一次.如果是这种情况,那么您的问题将通过以下方式解决:

 function test()
    {
    alert("In test!");
    }

   chrome.tabs.onUpdated.addListener(function(tabid, changeinfo, tab) {
    var url = tab.url;
        if (url !== undefined && changeinfo.status == "complete") {

        test();
    }
   });
Run Code Online (Sandbox Code Playgroud)

  • 不,它确实......只是忘了重新加载扩展:))要等3分钟才能接受你的回答...谢谢 (3认同)
  • 可悲的是,我遇到了与@Nikklas相同的问题,并且两次状态都为“完成”。WTF铬? (2认同)
  • 出于澄清目的,它会在有任何更新和不同类型的更新时触发。更新可以是 URL 更改、网站图标、状态等。因此您需要查看 changeinfo 对象以了解它是什么类型的更改。对我来说,我首先检查 changeinfo 是否表示更新是“状态”更改,然后如果选项卡状态为“完成”`if (changeinfo && changinfo.status && tab && tab.status == 'complete')` 我发现了这一点将所有参数打印到控制台后。 (2认同)

kza*_*hel 6

我也对此感到困惑并试图找到答案.只有经过一些实验,我才弄清楚为什么我收到多个"完整"的更新事件,因为我认为这是单页"更新".

如果您的网页包含iframe,则每个网页都会触发"完整"事件并冒泡到父内容脚本.因此,如果更复杂的页面具有iframe,则会触发大量onUpdated事件.