2012-05-01 2 views
4

У меня есть расширение, с фоном сценария:Как мне установить связь между background.js и popup.js?

"background": { 
    "scripts": ["scripts/background.js"] 
    }, 

и сценарий содержания:

"content_scripts": [ 
    { 
     "matches": ["*://*/*"], 
     "js": ["scripts/content_script.js"] 
    } 
    ], 

всплывающее окно (popup.html) и всплывающий сценарий (popup.js). popup.js не регистрируется в манифесте, и он имеет дело с popup.html look и прослушивает действия пользователя, сделанные в popup.html, например, нажатие кнопки.

Я хочу сделать расширение, какие письма на текущей вкладке Страница, и для этого мне нужно, чтобы получить страницу DOM с content_script, передавать данные (DOM) к background script. После этого, когда пользователь запускает событие в popup.html, popup.js ловит это событие, и я хочу, чтобы popup.js мог получить переданные данные (DOM) из background.js. Как я могу это сделать? Итак, мой вопрос: как мне установить связь между background.js и popup.js?


Я нашел ответ на мой собственный вопрос:

Благодаря Elvis, я думаю, что решить эту проблему; Мне нужно только, чтобы получить DOM сайта в сценарии контента, но решение на мой вопрос был таков:

content_script.js

// SEND DOM structure to the background page 
    chrome.extension.sendRequest({dom: "page DOM here"}); 

background.html

<html> 
<head> 
<script> 
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    if(request.dom != "") 
     var theDOM = request.dom; 
     console.log(request.dom); // page DOM here -> works 
     chrome.extension.sendRequest({theDOM: theDOM}); // theDOM : "page DOM here" 
}); 
</script> 
</head> 
<body> 
</body> 
</html> 

всплывающее окно .js

var dom; 
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    if(request.theDOM != ""){ 
     console.log("popup request: "+request.theDOM); 
     dom = request.theDOM; 
    } 
}); 

// HANDLE TAB_1 REQUESTS (EMAIL PAGE) 
// --------------------------------- 
$("#send").click(function(){ 
    console.log(dom); // page DOM here 
} 

Спасибо за помощь;)

ответ

4

Вы можете выполнять передачу сообщений. Из documentation:

использовать это в вашем сценарии содержания:

chrome.extension.sendRequest({greeting: "hello"}, function(response) { 
    console.log(response.farewell); 
}); 

Он посылает {greeting: "hello"} на задний план. Обратите внимание на функции обратного вызова, указанный

Фоновая страница может слушать эти запросы с помощью:

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) { 
    if (request.greeting == "hello") 
     sendResponse({farewell: "goodbye"}); 
    }); 

Аргументов функции sendResponse будет передан в функцию обратного вызова

+0

Спасибо, я уже читал эту статью в документации , и уже вставлен в мой код, но две проблемы все еще существуют - это только обмен сообщениями между 'contentscript' и' backgroundscript', а не между 'backgoundscript' и' popup.js'. Обратите внимание: у меня есть 3 скрипта, 1 контент, 1 фон и 1 для редактирования popup.htmls. - другая проблема, что в консоли, я не вижу предупреждения/текста, поэтому разбор сообщений не работает на меня. -> Мне нужно вызвать событие для отправки запроса? –

+0

Когда событие запускается во всплывающем окне, вы можете обмениваться информацией с фоном так же, как указано в ответе (т. Е. С помощью chrome.extension.sendRequest), и фон может возвращать нужные ему данные. –

+0

Ох, как только я сменил background.js на background.html, разбор сообщений начал работать, одна проблема решена :) ** Элвис **: хорошо, я даю ему попробовать, спасибо –

Смежные вопросы