Google跟踪代码管理器是否在自定义HTML代码上执行document.write?

时间:2015-04-16 10:53:19

标签: javascript google-tag-manager

Google的文档明确指出不支持同步加载代码:https://support.google.com/tagmanager/answer/2787990?hl=en

但是现在有一个设置'支持document.write'在创建自定义HTML标记时。这意味着现在支持同步加载标签,但我找不到任何文档来解释新设置的工作原理。

我的问题是:document.write实际上是执行还是GTM做了一些聪明的事情,比如在后台用document.createElement替换它(如下所述:http://www.stevesouders.com/blog/2012/04/10/dont-docwrite-scripts/)?

3 个答案:

答案 0 :(得分:1)

GTM实际上覆盖了document.write,用于执行标记的范围(支持document.write的自定义HTML标记,就像你提到的那样),正如你在Chrome的devtools控制台上看到的那样:

document.write
function write() { [native code] }

GTM完成document.write调用后,它会丢弃覆盖:

// Other Wise Try on this way
    for (int i = 0; i < recipient_id.size(); i++) {

        ParseQuery<ParseObject> query = ParseQuery.getQuery("Location");
        query.whereEqualTo("Username", recipient_id.get(i).toString());
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> list, ParseException e) {
                // TODO Auto-generated method stub
                if (e == null) {
                    // Success
                    lat = (double) object.get("latitude");
                    longi = (double) object.get("longitude");
                    Log.e("Latitude", lat + "");
                    locations.add(lat);
                    locations.add(longi);
                    Log.e("Locations", locations + "");
                } else {
                    // Fail
                    // in case its fail that a time check error like
                    Log.e("get Error", " Message " + e.getMessage());
                }

            }
        });

它提供的实现使用“普通”插入(例如document.createElement后跟appendChild或insertBefore)和一个在脚本加载时运行的监听器(例如onreadystatechange或onload)并执行放在document.write之后的代码。调用标签定义。

答案 1 :(得分:0)

我还在Google代码管理器的Google+信息页上提出了这个问题,我收到了谷歌某人的回复:

“简短的回答:GTM做了一些巧妙的工作,以异步方式支持doc.write()。”

https://plus.google.com/108819422004595089210/posts/ZWEXV8FF4tk

答案 2 :(得分:0)

我必须在项目上实现类似的功能。在查看了Google跟踪代码管理器中的精简js之后,我发现他们正在使用此库:

https://github.com/krux/postscribe

  

GTM做一些聪明的事

确实很聪明:)

快速es6示例:

import postscribe from 'postscribe'
const customHtml = "<script>document.write('hello')</script>"

const div = document.createElement('div')
div.style.display = 'none'
div.style.visibility = 'hidden'
document.body.appendChild(div)
postscribe(div, customHtml)