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/)?
答案 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)