2010-08-24 62 views
1

我在通過背景頁面與多個內容腳本進行通信時遇到問題。我的背景頁面有類似的代碼:鉻擴展後臺頁面應該如何與多個內容腳本進行通信?

chrome.tabs.sendRequest(tabId, { targetScript:"content1" }, function (resp) { 
    if (resp.fromCorrectScript) { 
    DoMoreStuff(); 
    } 
}); 

,我有內容的腳本,如:

// content1.js 
chrome.extension.onRequest.addListener(function (sender, request, sendResponse) { 
    if (request.targetScript === "content1") { 
    sendResponse({ fromCorrectScript:true }); 
    } else { 
    sendResponse({}); 
    } 
}); 

// content2.js 
chrome.extension.onRequest.addListener(function (sender, request, sendResponse) { 
    if (request.targetScript === "content2") { 
    sendResponse({ fromCorrectScript:true }); 
    } else { 
    sendResponse({}); 
    } 
}); 

我的理解是,我在後臺頁面回調應該被稱爲兩次,每個內容腳本一次。看起來它只是有時被調用兩次,並且幾乎只有在if子句中有一個斷點時。我在這裏做錯了什麼?

感謝,

-Greg

回答

0

好吧,它看起來像它正常工作,只要我確保只有一個內容腳本響應該消息。所以,我的內容腳本代碼應該更像:

// content1.js 
chrome.extension.onRequest.addListener(function (sender, request, sendResponse) { 
    if (request.targetScript === "content1") { 
    sendResponse({ fromCorrectScript:true }); 
    } 
}); 

// content2.js 
chrome.extension.onRequest.addListener(function (sender, request, sendResponse) { 
    if (request.targetScript === "content2") { 
    sendResponse({ fromCorrectScript:true }); 
    } 
}); 
0

我不知道什麼是問題的根源,只能猜測,取其腳本運行的回調首先破壞它的休息。

雖然我可以提出解決方法。您可以在兩個方向上發送請求,不僅從背景頁面到腳本。所以,你的背景頁面可能看起來像:

chrome.tabs.sendRequest(tabId, { targetScript:"content1" }); 

chrome.extension.onRequest.addListener(function (request, sender, sendResponse) { 
    if (request.fromCorrectScript) { 
    DoMoreStuff(); 
    } 
}); 

而且在腳本:

chrome.extension.onRequest.addListener(function (request, sender, sendResponse) { 
    if (request.targetScript === "content1") { 
    chrome.extension.sendRequest({fromCorrectScript:true}); 
    } else { 
    chrome.extension.sendRequest({fromCorrectScript:false}); 
    } 
}); 

這不應該嗆。

+0

在過去,我有我的擴展嗆當內容腳本並沒有調用sendResponse回調。我會檢查是否仍然如此。 – Greg 2010-08-24 20:23:53

相關問題