我得到了一個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"
]
}
]
}
之前 - 我試圖用長活連接,但我有同樣的問題。爲什麼會發生?
也許你的內容腳本被注入到所有幀中。你能編輯問題並添加manifest.json嗎?順便說一句,每次單擊擴展工具欄圖標時都會添加監聽器,但據推測,由於回調是相同的,Chrome會忽略後續調用。 – wOxxOm
@wOxxOm我剛剛更新了清單問題,我知道如果我將啓動腳本幾次,將添加更多的偵聽器,但我不這樣做,所以這是別的...可以每幀發送自己的消息回到背景?內容腳本代碼根據日誌文件僅觸發一次。 – user2654072
嗯,我會設置在內容和後臺腳本中發送和接收消息的所有行的斷點。你可以做到嗎?或者在某處上傳擴展並將其鏈接到此處? – wOxxOm