Javascript tabs.executeScript()未在扩展的内容页中注入脚本
我刚刚开始学习如何在firefox中创建自己的插件。我使用的是webExtensions,尽管我发现很难获得全面的文档(我想是因为它还是一个新的实现?)。代码似乎都工作正常,并且在executeScript调用后完成了一个“onExecuted”函数。但是我的注入脚本(output.js)似乎没有启动。运行代码后,javascript控制台中出现以下错误:“没有匹配的消息处理程序”。我不确定注入的脚本应该是一个自包含的js文件,还是只是js命令的集合。我也尝试了后者(只是一个简单的消息框),但也没有成功 我的代码: manifest.json:Javascript tabs.executeScript()未在扩展的内容页中注入脚本,javascript,firefox-addon,firefox-addon-webextensions,Javascript,Firefox Addon,Firefox Addon Webextensions,我刚刚开始学习如何在firefox中创建自己的插件。我使用的是webExtensions,尽管我发现很难获得全面的文档(我想是因为它还是一个新的实现?)。代码似乎都工作正常,并且在executeScript调用后完成了一个“onExecuted”函数。但是我的注入脚本(output.js)似乎没有启动。运行代码后,javascript控制台中出现以下错误:“没有匹配的消息处理程序”。我不确定注入的脚本应该是一个自包含的js文件,还是只是js命令的集合。我也尝试了后者(只是一个简单的消息框),但也
{
"manifest_version": 2,
"name": "ExportTabs",
"version": "0.9",
"description": "Export/Import Tabs",
"icons": {
"48": "icons/export48.png"
},
"permissions": [
"tabs",
"activeTab",
"<all_urls>"
],
"applications": {
"gecko": {
"id": "938745934875@example.com"
}
},
"browser_action": {
"default_icon": "icons/export.png",
"default_popup": "popup/popup.html"
}
}
新创建的选项卡的output.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div>testing stuff</div>
<div id="output"></div>
</body>
</html>
我应该补充一点,我有noscript插件,所以我用“全局允许脚本”尝试了一下,它仍然给出了相同的错误。
为任何帮助干杯
编辑:我尝试用code:'alert(“hello”);'替换executeScript方法中的文件:“popup/output.js”
代码>但它仍然不起作用
从OP发布的答案中移动的信息:
碰撞我在另一个带有ff50.something(beta通道)的盒子上试用了这段代码,注入甚至没有使“onExecuted”。但它不会抛出任何错误。基本上,弹出窗口工作,然后什么也没有发生 个人问题分析
问题“没有匹配的消息处理程序”
在49之前的Firefox版本中,显示消息“没有匹配的消息处理程序”是一个已知的错误。该bug被记录为
问题“executeScript
未注入脚本”
在49+版本中,由于以下原因,它仍然不起作用:
您只能将代码插入到其URL可以使用
匹配模式:意味着其方案必须是“http”、“https”之一,
“文件”、“ftp”。这意味着您不能将代码注入任何
浏览器的内置页面,例如关于:调试、关于:插件或
打开新的空选项卡时打开的页面
因此,您不能使用tabs.executeScript()
将脚本注入从您自己的扩展加载的内容中。当我将从扩展加载页面替换为从web加载页面时,该示例会起作用:
function save()
{
chrome.tabs.create({"url": "https://en.wikipedia.org/wiki/Bacon"}, onCreated);
}
当您希望在从扩展插件加载的页面中执行代码时,可以通过在内容页面中加载脚本文件直接执行JavaScript
如果需要将参数传递给加载内容页内的脚本,可以在打开选项卡的脚本和打开选项卡内的脚本之间发送消息
请参阅上的“与后台脚本通信”一章。虽然文档专门针对清单文件中的“内容脚本”,但有关通信的解释也适用于您的情况
示例代码:
在popup.js
中执行函数保存
function onCreated(newTab)
{
// Use setTimeOut to give the loaded page some time to register the message listener
setTimeout(onCreatedInner, 500);
function onCreatedInner()
{
console.log("oncreated " + " " + newTab.id);
chrome.runtime.sendMessage(42);
}
}
output.js
:
chrome.runtime.onMessage.addListener(notify);
function notify(message)
{
window.alert(message);
}
var elem = document.getElementById("buttonSave");
elem.onclick = save;
问题“弹出窗口中的JavaScript代码未执行”
在您朋友的设置中,您遇到了一个不同的问题:默认情况下,您不允许在Firefox的web扩展的内容页中使用内联脚本。您应该在浏览器控制台中看到错误
内容安全策略:页面设置阻止加载
自身资源
因此,不要使用带有保存按钮的内联“onclick”,而是从JavaScript脚本中动态分配onclick事件。如何更改弹出窗口.html
:
<button onclick="save" id="buttonSave">Save Tabs</button>
<button >View Tabs</button>
完整的工作示例 以下是按预期工作的完整最小示例代码: 文件
manifest.json
{
"manifest_version": 2,
"name": "ExportTabs",
"version": "0.9",
"description": "Export/Import Tabs",
"icons": {
"48": "icons/export48.png"
},
"permissions": [
"tabs",
"activeTab",
"<all_urls>"
],
"applications": {
"gecko": {
"id": "938745934875@example.com"
}
},
"browser_action": {
"default_icon": "icons/export.png",
"default_popup": "popup/popup.html"
}
}
文件popup.js
// Register onclick-Event for Save Button
var elem = document.getElementById("buttonSave");
elem.onclick = save;
function save()
{
chrome.tabs.create({"url": chrome.extension.getURL("popup/output.html")}, onCreated);
}
function onCreated(newTab)
{
// Use setTimeOut to give the loaded page some time to register the message listener
setTimeout(onCreatedInner, 500);
function onCreatedInner()
{
chrome.runtime.sendMessage(42);
}
}
// register message handler
chrome.runtime.onMessage.addListener(notify);
function notify(message)
{
// Write message into page
var elem = document.getElementById("output");
elem.innerText = message;
// Show alert
window.alert(message);
}
文件output.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div>
<button onclick="save" id="buttonSave">Save Tabs</button>
<button >View Tabs</button>
</div>
<script src="popup.js"></script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div>testing stuff</div>
<div id="output"></div>
</body>
<script src="output.js"></script>
</html>
谢谢你。没什么问题。FF50甚至不会创建新选项卡,更不用说加载任何内容了。我对popup.js使用了以下命令:
code
function save(){chrome.tabs.create({“url”:“})}另一个问题是,据我所知,您只能在内容脚本和背景脚本之间通信,而不能通过output.html代码加载脚本。但我无法加载内容脚本,因为它只接受您所述的有限匹配模式。My output.html是一个本地文件。有没有一种简单的方法将其托管在某个地方以通过http加载?注意:由于某种原因,它在上面添加了一个不存在的分号。代码是:chrome.tabs.create({“url”:“});编辑:我放弃了。它也加在这里了。忽略培根后面的分号“。它还将其超链接,并删除了h t p等@erv我已更新了答案的更多细节。请更具体地说明您遇到的问题。始终在浏览器控制台中检查错误或警告。@erv如果您有关于某个问题的更多详细信息,请更新该问题,而不是添加注释。在这里,您还完全支持格式化源代码。在评论中,你可以用一个反勾来标记源代码。干杯,九点,现在可以在ff50上使用了。关于内容安全错误,您是对的。我错过了它,因为我只是在控制台上查看javascript错误。
// Register onclick-Event for Save Button
var elem = document.getElementById("buttonSave");
elem.onclick = save;
function save()
{
chrome.tabs.create({"url": chrome.extension.getURL("popup/output.html")}, onCreated);
}
function onCreated(newTab)
{
// Use setTimeOut to give the loaded page some time to register the message listener
setTimeout(onCreatedInner, 500);
function onCreatedInner()
{
chrome.runtime.sendMessage(42);
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div>testing stuff</div>
<div id="output"></div>
</body>
<script src="output.js"></script>
</html>
// register message handler
chrome.runtime.onMessage.addListener(notify);
function notify(message)
{
// Write message into page
var elem = document.getElementById("output");
elem.innerText = message;
// Show alert
window.alert(message);
}