Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firefox WebExtension executeScript运行代码_Javascript_Firefox_Firefox Addon_Firefox Addon Webextensions - Fatal编程技术网

Javascript Firefox WebExtension executeScript运行代码

Javascript Firefox WebExtension executeScript运行代码,javascript,firefox,firefox-addon,firefox-addon-webextensions,Javascript,Firefox,Firefox Addon,Firefox Addon Webextensions,我正在为Firefox浏览器编写小型WebExtension。事实证明,Firefox对manifest.json和browser.tabs.executeScript方法中的内容脚本处理runAt属性的方式不同 content-script.js: console.log('content script fired!'); 后台脚本设置-script.js: 函数handleUpdated(tabId、changeInfo、tabInfo){ var pageVar=“console.log

我正在为Firefox浏览器编写小型WebExtension。事实证明,Firefox对manifest.json和
browser.tabs.executeScript
方法中的内容脚本处理
runAt
属性的方式不同

content-script.js:

console.log('content script fired!');
后台脚本设置-script.js:

函数handleUpdated(tabId、changeInfo、tabInfo){
var pageVar=“console.log('executeScript fired!');
var executing=browser.tabs.executeScript(tabId{
代码:pageVar,
runAt:“文档开始”
});
}
browser.tabs.onCreated.addListener(handleUpdated);
browser.tabs.onUpdate.addListener(handleUpdate);
test-page.html:


考验我的行为
log('start very first page script');
manifest.json:

“权限”:[
“活动标签”,
“存储”,
“标签”,
“http://*/*”,
“https://*/*”,
“文件://*/*”
],
“背景”:{
“脚本”:[“background/settings script.js”]
},
“内容脚本”:[
{
“匹配项”:[“”],
“js”:[“content script.js”],
“运行时间”:“文档开始”
}
],
控制台输出如下所示:

“已启动内容脚本!”
“开始第一页脚本”
“executeScript被解雇了!”
那么,为什么Firefox会忽略我的
runAt
属性,并在我以编程方式将脚本注入
选项卡时继续在
document\u idle
上执行脚本呢

我错过了什么吗

那么,当我用tabs.executeScript()以编程方式注入文档时,为什么Firefox会忽略我的runAt属性并保持在文档_空闲状态下执行脚本呢

没有,只是太晚了,你正在和网页赛跑

tabs.executeScript
将把
runAt
视为最早运行脚本的机会。但是当
executeScript
实际运行时,页面已经完全加载

考虑这一点:对于在
manifest.json
中定义的脚本,Chrome预先知道某些脚本必须在页面加载之前进行

另一方面,
tabs.onCreated
/
tabs.onUpdated
会在创建/更新开始后的某个时间点触发。当页面愉快地继续加载时,会有一个自然的处理延迟-在所有扩展都决定要做什么之前,这不是一个阻塞的事件。当您调用
executeScript
API时,它再次需要是时候让Chrome调整其内部机械了

一直以来,您的琐碎页面已经结束加载。对于加载缓慢的页面,您可能会看到不同,但与您显示为测试的页面不同


在运行时,确实不存在一个适当的解决方案来决定预先包含哪些脚本。
chrome.declarativeContent.RequestContentScript
理论上应该允许这样做,但即使在稳定的chrome版本中也不支持,在Firefox中肯定不支持


如果您需要在
document\u start
脚本中实现一些条件逻辑,这非常困难-您无法异步执行任何操作,因此
chrome.storage
和消息传递都没有帮助。

我建议您查看各种可用事件的触发时间。页面/选项卡更新/创建时/webRequests/webNavigation.turns这是FFox OSX行为,最近我在Win8上测试了它-一切正常,没有问题。所以现在我被卡住了,甚至不知道该在哪里解决这个问题。作为一个例子,基于许多因素看到不一致的结果是正常的。我的观点是,尽管
executeScript
,但你不能使它保持一致。