Javascript Firefox WebExtension executeScript运行代码
我正在为Firefox浏览器编写小型WebExtension。事实证明,Firefox对manifest.json和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
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
,但你不能使它保持一致。