今天在例行巡检博客的时候发现 console 报错了:
错误内容是:
A Parser-blocking, cross-origin script, https://s95.cnzz.com/z_stat.php?id=1257684520, is invoked via document.write. This may be blocked by the browser if the device has poor network connectivity.
A Parser-blocking, cross-origin script, https://c.cnzz.com/core.php?web_id=1257684520&t=z, is invoked via document.write. This may be blocked by the browser if the device has poor network connectivity.
第一次遇到这种问题,用 Safari 打开后发现并没有报错。考虑到之前更新了 Chrome 遂怀疑是 Chrome 的问题,Google 搜了一下搜到了这篇 http://stackoverflow.com/questions/39610829/a-parser-blocking-cross-origin-script-is-invoked-via-document-write-how-to-ci 在其中第一个答案处找到了 Google 的文档。
浏览了一下,大意就是在页面渲染完成后就不能使用 document.write 方法了,从 Chrome 53 开始就会报以上的错误。文章还给出了一系列的解决方法。
仔细查了博客中的相关代码,发现时只加载了 z_stat.php 这个资源,很明显第二个报错是 z_stat.php 中的代码执行的,本想着将 document.write 换个方法写,现在换成别的写法也不能解决报错,只有先忍着,等 CNZZ 修改他们的代码了。
顺便随手给 CNZZ 发了一封邮件,希望能有回复。
10月9日收到了CNZZ回复的邮件:
您好,针对chrome新版对对第三方js的阻止的问题,目前依赖于JS的所有产品都会受此影响。
目前解决办法是建议您更换我们的异步加载代码,请参考附件。
但需要注意:使用异步加载代码后统计的数据会比普通JS代码数据少,
但目前如果更不换异步加载代码,在新版chrome的阻止下数据是直接统计不到的。
请您知悉,感谢您对U-WEB的支持!
打开附件 统计代码异步加载教程.docx ,按照教程提供的方法将js代码修改成异步加载后即可,需要提醒的是附件中的代码存在中英文符号的问题,所以可以复制下面的代码:
var cnzz_s_tag = document.createElement('script'); cnzz_s_tag.type = 'text/javascript'; cnzz_s_tag.async = true; cnzz_s_tag.charset = 'utf-8'; cnzz_s_tag.src = 'https://w.cnzz.com/c.php?id=xxxxxx&async=1'; var root_s = document.getElementsByTagName('script')[0]; root_s.parentNode.insertBefore(cnzz_s_tag, root_s);
至此问题解决~