1

私はクロム拡張を作成しています。私の背景のスクリプトにはaddListenerがありますが、それはonUpdated.addListenerであっても2回以上発生しています。 changeInfo.status == 'complete'がいつチェックされるかを確認するif文を追加しましたが、何度も何度も起動します。私はGoogle Chromeにこれと関係していたバグがあることを知っていますが、それは数年前です。どんな解決策ですか?前もって感謝します。ここでchrome.tabs.onUpdated.addListenerが複数回発生する

は私background.jsです:ここでは

// Get the behavior of the plugin; the default is set to "onClick", the other option is "alwaysOn" 
chrome.storage.sync.get({ 
extensionBehavior: 'onClick' 
}, function(items) { 
    if(items.extensionBehavior == 'onClick'){ 
     chrome.browserAction.onClicked.addListener(function() { 
      // When the extension icon is clicked, send a message to the content script 
      chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
       chrome.tabs.sendMessage(tabs[0].id, {"message": tabs[0].url}, function(response){}); 
      }); 
     }); 
    } 
    else { 
     chrome.browserAction.setBadgeText({text:"auto"}); 
     chrome.tabs.onCreated.addListener(function (tab) { 
      chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { 
       if (tab.status == 'complete') { 
        chrome.tabs.sendMessage(tabId, {"message": tab.url}, function(response){}); 
       } 
      }); 
     }); 
    } 
}); 

は私のmanifest.jsonを次のとおりです。

{ 
"manifest_version": 2, 
"name": "My Extension", 
"version": "1.2.1", 
"description": *redacted for privacy reasons*, 
"content_scripts": [{ 
    "matches": [ 
     "<all_urls>" 
    ], 
    "js": ["content_script.js", "jquery-2.2.4.js"] 
    } 
], 
"background": { 
    "scripts": ["background.js"] 
}, 
"options_ui": { 
    "page": "options.html" 
}, 
"browser_action": { 
    "default_icon": "blue-logo.png" 
}, 
"permissions": [ 
    "storage", 
    "activeTab", 
    "tabs" 
] 
} 

私は私のonCreatedonUpdated内部を持っているなぜあなたは迷っている場合ので、それはですonCreatedは単独では機能しませんでした。以前に作成されたタブも更新されました(タブを作成し、URLに移動してからそのタブで別のURLに移動するなど)。私は最初にchangeInfo.statusをチェックしていましたが、それが動作しないときに私はtab.statusに変更しましたが、これらは同じ変数ではありませんか?どちらも同じような行動を起こしているようです(発砲しないと発砲します)。

答えて

1

あなたはchrome.tabs.onUpdatedにタブが作成されるたびに新しいリスナーを追加している:

chrome.tabs.onCreated.addListener(function (tab) { 
    chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { 
     ... 

あなたは3つのタブを作成する場合は、あなたのunUpdatedリスナーが一つのタブが更新された3回のいずれかの時間と呼ばれることを意味します。 onUpdatedコールバックには同じ名前のパラメータが使用されるため、onCreatedイベントのtabパラメータも無視されます。

あなたは両方のイベントに耳を傾ける必要がある場合は、個別に各リスナーを追加する必要があります

chrome.tabs.onCreated.addListener(function (tab) { 
    ... 
}); 
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { 
    ... 
}); 
+1

質問、私は新しいタブを作成した場合、リスナーがあるため 'onCreated'の火災ではなくなりますでしょう新しく作成されたタブの読み込みが完了したら、 'onUpdated'のために起動しますか? @mgiuffrida EDIT:Nevermind!それは魅力のように機能します、ありがとう! –

関連する問題