作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发浏览器扩展/附加组件。我们让它在 Chrome 中运行,所以我试图让它在 Firefox 中运行。
我已经在 Firefox Developer Edition 49.0a2 (2016-07-25) 中加载了我的插件。
我的扩展涉及设置为 run_at: document_start
的 content_script ,因此它可以在其他页面脚本运行之前注入(inject)一个脚本标签,因此它可以使一个对象对网站全局可用。
这似乎在 Chrome 中运行良好,但在 Firefox 中,它已被证明有点竞争条件,大多数时间其他页面资源首先加载。
是否有一种策略可以在任何其他页面脚本运行之前以一种可以注入(inject)和加载脚本的方式加载内容脚本?
当我添加日志时,我可以很好地隔离正在发生的事情。在此示例内容脚本中:
// inject in-page script
console.log('STEP 1, this always happens first')
var scriptTag = document.createElement('script')
scriptTag.src = chrome.extension.getURL('scripts/inpage.js')
scriptTag.onload = function () { this.parentNode.removeChild(this) }
var container = document.head || document.documentElement
// append as first child
container.insertBefore(scriptTag, container.children[0])
scripts/inpage.js
只需运行一个日志,例如
console.log('STEP 2, this should always run second')
console.log('Step 3, the page itself, should run last')
最佳答案
具有外部源 (<script src>
) 的动态插入脚本不会阻止脚本的执行,因此无法保证您的脚本会加载。如果您的扩展程序在 Chrome 中运行,那只是运气好。
如果你真的想在其他脚本之前运行一些脚本,你必须内联运行它:
var actualCode = `
// Content of scripts/inpage.js here
`;
var s = document.createElement('script');
s.textContent = actualCode;
(document.head || document.documentElement).appendChild(s);
s.remove();
scripts/inpage.js
,将其序列化为字符串并放入
actualCode
多变的。但是如果
inpage.js
只是几行代码,那么上面的就可以使用了。
document_start
注入(inject),然后您可以保存以后使用的函数和(原型(prototype))方法(在闭包中),但需要非常仔细的编码。
XMLHttpRequest
获取脚本。出于性能原因,不推荐使用同步 XHR,因此使用它需要您自担风险。扩展代码通常与您的扩展捆绑在一起,因此使用 sync xhr 应该是低风险的:
// Note: do not use synchronous XHR in production!
var x = new XMLHttpRequest();
x.open('GET', chrome.runtime.getURL('scripts/inpage.js'), false);
x.send();
var actualCode = x.responseText;
var s = document.createElement('script');
s.textContent = actualCode;
(document.head || document.documentElement).appendChild(s);
s.remove();
关于firefox-addon - 如何让 firefox 附加内容脚本在其他页面脚本之前注入(inject)和运行脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38577656/
我是一名优秀的程序员,十分优秀!