【问题标题】:Dynamically add JS code to head tag动态添加JS代码到head标签
【发布时间】:2015-10-06 18:21:14
【问题描述】:

我正在尝试将脚本添加到页面的 head 标记中。我看到我试图在 body 标记中添加的代码,但它没有显示在 head 标记中。

$(document).load(function() {
   $('<script>console.log("hi");</' + 'script>').appendTo("head")
});

我在&lt;body&gt; 中看到它被添加,但我在&lt;head&gt; 中没有看到它。

我尝试了 append、appendTo 和 document.ready 以及 document.load 函数的变体。到目前为止,这些都没有奏效。

在发布之前,我浏览了多个类似的主题。我似乎没有解决我的问题

【问题讨论】:

  • 如果脚本正在运行,它最终在哪里有什么不同?更高层次的问题是什么?
  • 出于某些谷歌分析的原因,我希望将此脚本添加到 head 标签中

标签: javascript jquery head


【解决方案1】:

您可能需要做的一件事是将&lt;/ 转义为&lt;\/

如果它是一个内联脚本,也许你可以尝试向它添加一个 setTimeout。

【讨论】:

    【解决方案2】:

    试试下面的函数:

    (function (src) {
        var tagName = 'script', script = document.createElement(tagName);
        script.src = src;
        var elm = document.getElementsByTagName(tagName)[0];
        elm.parentNode.insertBefore(script, elm);
    })('SCRIPT.SRC.HERE.js');
    

    这将创建一个动态的script 标记并将其添加到第一个script 标记之前。虽然如果您的head 中没有任何script 标签,它不会以您想要的方式工作。在这种情况下,您可以使用以下函数:

    (function (src) {
        var tagName = 'script', script = document.createElement(tagName);
        script.src = src;
        var head = document.getElementsByTagName('head')[0];
        head.insertBefore(script, head.childNodes[0]);
    })('SCRIPT.SRC.HERE.js');
    

    这将直接获取head 标记内的第一个元素,并将新脚本附加到它之前。

    【讨论】:

    • 您的代码有效。你也可以使用document.head.appendChild(script);
    【解决方案3】:

    document 不会触发“加载”事件 - 或者如果触发,它是来自其他加载(如另一个脚本或图像文件)的冒泡事件。尝试将document 更改为window

    http://jsfiddle.net/5bhmwyrx/3/

    $(window).load(function() {
       var script = $('<script>console.log("hi");</' + 'script>').appendTo(document.head);
       console.log("Script was appended to", script[0].parentNode.nodeName);
       //-> Script was appended to HEAD
    });
    
    $(document).load(function() {
       console.log("You should never see this");
    });
    
    document.onload = function () {
        console.log("You should not see this in modern browsers");
    };
    

    【讨论】:

    • 谢谢,但我仍然没有在 head 标签中看到它
    • 如果你看到这个,它确实会触发一个像 window 一样的 onload 事件(请参阅:stackoverflow.com/a/588048/3769412),但它有助于 OP 使用 jQuery 来处理这个问题,无论如何这可以解决任何问题并且没有回答 OP 提出的问题
    • @Daemedeor - document.onload = function () { console.log("document onload event"); }; 不记录任何内容(在当前浏览器中)。那太老了,它甚至不再在浏览器中实现,并且是 &lt;body onload=""&gt; 的 JS api - 超级超级老派。
    • @user3861559 - 你试过我的小提琴吗??这是它被附加到 HEAD 的证明(查看控制台):jsfiddle.net/5bhmwyrx/2
    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多