执行注入DOM的<script>元素

时间:2015-05-14 14:31:47

标签: yui

我一直在尝试将Google跟踪代码管理器脚本添加到使用Squarespace开发的网站。遗憾的是,Google实施指南指定应在打开&lt; body&gt; 标记后立即插入此脚本,而Squarespace不允许这样做。

&#xA;&#xA;

因此,我一直在玩YUI库,试图将此代码注入到需要的地方。并拥有:

&#xA;&#xA;
 &lt; script&gt;&#xA; Y.use('node',function(){&#xA; Y.on( 'domready',function(){&#xA; obj = Y.Node.create('&lt;! -  Google Tag Manager  - &gt;&lt; noscript&gt;&lt; iframe src =“// www.googletagmanager.com /ns.html?id=GTM-KPT4S5“height =”0“width =”0“style =”display:none; visibility:hidden“&gt;&lt; / iframe&gt;&lt; / noscript&gt;'+'&lt; script&gt ;(函数(w,d,s,l,i){w [l] = w [l] || []; w [l] .push({\'gtm.start \':new Date()。 getTime(),event:\'gtm.js \'}); var f = d.getElementsByTagName(s)[0],'+'j = d.createElement(s),dl = l!= \'dataLayer \ '?\' 和L = \ '+ 1:\' \ '; j.async = TRUE; j.src = \' // www.googletagmanager.com/gtm.js?id=\'+i+dl ; f.parentNode.insertBefore(J,F); '+'})(窗口,文件,\ '脚本\' \ '数据层\' \ 'GTM-KPT4S5 \');&LT; \ /脚本&GT;&LT ;  - 结束Google跟踪代码管理器 - &gt;');&#xA; Y.one('body')。prepend(obj);&#xA;});&#xA;});&#xA ;&lt; / script&gt;&#xA;  
&#xA;&#xA;

上面的代码会在需要时注入脚本,但它不会执行它。有人可以帮助确定原因并可能建议一个解决方案吗?

&#xA;&#xA;

顺便说一句,我知道我可以用jQuery实现这个目标,但我不希望加载任何其他库。&#xA;&#xA;

NB道歉,我在原帖中并不清楚。我无权访问Squarespace中的源代码,我需要在打开&lt; body&gt; 标记后直接插入GTM脚本。我可以在Squarespace的&lt; head&gt; 中插入脚本,所以我尝试将GTM代码从那里注入&lt; body&gt;

&#xA ;

2 个答案:

答案 0 :(得分:1)

您可以使用document.write来执行作为DOM文本插入的内联脚本代码。而不是

<script>
Y.use('node', function() {
    Y.on('domready', function() {
        obj = Y.Node.create('<!-- Google Tag Manager --><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-KPT4S5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>'+'<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({\'gtm.start\':new Date().getTime(),event:\'gtm.js\'});var f=d.getElementsByTagName(s)[0],'+'j=d.createElement(s),dl=l!=\'dataLayer\'?\'&l=\'+l:\'\';j.async=true;j.src=\'//www.googletagmanager.com/gtm.js?id=\'+i+dl;f.parentNode.insertBefore(j,f);'+'})(window,document,\'script\',\'dataLayer\',\'GTM-KPT4S5\');<\/script><!-- End Google Tag Manager -->');
        Y.one('body').prepend(obj);
    });
});
</script>

你可以做到

<script>
document.write('<!-- Google Tag Manager --><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-KPT4S5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>'+'<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({\'gtm.start\':new Date().getTime(),event:\'gtm.js\'});var f=d.getElementsByTagName(s)[0],'+'j=d.createElement(s),dl=l!=\'dataLayer\'?\'&l=\'+l:\'\';j.async=true;j.src=\'//www.googletagmanager.com/gtm.js?id=\'+i+dl;f.parentNode.insertBefore(j,f);'+'})(window,document,\'script\',\'dataLayer\',\'GTM-KPT4S5\');<\/script><!-- End Google Tag Manager -->');
</script>

编辑:如果JS来自您无权访问的第三方来源,则需要通过eval自行执行内联JS代码。你可以做类似的事情

<script>
Y.use('node', function() {
    Y.on('domready', function() {
        obj = Y.Node.create('<!-- Google Tag Manager --><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-KPT4S5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>'+'<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({\'gtm.start\':new Date().getTime(),event:\'gtm.js\'});var f=d.getElementsByTagName(s)[0],'+'j=d.createElement(s),dl=l!=\'dataLayer\'?\'&l=\'+l:\'\';j.async=true;j.src=\'//www.googletagmanager.com/gtm.js?id=\'+i+dl;f.parentNode.insertBefore(j,f);'+'})(window,document,\'script\',\'dataLayer\',\'GTM-KPT4S5\');<\/script><!-- End Google Tag Manager -->');
        obj.id="googleTag";
        Y.one('body').prepend(obj);
        Y.one('#googleTag').all('script').each(function(s, k) {
            var scriptSrc = s.getHTML();
            eval(scriptSrc);
        });
    });
});
</script>

答案 1 :(得分:0)

虽然这个问题有点陈旧,但可以在“页脚”区域的Squarespace的“代码注入”部分添加Google跟踪代码管理器的代码。

使用管理员权限,选择:

Settings -> Advanced -> Code Injection

将GTM脚本放在标题中,将<noscript>内容放在页脚中。

我知道这并没有解决关于在开始<body>标记之后立即获取它的特定点,但我已经看到了这个(并且我自己在一些在Squarespace中完成的客户端站点上使用它)。