4

我试图将页面上选中项目的数量发送到弹出窗口。弹出警报上的add输入按钮或向控制台发送在网页上选中的复选框数量。Chrome扩展程序:消息传递混乱

我的脚本没有这样做,我认为可能会有消息传递的工作方式混淆。以下是我有:

清单:

{ 
    "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

这里的问题是你的内容脚本正在发送消息,但没有活动的监听器。 popup.html页面的生命周期始于浏览器操作被点击直至消失。除非您发送请求时网页恰好存在,否则没有任何内容会听取您的请求。

要解决此问题,您应该在background page(它在您的扩展的生命周期中保留)中设置侦听器(chrome.extension.onRequest.addListener)。

3

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à! 
相关问题