在开始 <body> 标记之后立即放置一个脚本

Posted

技术标签:

【中文标题】在开始 <body> 标记之后立即放置一个脚本【英文标题】:Place a script immediately after the opening <body> tag 【发布时间】:2013-01-24 01:11:28 【问题描述】:

我想放置一个谷歌标签管理器脚本,根据谷歌标签文档,该脚本应该放在开始标签之后。

由于我们无法更改源代码,我们必须使用以下代码 sn-p 附加脚本。

<script type="text/javascript">
(function () 
    var url = "path/to/js/file";
    var gtm = document.createElement('script');
    gtm.type = 'text/javascript';
    gtm.async = true;
    gtm.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + url;
    var s = document.getElementsByTagName('body')[0];
    s.parentNode.insertBefore(gtm, s);
)();
</script>

几乎和谷歌分析脚本sn-p一样。现在脚本被附加在 body 标记之前。我不确定使用 jQuery 方法 insertAfter 是否是正确的方法,或者是否有更好的方法!

感谢您的热心帮助。

【问题讨论】:

我觉得还可以。您可以使用此代码。 您确定要将gtm.src 设为https:///path/to/js/file 还是http://www./path/to/js/file 也许你应该只使用&lt;body&gt;&lt;script src="/path/to/js/file"&gt;&lt;/script&gt;...&lt;/body&gt; @zerkms:问题是:如何在开始 标记之后立即附加脚本? @AaditMShah:谢谢,我已经修改了sn-p。 【参考方案1】:

实际上,您的代码在headbody 标记之间插入了script。改用这个:

var s = document.body.firstChild;
s.parentNode.insertBefore(gtm, s);

【讨论】:

非常感谢。我认为这是可行的,但我在控制台中收到一条错误消息。未捕获的类型错误:无法读取未定义的属性“firstElementChild”! 时机? head 部分有这个 IIFE 脚本吗?如果是这样,请稍等……没有lastChild,它是如何工作的?在您的评论中,您说的是“is appended right before the body tag”。你也改变了其他东西...... .getElementsByTagName('body')[0]?只需使用.body 非常感谢提姆。我选择了您的答案,因为它可以在不将自己限制在 body 标记之后的元素 ID 的情况下工作。【参考方案2】:

您可以为此使用Node.insertBefore

var body = document.getElementsByTagName("body")[0];
body.insertBefore(gtm, body.firstChild);

即使正文标签没有firstChild,这也有效。

【讨论】:

非常感谢,当我尝试它时也会返回错误。未捕获的类型错误:无法读取未定义的属性“firstChild” 假设您使用的是 jQuery,您可以将脚本加载器脚本包装在 $(function());【参考方案3】:

此 Q 不再相关(2021 年 12 月),因为 GTM 更改了跟踪代码管理器的设置和安装:

在“新”设置中,您应该:

&lt;script&gt; 代码sn-p 放在网页html 输出的&lt;head&gt; 中,最好靠近开始&lt;head&gt; 标记作为 可能,但在任何 dataLayer 声明之下。 **另外 - 将 &lt;noscript&gt; 代码 sn-p 紧跟在 HTML 输出中的标记之后。

https://support.google.com/tagmanager/answer/6103696

关于&lt;noscript&gt; 没有任何 Javascript 代码添加&lt;noscript&gt; 的意义(noscript 仅在 JavaScript 关闭时在浏览器中工作)。

【讨论】:

【参考方案4】:

我想你可以试试这个 - appendChild

 document.getElementsByTagName("body")[0].appendChild(gtm);

【讨论】:

这会在结束 body 标签之前添加 script: (.【参考方案5】:

试试这个:

var script = 'The script content here'; // Add your JS as a string,
var url    = 'path/to/js/file';         // Or link to the file.
var scriptNode = document.createElement('script');       // Create a script Element
scriptnode.setAttribute('type', "text/javascript");      // Set the Element's `type` attribute.
// Either:
scriptNode.appendChild(document.createTextNode(script)); // Add the text to the script Element.
// Or:
scriptNode.setAttribute('src', url);                     // Link to the script
// Place the script Element before the first child of the body.
document.body.insertBefore(scriptNode , document.body.firstChild);

所以,基本上,使用insertBefore

【讨论】:

【参考方案6】:

如果你使用 jQuery,你可以使用.prepend()。

(function () 
    var url = "path/to/js/file";
    var gtm = document.createElement('script');
    gtm.type = 'text/javascript';
    gtm.async = true;
    gtm.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + url;
    $('body').prepend(gtm);
)();

【讨论】:

jQuery 在附加script 标签时使用了一些怪癖。它可能不会注入脚本标签本身。 @SalmanA 感谢您的提醒。刚刚测试了一下,好像有点不一致。【参考方案7】:

你能不能在你的body标签里有一个元素作为第一个元素,并在它之前附加脚本。使用yourFirstElementIdfromBodyTag.before(here is your appended code goes) ..

举例

<body>
<your first element> like <input type="hidden" id="hidA" />
//rest code goes here
</body>

现在按照建议使用 $('#hidA').before('the script code') 。我确信它会在 &lt;body&gt; 之后附加脚本。

【讨论】:

以上是关于在开始 <body> 标记之后立即放置一个脚本的主要内容,如果未能解决你的问题,请参考以下文章

是否保证 <script> 标记上的加载事件总是在脚本执行时立即触发?

错误放置在 Jquery 验证插件的选择标记顶部

[转]常用返回顶部代码

java项目中 jsp页面的回顶部操作是怎么实现的?

返回顶部的几种方法总结

1117 标签元素,基础