2015-10-26 101 views
3

我得到了一個Chrome擴展程序是這樣的:如果它們出現的背景中打開新的標籤頁與頁Y和做一些頁面自動化Chrome擴展的背景消息監聽器觸發了兩次

背景更改每隔幾秒鐘檢查對象X, (在基於ajax的頁面中填寫調查)。頁面自動化由內容腳本完成。內容腳本需要向後臺請求獲得開始工作的權限。它通過發送消息並等待回覆來實現。當內容腳本完成它的工作時,它會將消息發送給後臺,並提供有關是否成功的信息。當失敗選項卡應該用新鏈接更新時,應關閉成功選項卡。問題是,有時候 - 並非總是如此,免費獲得消息兩次。一次 - 當標籤失敗時它是工作,第二次是在標籤更新爲新鏈接後。我希望我能知道爲什麼...

下面是腳本:

Background.js聽衆創作時,用戶開始從上下文菜單腳本

function create_listerner(){ 
    chrome.runtime.onMessage.addListener(
     function(request, sender, sendResponse) { 
      switch(request.greeting){ 
       case "site_opened": 
        if (sender.tab.id == tabId) { 
         sendResponse({ 
          farewell : "go" 
         }); 
        } else { 
         sendResponse({ 
          farewell : "stop" 
         }); 
        } 
        break; 
       case "imDoneWithSuccess": 
        //update tab logic 
        break; 
       case "imDoneWithFail": 
        //close tab logic 
        actNgo(url,arr); 
        break; 
      } 
     }); 
} 

監聽器調用時一次:background.js

chrome.contextMenus.create({ 
    title : "Start", 
    contexts : ["browser_action"], 
    onclick : function() { 
     create_listerner(); 
    } 
}); 

標籤更新看起來很簡單:background.js

function actNgo(url,arr){ 
    chrome.storage.local.set({ 
     array : arr, 
     ndz : 1 
    }, function() { 
     chrome.tabs.update(
      tabId, 
      { 
       "url" : url, 
       "active" : false 
      }, function (tab) { 
       console.log("tabId "+tabId); 
      }); 
    }); 
} 

內容腳本注入到網站,網站不會重新加載的是基於AJAX,即使 - 消息不能沒有適當的條件下滿足發送

content.js

function SR(st) { 
    var status ; 
    if(st){ 
     status = "imDoneWithSuccess"; 
    } else { 
     status = "imDoneWithFail"; 
    } 
    chrome.runtime.sendMessage({ 
     greeting : status 
    }, function (response) { 
    }); 
} 

內容腳本應該工作只在標籤上顯示bacground.js

function askForPermission() { 
    chrome.runtime.sendMessage({ 
     greeting : "site_opened" 
    }, function (response) { 
     if (response.farewell == 'go') { 
      start(); 
     } else { 
      console.log("bad tab"); 
     } 
    }); 
} 

再次 - 他們不可能自己開火。

日誌文件看起來像這樣:

Background: tab created; 
content script: askForPermission(); <-sends message asking for permission to start 
Bacground: go <- allows. 
content script: (content script logs, working as intended) 
Background listener: imDoneWithFail; 
Background update tab; 
background listener: imDoneWithFail; <- shouldn't happen, doesn't look like it conten't script even started to work as it didn't ask for permission. Looks like listener is fired up twice... 
Background update tab; 
content script: askForPermission(); <-sends message asking for permission to start 
Bacground: go <- allows. 

編輯:有人問清單

{ 
    "name": "Test script", 
    "version": "0.0.78", 
    "manifest_version": 2, 
    "background": { 
     "scripts": ["src/background/background.js"] 
    }, 
    "icons": { 
    "19": "icons/icon19.png" 
    }, 
    "default_locale": "en", 
    "options_ui": { 
    "page": "src/options/index.html", 
    "chrome_style": true 
    }, 
    "browser_action": { 
    "default_icon": "icons/icon19.png", 
    "default_title": "Test", 
    "default_popup": "src/browser_action/browser_action.html" 
    }, 
    "permissions": [ 
    "http://localhost/survey/*", 
    "storage", 
    "contextMenus", 
     "tabs", 
     "webRequest" 
    ], 
    "content_scripts": [ 
    { 
     "matches": [ 
     "http://localhost/survey/*", 
     "https://localhost/survey/*" 
     ], 
     "js": [ 
     "js/jquery/jquery.min.js", 
     "src/inject/content.js" 
     ] 
    } 
    ] 
} 

之前 - 我試圖用長活連接,但我有同樣的問題。爲什麼會發生?

+0

也許你的內容腳本被注入到所有幀中。你能編輯問題並添加manifest.json嗎?順便說一句,每次單擊擴展工具欄圖標時都會添加監聽器,但據推測,由於回調是相同的,Chrome會忽略後續調用。 – wOxxOm

+0

@wOxxOm我剛剛更新了清單問題,我知道如果我將啓動腳本幾次,將添加更多的偵聽器,但我不這樣做,所以這是別的...可以每幀發送自己的消息回到背景?內容腳本代碼根據日誌文件僅觸發一次。 – user2654072

+0

嗯,我會設置在內容和後臺腳本中發送和接收消息的所有行的斷點。你可以做到嗎?或者在某處上傳擴展並將其鏈接到此處? – wOxxOm

回答

1

好吧,我發現了一個答案,問題是功能改變標籤的網址。

function actNgo(url,arr){ 
    chrome.storage.local.set({ 
     array : arr, 
     ndz : 1 
    }, function() { 
     chrome.tabs.update(
      tabId, 
      { 
       "url" : url, 
       "active" : false 
      }, function (tab) { 
       console.log("tabId "+tabId); 
      }); 
    }); 
} 

功能,給予時相同的網址目前沒有刷新選項卡,內容腳本不能火起來的新...不過不知道爲什麼監聽器發射了兩次郵件,但因爲我的改變它已經停止。

我不知道這個修補程序是否會幫助任何人,但我通過首先將標籤網址更改爲空白,然後更改爲新的來解決此問題。

chrome.tabs.update(
     tabId, 
     { 
      "url" : "about:blank", 
      "active" : false 
     }, function (tab) { 
      console.log("bcgr: aktualizujStroneIObstaw: pusta: tabId "+tabId); 
      chrome.tabs.update(
       tabId, 
       { 
        "url" : url_beta, 
        "active" : false 
       }, function (tab) { 
        console.log("bcgr: aktualizujStroneIObstaw: wlasciwa: tabId "+tabId); 

       } 
      );