0

我正在构建Chrome扩展,并且希望在用户单击上下文菜单后获取当前选定的文本。我试图通过从后台脚本向内容脚本发送消息来做到这一点,但从内容脚本返回的对象始终为空。Chrome扩展消息传递:sendResponse返回空对象

下面是相关代码:

background_script.js:

function onClickHandler(info, tab){ 
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
     chrome.tabs.sendMessage(tabs[0].id, {method: "getSelection"}, undefined, function(response){ 
      console.log(response.data); // <--- this is undefined 
     }); 
    }); 
} 

chrome.contextMenus.onClicked.addListener(onClickHandler); 

content_script.js:

chrome.runtime.onMessage.addListener( 
    function(request, sender, sendResponse) { 
     if (request.method == "getSelection"){ 
      var selection = window.getSelection(); // <--- this is ok 
      sendResponse({data: selection}); 
      return true; 
     } 
    } 
) 

的manifest.json

{ 
    "manifest_version": 2, 

    "name": "Browser Extension", 
    "description": "Browser Extension", 
    "version": "0.1", 

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

    "content_scripts": [ 
     { 
      "matches": ["<all_urls>"], 
      "js": ["content_script.js"] 
     } 
    ], 

    "permissions": [ 
     "activeTab", 
     "contextMenus", 
     "storage" 
    ] 
} 

主要问题相似案例见ms是一个缺失的return true;声明,但我补充说。此外,chrome.tabs.sendMessage函数有一个新参数options,但是忽略它还是传递未定义值或空值都没有区别。

谢谢:)

编辑:chrome.runtime.lastError在SendMessage函数是不确定的所以没有明显的错误!

+1

不要使用undefined作为'chrome.tabs.sendMessage'的第三个参数。简单地消除该参数即:'chrome.tabs.sendMessage(tabs [0] .id,{method:“getSelection”},function(response){' –

+0

谢谢@iván,这就是我在第一时间做到的,不幸的是它无法正常工作:( – squeck

+0

'Selection'是一个复杂的DOM类,它不是JSON'ifiable,所以你需要添加'.toString()' – wOxxOm

回答

0

正如@wOxxOm指出的那样,这里的问题是我试图对一个复杂的对象进行JSON化。添加.toString的作品。我的错!

相关问题