在我的第一個擴展中,我試圖將我的userforum的註釋保存在我自己的基本上可用的MySQL數據庫中。內容腳本/後臺腳本乒乓通信頭痛
現在我陷入了這個問題:我需要一些額外的信息,應該在後臺收集而不'干擾'用戶(同域但HTTPS)。 我試圖用背景頁面中的iframe來做到這一點,應該加載一個頁面在iframe中,然後從那裏收集一些信息,然後再加載另一個頁面,並從那裏收集一些其他信息。我想出了這個:
內容腳本:提交按鈕觸發後臺頁面加載URL中的iframe
背景頁:加載URL在iframe和發送消息,內容腳本,它滿載
內容腳本:接收消息,從iframe 收集信息並將其發送到後臺頁面。然後同樣的事情再次。最後通過$ post將背景頁面信息發送到我的服務器。
事實上,這個乒乓通信不適用於我。 bg.js收到信息但我無法將其發送回內容腳本。可能,我不明白何時腳本準備好接收信息,何時內容腳本從活動選項卡獲取信息,以及何時從後臺腳本中的iframe獲取信息。
我注意到內容腳本在擴展重新加載時從iframe獲取信息。
清單:
{
"manifest_version": 2,
"name": "SaveMyCommenz",
"version": "1.0",
"description": "SMC",
"version": "1",
"browser_action": {
"default_icon": "icons/icon-19.png",
"default_popup": "popup.html"
},
"icons": {
"48": "icons/icon-48.png",
"96": "icons/icon-96.png"
},
"content_scripts": [
{
"matches": ["*://*.example.com/*"],
"js": ["jquery.min.js", "smc.js"],
"run_at": "document_end",
"all_frames": true
}
],
"background": {
"scripts": ["bg.js"]
},
"permissions": [
"http://example.me/*",
"https://example.me/*",
"tabs"
]
}
smc.js(內容腳本)
// ################# MESSAGE PASSING ##########################
document.addEventListener("submit",function(){
// tell bg.js to load site1 in iframe
chrome.runtime.sendMessage('1');
//...
}
chrome.runtime.onMessage.addListener(function(response, sender, sendResponse) {
if (response == '2'){// get Info1
//get info1
var link = document.querySelector("a[href*='permalink']");
// send info1 to bg.js...
//tell bg.js to load 2nd site in iframe
chrome.runtime.sendMessage('3');
}
if (response == '4'){// get Info2
var link = document.querySelector("a[href*='permalink']");
// send info2 to bg.js...
}
});
bg.js(背景腳本)
load_iFrame();
function load_iFrame() {
var iframeX = document.createElement("iframe");
iframeX.setAttribute("src", "https://example.com");
iframeX.style.width = "90%";
iframeX.style.height = "500px";
document.body.appendChild(iframeX);
}
// ################# MESSAGE PASSING ##########################
chrome.runtime.onMessage.addListener(function (response, sender, sendResponse) {
//console.log("in bg.js angekommen: " + response.a);
if (response == '1') {
//chrome.runtime.reload(); // Kommentarseiten laden
// load site 1
window.frames['iframeX'].location = "https://example.com?page=1";
// reload?
// tell content script that site is fully loaded
chrome.tabs.query({
active: true,
currentWindow: true
}, function (tabs) {
chrome.tabs.sendMessage(tabs[0].id, {
"2"
});
});
}
if (response == '3') {
// load site 2
window.frames['iframeX'].location = "http://example.com?page=2";
// reload?
// tell content script that site is fully loaded
chrome.tabs.query({
active: true,
currentWindow: true
}, function (tabs) {
chrome.tabs.sendMessage(tabs[0].id, {
"4"
});
});
}
});
var kom = document.querySelectorAll("a[href*='permalink']");
var i;
const kommentarSta = new Array;
for (i = 0; i < kom.length; i++) {
kommentarSta[i] = kom[i].innerText;
console.log("Kommentar" + i + ": " + kommentarSta[i]);
}
時,我怎麼也得重新加載的頁面或者應該做哪些溝通?
聲明一個單獨的內容腳本,該腳本將被注入到iframe url中。聲明主要內容腳本僅在普通頁面URL(http)中運行。讓你的後臺頁面中繼消息。 – wOxxOm
thx爲答案!我將如何聲明一個內容腳本以在iframe中運行?我的意思是那裏正常運行thx的https頁面! – bimbam
hmm,我在iframe中加載的一個url是https,另一個http ...:/ – bimbam