在PageMod (Firefox插件SDK)的HEAD标签的顶部插入一个脚本
Insert a script at the top of HEAD tag in PageMod (Firefox Add-on SDK)
我想在Firefox Add-on SDK内容脚本中插入一个通过page-mod添加的脚本。因此,当用户转到页面XXX时,他会得到一个包含插入脚本的页面。但是,当试图在HEAD的顶部插入这个时,我得到了一个错误,第一个Node子节点不是一个对象。
我插入<script>
的内容脚本代码是:
script='<script>var d=new Date(2012,2,24); window.Date=function () {return d;}</script>';
var head = document.getElementsByTagName("head")[0];
head.insertBefore(script, head.firstChild);
怎么了?
您没有提供最小、完整和可验证的示例。因此,此答案仅基于您提供的代码。
如何使用insertBefore()
的问题:
我注意到的第一个问题是,当该参数需要是一个节点对象时,您提供了一个字符串作为insertBefore()
的第一个参数。
然而,你声明你得到的错误是"第一个节点子节点不是对象"。这与我根据所提供的代码所期望的错误不匹配。当我把你的代码在一个页面mod内容脚本,我得到的错误是:
console.error: testpagemodinsertBefore:
Object
- _errorType = TypeError
- message = Argument 1 of Node.insertBefore is not an object.
- fileName = resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/loader/sandbox.js -> resource://testpagemodinsertbefore/data/contentScript.js
- lineNumber = 26
- stack = @resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/loader/sandbox.js -> resource://testpagemodinsertbefore/data/contentScript.js:26:1|
- name = TypeError
这是我希望从问题中的代码中得到的错误。因此,您要么没有发布产生您所述错误的代码,要么没有准确地报告您在控制台中看到的错误。在未来,请准确的在你的报告。更啰嗦总比略去好。
插入HTML文本
代码:script='<script>var d=new Date(2012,2,24); window.Date=function () {return d;}</script>';
定义了一些要插入到DOM中的HTML文本。如果您想插入HTML文本而不是插入节点,一种方法是使用insertAdjacentHTML()
。在代码中可以这样做:
head.insertAdjacentHTML('afterbegin',script);
这适用于大多数HTML。但是,不会导致<script>
标记的内容被执行/求值。这是出于安全考虑。对于攻击者来说,将任意文本插入DOM要比插入实际的节点/元素容易得多。HTML规范规定作为文本插入的标记将不被执行。
插入<script>
标记,该标记被求值并执行:
我们可以通过创建包含所需脚本文本的<script>
元素来实现这一点,然后将该元素插入到DOM中。
对于你的代码,它看起来像:
//Get the first <head> element
let head = document.getElementsByTagName("head")[0];
//The script text desired
let scriptText='var d=new Date(2012,2,24); window.Date=function () {return d;};';
//Add an alert for testing ('n is not needed. But, is more readable when inspecting DOM.)
scriptText = 'window.alert("In inserted script");'n' + scriptText;
//Create a <script> element
let scriptEl = document.createElement( 'script' );
//That is JavaScript
scriptEl.type = 'text/javascript';
//Add the script text
scriptEl.textContent = scriptText;
//Insert it as the firstChild of <head>
head.insertBefore( scriptEl, head.firstChild );
进一步阅读:
您似乎希望使用您的内容脚本与页面脚本进行交互。我建议您阅读MDN页面"与页面脚本交互"。
- Adobe acrobat每隔30页插入一个空页面-javascript
- Javascript按钮,在html文本区域中插入一个大黑点(•)
- 如何在 jquery 中插入一个欠量列表
- 在光标位置的文本区域中插入一个字符串,并进行一些更改
- 从输入中提取数字,并插入一个等式javascript
- 如何在JS中的屏幕右上角插入一个浮动按钮
- 在事件jquery中插入一个函数
- 使用 jQuery 在文本区域插入一个浮动按钮
- 我正在尝试遍历 id 数组,如果不存在 id,则插入一个 mongodb 文档.我怎样才能让他们坚持下去
- 如何在 Javascript 中插入一个可以使用 onclick() 访问函数的按钮
- Javascript:插入一个变量作为参数
- 为什么我的 push() 方法不断在我的数组中插入一个“未定义”的元素
- 在 JavaScript 函数中插入一个选择标签
- 在 jQuery 中插入一个 CSS id
- 如何在文本的每 5,000 个字符之后的第一个
或
之后插入一个 - 在 iFrame 中插入一个值
- 用mootools插入一个中断
- Java,JavaFx:在JavaFX容器中插入一个HTML&JS(静态,无互联网)项目
- Google+API只读-什么是插入一个时刻
- 我怎么能在每个特定的字符中插入一个字符,比如“”;(“在我的javascript中