Chrome Extension v3中chrome.scripting.executeScript签名匹配错误求助
Chrome Extension v3 中 chrome.scripting.executeScript 签名不匹配错误修复
问题描述
在Chrome Extension v3应用中,将chrome.tabs.executeScript替换为chrome.scripting.executeScript后,出现**“No matching signature”**错误,无法正常执行脚本注入。
Manifest 配置
{ "name": "OkBot", "description": "OkBot is used as a Personal Asistant.", "version": "1.1", "manifest_version": 3, "content_security_policy": { "extension_pages": "script-src 'self'; object-src 'self'" }, "minimum_chrome_version": "88", "offline_enabled": false, "icons": { "48": "web/images/icon_48.png", "128": "web/images/icon_128.png" }, "action": { "default_icon": { "19": "web/images/icon_19.png", "38": "web/images/icon_38.png" }, "default_title": "OkBot", "default_popup": "popup.html" }, "permissions": [ "idle", "power", "management", "storage", "tabs", "activeTab", "topSites", "scripting" ], "host_permissions": [ "*://*/*", "<all_urls>" ], "optional_permissions":[ ], "options_page": "options.html", "background":{ "service_worker":"web/js/background.js" }, "content_scripts": [ { "js": ["web/js/content_script.js"], "matches": ["<all_urls>", "*://*/*"] } ] }
出错的 OkBot.js 脚本
chrome.scripting.executeScript(tabs[0].id, {file: "web/js/storage.js"}, function() { if(chrome.runtime.lastError) chrome.scripting.executeScript(tabs[0].id, {file: "web/js/content.js"}, function() { if(chrome.runtime.lastError) { console.error(chrome.runtime.lastError.message); } else { setTimeout(function(){ send_to_content(obj); // 注入content.js后再次调用send_to_content(obj) }, 300); } }); });
错误信息
TypeError: 调用scripting.executeScript(scripting.ScriptInjection injection, optional function callback)时出错:无匹配的签名。
修复方案
Chrome Extension v3 中chrome.scripting.executeScript的参数格式与旧版chrome.tabs.executeScript完全不同,核心错误是参数传递不符合API要求:
- 旧版第一个参数直接传tabId,新版需要将tabId放在
target对象内 - 注入脚本的参数从
file改为files(数组格式,支持多文件注入)
修改后的正确代码:
chrome.scripting.executeScript({ target: {tabId: tabs[0].id}, files: ["web/js/storage.js"] }, function() { if(chrome.runtime.lastError) { chrome.scripting.executeScript({ target: {tabId: tabs[0].id}, files: ["web/js/content.js"] }, function() { if(chrome.runtime.lastError) { console.error(chrome.runtime.lastError.message); } else { setTimeout(function(){ send_to_content(obj); // 注入content.js后再次调用send_to_content(obj) }, 300); } }); } });
关键修改点
- 第一个参数改为包含
target属性的对象,target内指定tabId - 将
file改为files,值为数组类型(即使只注入单个文件也需要用数组)
内容的提问来源于stack exchange,提问作者DillGates
相关产品推荐
相关产品推荐

