Chrome扩展程序,javascript:为什么两次触发?

问题描述

| 我的(测试)Chrome扩展程序中有一些非常简单的代码
    function test()
    {
    alert(\"In test!\");
    }

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

        test();
    }
   });
我的问题是,为什么ѭ1开两次枪?更重要的是,如何使它一次点火?     

解决方法

        看一下事件分派时的不同状态。我认为,当状态为“正在加载”或状态为“完成”时,它将被调度一次。如果是这种情况,那么您的问题将得到解决:
 function test()
    {
    alert(\"In test!\");
    }

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

        test();
    }
   });
    ,        我对此也感到困惑,并试图找到答案。只有经过一些实验,我才弄清楚为什么我收到了我认为是单个页面“ update”的多个“ complete”更新事件。 如果您的网页上有iframe,则每个iframe都会触发一个“ complete \”事件并冒泡至父级内容脚本。因此,如果更复杂的网页具有iframe,则会触发一系列onUpdated事件。     ,        当您编写以下代码时:
chrome.tabs.onUpdated.addListener(function(tabid,tab) {
    var url = tab.url;
        if (url !== undefined) {

        test();
    }
});
您正在呼叫
addListener
,并告诉它不立即而是在更新选项卡时立即呼叫
test()
。标签页更新事件由Chrome浏览器本身广播,从而导致您的“ 1”代码运行。     ,        我知道这很老,但无论如何...这也在我身上发生,也许这可以对某人有所帮助。查看处理程序函数正在接收的Tab对象,我发现两个调用的favIconUrl属性是不同的,因此尽管我不知道其背后的原因,但我猜想它与此有关。 我认为这是一个错误,但是经过一番思考和一些测试之后,我放弃了错误理论。 到目前为止,我所知道的是,如果更改了两个属性,则每次使用包含一个属性的changeInfo对象触发事件两次。换句话说,例如,如果更改的属性是status和favIconUrl,则
changeInfo = {status:\"complete\"};
然后在下一个电话
changeInfo = {favIconuUrl : \".... whatever ...\"};
    ,        我通过在更新时检查选项卡的标题来解决此问题:
chrome.tabs.onUpdated.addListener(function (tabId,changeInfo,tab) {

var title = changeInfo.title;
    if (title !== undefined) {
       doSomething();
    }
});
    ,        两次是由于状态加载一次且状态完成一次。 如果您不关心状态,也可以尝试onCreated事件。那将被解雇一次!