Javascript background.js和内容脚本之间的通信?响应未定义
从内容脚本:Javascript background.js和内容脚本之间的通信?响应未定义,javascript,jquery,google-chrome-extension,Javascript,Jquery,Google Chrome Extension,从内容脚本: chrome.runtime.sendMessage({ type: "getFormatOption" }, function (response) { return response === 'csv'; }); 我已经在控制台中检查过:background.js方法的SendResponse()中使用的值是OK。问题是响应总是未定义的。我做错了什么 background.js: chrome.runtime.onMessage.addListener( fu
chrome.runtime.sendMessage({ type: "getFormatOption" }, function (response) {
return response === 'csv';
});
我已经在控制台中检查过:background.js方法的SendResponse()中使用的值是OK。问题是响应总是未定义的。我做错了什么
background.js:
chrome.runtime.onMessage.addListener(
function (message, sender, sendResponse) {
switch (message.type) {
case 'getFormatOption':
var response = $('input[name=csvOrEnter_radio]:checked', '#csvOrEnter_form').val();
console.log('formatOption: ' + response);
sendResponse(response);
break;
case 'getFilteringStrategy':
var response = $('input[name=filteringStrategy_radio]:checked', '#filteringStrategy_form').val();
console.log('filteringStrategy: ' + response);
sendResponse(response);
break;
default:
console.error('Unrecognised message: ', message);
}
}
);
我从plugin popup.html的单选按钮中获取一些值的想法
舱单:
{
// default for the latest version of Chrome extensions
"manifest_version": 2,
// extension related general info
"name": "FB Interest Search Tool",
"short_name": "FB Interest Search Tool",
"description": "FB Interest Search Tool",
"version": "1.0.0",
"default_locale": "en",
// sets path to popup files
"browser_action": {
"default_icon": "img/128.png",
"default_popup": "popups/popup.html",
"default_title": "FB Interest Search Tool"
},
// sets path to content scripts and when they are injected onto the page
"content_scripts": [
{
"matches": [ "http://*/*", "https://*/*" ],
"css": [ "styles/styles.css" ],
"js": [
"bower_components/jquery.min.js",
"bower_components/jquery.cookie.js"
]
}
],
// sets path to background scripts
"background": {
"scripts": [
"bower_components/jquery.min.js",
"bower_components/jquery.cookie.js",
"bg/background.js",
"content-scripts/rewriteStorage.js"
]
},
"permissions": [
"activeTab",
"http://*/",
"https://*/",
"file:///*/*",
"<all_urls>",
"tabs",
"storage",
"unlimitedStorage",
"storage",
"cookies"
],
"web_accessible_resources": [ "styles/commentblocker_on.css" ]
}
{
//最新版本的Chrome扩展的默认设置
“清单版本”:2,
//与扩展相关的一般信息
“名称”:“FB兴趣搜索工具”,
“短名称”:“FB兴趣搜索工具”,
“说明”:“FB兴趣搜索工具”,
“版本”:“1.0.0”,
“默认语言环境”:“en”,
//设置弹出文件的路径
“浏览器操作”:{
“默认图标”:“img/128.png”,
“默认弹出窗口”:“popups/popup.html”,
“默认标题”:“FB兴趣搜索工具”
},
//设置内容脚本的路径以及将其注入页面的时间
“内容脚本”:[
{
“匹配项”:[“http://*/*”,“https://*/*”],
“css”:[“styles/styles.css”],
“js”:[
“bower_components/jquery.min.js”,
“bower_components/jquery.cookie.js”
]
}
],
//设置后台脚本的路径
“背景”:{
“脚本”:[
“bower_components/jquery.min.js”,
“bower_components/jquery.cookie.js”,
“bg/background.js”,
“内容脚本/rewriteStorage.js”
]
},
“权限”:[
“活动标签”,
“http://*/”,
“https://*/”,
“文件://*/*”,
"",
“标签”,
“存储”,
“无限制存储”,
“存储”,
“饼干”
],
“web可访问资源”:[“styles/commentblocker\u on.css”]
}
问题1:它被称为background.js
。
我一点也没开玩笑。也许有一点
由于它既包含在弹出窗口中,又作为后台脚本,因此注册了两个消息侦听器。以及:
注意:如果多个页面正在侦听onMessage
事件,则只有第一个调用特定事件的sendResponse()
才能成功发送响应。对该事件的所有其他响应将被忽略
猜猜谁先回答?我的赌注在后台,因为它首先注册了侦听器
如果您尝试调试,您仍然可以在弹出窗口中看到侦听器执行,但是由于后台已经应答,因此它的sendResponse
被忽略
这个问题很容易解决:复制一个副本,调用它popup.js
,并在两者中只保留相关的逻辑。不要在两个位置都包含相同的文件,除非您100%确定代码需要在两个位置都运行
问题2:弹出窗口是致命的。
当弹出窗口关闭时,它就死了,吉姆。它根本不存在:听众和单选按钮都不存在。因此,它无法回答该消息
要解决这一问题,需要重新设计体系结构。只有两个地方可以提供您随时可以查询的存储:
- 背景页。它需要以非所选元素的方式保存状态,弹出窗口需要通知状态的更改
- 。弹出窗口和内容脚本都可以对其进行读/写操作
background.js
。
我一点也没开玩笑。也许有一点
由于它既包含在弹出窗口中,又作为后台脚本,因此注册了两个消息侦听器。以及:
注意:如果多个页面正在侦听onMessage
事件,则只有第一个调用特定事件的sendResponse()
才能成功发送响应。对该事件的所有其他响应将被忽略
猜猜谁先回答?我的赌注在后台,因为它首先注册了侦听器
如果您尝试调试,您仍然可以在弹出窗口中看到侦听器执行,但是由于后台已经应答,因此它的sendResponse
被忽略
这个问题很容易解决:复制一个副本,调用它popup.js
,并在两者中只保留相关的逻辑。不要在两个位置都包含相同的文件,除非您100%确定代码需要在两个位置都运行
问题2:弹出窗口是致命的。
当弹出窗口关闭时,它就死了,吉姆。它根本不存在:听众和单选按钮都不存在。因此,它无法回答该消息
要解决这一问题,需要重新设计体系结构。只有两个地方可以提供您随时可以查询的存储:
- 背景页。它需要以非所选元素的方式保存状态,弹出窗口需要通知状态的更改
- 。弹出窗口和内容脚本都可以对其进行读/写操作
对于选项,第二个选项更可取。那么
background.js
与您的popup.html
有什么关系?@Xan('input[name=filteringStrategy_radio]:checked','filteringStrategy_form')。val()它完美地读取了我单选按钮的值。很好用。我已经测试过了。您的意思是说background.js
包含在您的popup.html
中*气喘吁吁,就是这样。。语义肮脏。我的观点是,如果它不是(专门)用作后台脚本,那么它应该被称为除background.js
之外的任何名称。当弹出窗口未显示时是否会发生错误?弹出窗口只能在显示时收听消息。当它关闭时,它的内容和监听器都会被破坏。background.js
与你的popup.html
有什么关系?@Xan('input[name=filteringStrategy\u radio]:checked','filteringStrategy\u form')。val()它完美地读取了我单选按钮的值。很好用。我已经测试过了。您的意思是说background.js
包含在您的popup.html
中*气喘吁吁,就是这样。。我的观点是,如果它不是(专门)用作背景脚本,它应该