使用javascript的后台脚本消息传递
我在Google Chrome扩展中进行通信,并使用以下指南: 它以前可以工作,但我遇到了一个错误: 响应选项卡时出错。查询:TypeError:无法读取属性“id” 未定义的 我将我的代码与Google Chrome代码进行了比较,似乎无法找到我的代码产生该错误的原因:使用javascript的后台脚本消息传递,javascript,jquery,google-chrome,google-chrome-extension,communication,Javascript,Jquery,Google Chrome,Google Chrome Extension,Communication,我在Google Chrome扩展中进行通信,并使用以下指南: 它以前可以工作,但我遇到了一个错误: 响应选项卡时出错。查询:TypeError:无法读取属性“id” 未定义的 我将我的代码与Google Chrome代码进行了比较,似乎无法找到我的代码产生该错误的原因: chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { chrome.tabs.sendMessage(t
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[1].id, {fen: request.needMove}, function(response) {
//console.log(response.farewell);
});
});
以下是我将其发送到的位置:
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log("recv FEN : " + FEN);
FEN = request.fen;
setCookie("FEN_SET", "true" , 1);
setFEN(FEN);
});
我不能纠正那个错误,不管我怎么做,它都保持不变。
“cannotreadproperty of undefined”意味着就我所知,“tabs”是未定义的,但我不明白为什么它在谷歌的例子中起作用,而在这里却不起作用
另一个问题:
如果我试图将其发送到选项卡[1],这是否意味着它是位于第二个位置的选项卡,或者我的解释是错误的?
tabs
是通过过滤器的所有选项卡(无论位置如何)的列表
您的查询是{active:true,currentWindow:true}
,因此通常应该只有一个选项卡(因为最多有一个当前窗口正好有一个活动选项卡)
因此您需要第一个元素,即tabs[0]
选项卡[1]
将始终未定义此查询
当
选项卡
为空时,这种情况非常罕见(Chrome在后台运行,没有打开窗口)
但是,在最近的更改中,API将不会返回“开发工具”选项卡。因此,如果您正在调试扩展,并且Dev Tools窗口已打开并处于焦点状态,那么阵列将为空。你应该检查一下。在不熟悉平台的情况下,错误意味着
tabs[1]
未定义,此时调试脚本,看看tabs
的实际内容是什么,完全一样,我复制并粘贴了它以满足我的需要确保浏览器中至少打开了两个选项卡。我的扩展需要两个页面。如果选项卡是数组[0],则chrome.tabs.query({active:true,currentWindow:true},…)
将返回一个空数组。尝试扩大查询范围,使其返回您要查找的所有选项卡。如何选择所有选项卡?空查询{}
阅读文档:最后请注意,窗口中的位置由选项卡的index
属性指示,而不是返回的数组中的位置。如果需要“第二个选项卡”,则需要搜索索引,或者更好地将其包含在查询中。@Xan,您能否更明确地说明调试的有效解决方法?当DevTools选项卡打开时,选项卡返回[]。您将如何检查并执行?@Ovi如果您需要触发依赖于Dev工具中的query
的代码,我将使用setTimeout
将其包装起来,并延迟几秒钟,然后切换到实际窗口。一般来说,在继续访问选项卡[0]
之前,检查选项卡的长度是否为正值更为可靠-通常不会发生这种情况,但如果您正在调试或Chrome在没有活动窗口的情况下运行(例如,Chrome应用程序已打开,但浏览器已关闭),则可能会发生这种情况,您应该做出相应的反应。