Расширение Chrome: путаница при передаче сообщений - PullRequest
4 голосов
/ 24 сентября 2011

Я пытаюсь отправить количество проверенных элементов на странице во всплывающее окно.Кнопка ввода add во всплывающем окне оповещает или отправляет на консоль количество флажков, отмеченных на веб-странице.

Мой сценарий этого не делает, и я подумал, что может возникнуть путаница в отношении того, как работает передача сообщений.Вот что у меня есть:

Манифест:

{
  "name": "A plugin for...",
  "version": "1.0",
  "background_page": "background.html",
  "permissions": [
    "tabs", "http://*/*", "https://", "*"
  ],
  "content_scripts": [
    {
      "matches": ["http://*/*","https://*/*"],
      "js": ["main_content_script", jquery.min.js", "json.js"]
    }
  ],
  "browser_action": {
      "name": "Plugin",
      "default_icon": "icon.png",
      "popup": "popup.html"
  }
}

Popup.html

<html>
<script src="jquery.min.js"></script>
<script>
$(document).ready(function() {

    $('#add').click(function(){
        add();
        alert("add clicked"); 
    });

    $('#save').click(function(){
        alert("save clicked"); 
    });

    $('#delete').click(function(){
       alert("delete clicked"); 
    });
});
</script>

<script>

    //chrome.tabs.sendRequest(integer tabId, any request, function responseCallback)
    //chrome.extension.onRequest.addListener(function(any request, MessageSender sender, function sendResponse) {...}));

    function add(){
       chrome.extension.onRequest.addListener(function(request, sender, sendResponse)
              console.log(request.count); //? nothing in console
        });
</script>

<form action="http://www.xxxxx.com/xxxxx/xxxx/session.php" method="post" enctype="text/plain">
<input type="submit" value="Add" name="add" id="add"/>
<input type="submit" value="Save" name="save" id="save"/>
<input type="submit" value="Delete" name="delete" id="delete"/>
</form>
</html>

main_content_script.js

$(document).ready(function() {

 //var location = window.location.href;
 var checked = $('input:checkbox:checked').length;

    if(checked > 0){

        var values = $('input:checkbox:checked').map(function () {
            //return $(this).parent().next().html(); --> returns the name
            var strong_tag = $(this).parent().next().html();
            var link_tag = $(strong_tag + 'a').html();
            return $(link_tag).attr('href');
            }).get();

    } else {

        return false;

    }

    if(values){
    var count = values.length;
    alert(count + " values selected: " + values);
        chrome.extension.sendRequest({count:count}, function(response) {
            console.log('count sent');  
        });

});

Ответы [ 2 ]

3 голосов
/ 24 сентября 2011

chrome.extension.onRequest не должно использоваться в popup. Это должно использоваться в background page.

Фоновая страница

var count=0;  //"count" is outside of any function
chrome.extension.onRequest(function(request, sender, sendResponse){
          count=request.count;
          console.log(request.count);
});

Всплывающее окно - используйте chrome.extension.getBackgroundPage() для возврата переменной.

var count = chrome.extension.getBackgroundPage().count;  //get it back
alert("There are "+count+" checkboxes checked.");  //Voilà!
2 голосов
/ 24 сентября 2011

Проблема в том, что ваш контент-скрипт отправляет сообщения, но нет активного прослушивателя. Срок действия страницы popup.html начинается с момента нажатия действия браузера до ее исчезновения. Если эта страница не существует, когда вы отправляете запрос, ничто не слушает ваши запросы.

Чтобы решить эту проблему, вы должны настроить прослушиватель (chrome.extension.onRequest.addListener) на фоновой странице (которая сохраняется в течение всего срока службы вашего добавочного номера).

...