gpt4 book ai didi

javascript - 除非我先加载弹出页面/脚本,否则无法从后台脚本成功运行executeScript

转载 作者:行者123 更新时间:2023-11-28 18:12:50 25 4
gpt4 key购买 nike

我尝试使用键盘快捷键从后台脚本运行执行脚本,但它不起作用并返回:

Error: No window matching {"matchesHost":[]}

但是如果我只是打开弹出页面,关闭它,然后执行相同的操作,一切都会正常。

我通过最小的更改重新创建了使用 Beastify 示例时出现的问题。代码如下:

ma​​nifest.json

{
... (not interesting part, same as in beastify)

"permissions": [
"activeTab"
],

"browser_action": {
"default_icon": "icons/beasts-32.png",
"default_title": "Beastify",
"default_popup": "popup/choose_beast.html"
},

"web_accessible_resources": [
"beasts/frog.jpg",
"beasts/turtle.jpg",
"beasts/snake.jpg"
],

My additions start here:

"background": {
"scripts": ["background_scripts/background_script.js"]
},

"commands": {
"run_content_test": {
"suggested_key": {
"default": "Alt+Shift+W"
}
}
}
}

popup/choose_beast.js(与原始版本相同)

/*
Given the name of a beast, get the URL to the corresponding image.
*/
function beastNameToURL(beastName) {
switch (beastName) {
case "Frog":
return browser.extension.getURL("beasts/frog.jpg");
case "Snake":
return browser.extension.getURL("beasts/snake.jpg");
case "Turtle":
return browser.extension.getURL("beasts/turtle.jpg");
}
}

/*
Listen for clicks in the popup.

If the click is on one of the beasts:
Inject the "beastify.js" content script in the active tab.

Then get the active tab and send "beastify.js" a message
containing the URL to the chosen beast's image.

If it's on a button wich contains class "clear":
Reload the page.
Close the popup. This is needed, as the content script malfunctions after page reloads.
*/
document.addEventListener("click", (e) => {
if (e.target.classList.contains("beast")) {
var chosenBeast = e.target.textContent;
var chosenBeastURL = beastNameToURL(chosenBeast);

browser.tabs.executeScript(null, {
file: "/content_scripts/beastify.js"
});

var gettingActiveTab = browser.tabs.query({active: true, currentWindow: true});
gettingActiveTab.then((tabs) => {
browser.tabs.sendMessage(tabs[0].id, {beastURL: chosenBeastURL});
});
}
else if (e.target.classList.contains("clear")) {
browser.tabs.reload();
window.close();

return;
}
});

background_scripts/background_script.js(由我添加)

browser.commands.onCommand.addListener(function(command) {
var executing = browser.tabs.executeScript(
null,
{file: "/content_scripts/content_test.js"});

executing.then(
function (res){
console.log("started content_test.js: " + res);
},
function (err){
console.log("haven't started, error: " + err);
});
});

content_scripts/content_test.js(由我添加)

alert("0");

我跳过整个 content_scripts/beastify.js 因为它与它无关(IMO),但可以找到它 here .

现在,我知道即使之前未打开弹出页面,后台脚本也会运行并接收消息,因为我发现它无法执行脚本。我不知道是什么原因导致这种行为以及是否有办法解决它。

注意:我尝试添加“tabs”甚至“all_urls”等权限,但没有改变任何内容。

注释 2: 我从 about:debugging 页面将插件作为临时插件运行,但我尝试在普通的非限制页面上执行脚本(例如,在此页面上我可以重现该问题)。

非常感谢大家!

最佳答案

// in manifest.json

"permissions": [
"<all_urls>",
"activeTab"
],

对我有用(Firefox 50、Mac OS X 10.11.6)。

当我使用原始版本时,我收到了与您描述的完全相同的错误消息

    "permissions": [
"activeTab"
],

所以添加"<all_urls>"似乎解决了问题。但是,您说当您在权限中包含“all_urls”时仍然遇到该问题,因此我不确定我的做法是否可以解决您自己的设置中的问题。

编辑:我认为,就其可能带来的安全风险而言,给予任何网络扩展如此广泛的权限是否明智是一个单独的重要考虑因素。

(我本来可以将此作为评论发布,但我还没有足够的声誉来添加评论。)

关于javascript - 除非我先加载弹出页面/脚本,否则无法从后台脚本成功运行executeScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com