在PageMod (Firefox插件SDK)的HEAD标签的顶部插入一个脚本

Insert a script at the top of HEAD tag in PageMod (Firefox Add-on SDK)

本文关键字:插入 一个 脚本 顶部 标签 SDK 插件 PageMod HEAD Firefox      更新时间:2023-09-26

我想在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页面"与页面脚本交互"。