内容和后台脚本之间的 onClick 通信不起作用
onClick communication between content and background scripts not working
我正在制作一个应用程序,在用户单击我的图标后突出显示当前页面中的关键字。我正在尝试在我的内容脚本和后台脚本之间进行通信。但是,我的代码不起作用。有谁知道应该怎么写?
这是我的内容脚本:
chrome.extension.onRequest.addListener(function(active,sender,sendResponse){
if(active.length>0){
jQuery(document).ready(function($) {
//rest of word highlighting code
}
})
这是我的 background.js :
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.extension.sendRequest(active);
});
不要使用已弃用的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 */
}
});
我正在制作一个应用程序,在用户单击我的图标后突出显示当前页面中的关键字。我正在尝试在我的内容脚本和后台脚本之间进行通信。但是,我的代码不起作用。有谁知道应该怎么写?
这是我的内容脚本:
chrome.extension.onRequest.addListener(function(active,sender,sendResponse){
if(active.length>0){
jQuery(document).ready(function($) {
//rest of word highlighting code
}
})
这是我的 background.js :
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.extension.sendRequest(active);
});
不要使用已弃用的
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 */ } });