我正在创建一个应用程序,在用户单击我的图标后突出显示当前页面中的关键字。我正在尝试在我的内容脚本和后台脚本之间进行通信。但是,我的代码无效。有谁知道应该怎么写?
这是我的内容脚本:
kind_of? B.singleton_class
这是我的background.js:
chrome.extension.onRequest.addListener(function(active,sender,sendResponse){
if(active.length>0){
jQuery(document).ready(function($) {
//rest of word highlighting code
}
})
答案 0 :(得分:1)
不使用已弃用的chrome.extension.sendRequest
和匹配事件。它们陈旧,破碎且不受支持,文档中非常明确地说明了这一点 - 这表明你没有去阅读它。
正确使用的是chrome.runtime.sendMessage
和.onMessage
,但签名是相同的。
嗯..你为什么期望这样做? (除非你没有真正向我们展示所有相关代码,这是......没有帮助)
chrome.browserAction.onClicked.addListener(function(tab) {
// There is no "active" in the code anywhere to this point.
// It is treated like a variable name, one that was not yet used,
// so its contents are "undefined", and that's what you're sending.
chrome.runtime.sendMessage(active);
// Equivalent code: chrome.runtime.sendMessage(undefined);
});
在接收方:
chrome.runtime.onMessage.addListener(function(active,sender,sendResponse){
// So, here "active" is undefined. It does not have a length
// parameter, and as such causes a fatal exception
// "Cannot read property 'length' of undefined"
// that you might have seen in the console of the page
if(active.length>0){
/* something */
}
})
无论发送什么,通常(但不总是)一个对象(嗯,它必须是JSON可序列化的)。如果您只想触发某些内容并且不传递任何数据,则有两种常用惯例,或者很好:
将命令作为值传递。
// Sender
chrome.runtime.sendMessage({action: "active"});
// Receiver
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
if(message.command == "active"){
/* something */
}
// or, useful if you have many different commands:
switch(message.command){
case "active":
/* something */
break;
}
});
在消息中设置一个布尔值:
// Sender
chrome.runtime.sendMessage({active: true});
// Receiver
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
if(message.active){
/* something */
}
});