为什么我的Chrome扩展内容脚本的运行时没有onMessage,只有connect和sendMessage。
为什么我的Chrome扩展内容脚本的运行时没有onMessage,只有connect和sendMessage。
我已经努力了几天,似乎我的扩展程序的内容脚本缺少权限或其他问题,我已经在API文档中搜索了很久,但没有找到答案。
如果我从内容页面发送消息,通信是有效的,但如果我使用以下代码将消息发送到内容页面,就会出现问题:
从后台页面:
var messageCallback = function (e) { var nodeMessage = JSON.parse(e.data); switch (nodeMessage.ExecutionType) { case 0: chrome.tabs.create({ url: nodeMessage.Url }, function (tab) { //injects injected.js NOT messages.js injectCode(tab.id); chrome.tabs.sendMessage(tab.id,nodeMessage); }); break; //其他的switch case...
从内容脚本:
chrome.runtime.onMessage.addListener(function (message) { console.log('Message received'); var event = new CustomEvent("foo_receive", { detail: message, bubbles: true }); console.log('Event sent'); document.dispatchEvent(event); });
我的清单文件如下:
{ "manifest_version": 2, "name": "扩展名", "short_name": "名称", "description": "长句子", "version": "1.0.0", "icons": { "16": "icon16.png", "48": "icon48.png", "128": "icon128.png" }, "permissions": ["background", "tabs", "" ], "background": { "scripts": ["background.js"], "persistent": true }, "content_scripts":[ { "matches": [" "], "js": ["messages.js"], } ], "web_accessible_resources": ["injected.js"] }
在Chrome控制台中显示以下内容:
内容脚本:
后台页面:
问题出现的原因是injectCode函数是异步的。浏览器不等待它完成,而是继续执行后台脚本,发送消息给尚未存在的内容脚本。然后injectCode函数完成,但为时已晚。
解决方法是使用回调选项,确保在执行完脚本后再发送消息。需要重新编写injectCode函数以跟踪nodeMessage。
以下是修复后的代码示例:
function injectCode(tabId) { chrome.tabs.executeScript(tabId,{"file":"contentScript.js"}, function() { chrome.tabs.sendMessage(tabId,nodeMessage); }); }
通过使用回调函数,可以确保在执行完脚本后再发送消息,从而解决了问题。