CNZZ统计代码一直统计不到的问题
网站加入CNZZ的JS统计代码后,Chrome浏览器出现警告:阻止跨站解析器阻断脚本通过document.write调用(A parser-blocking, cross site script,XXXX.js is invoked via document.write.)。该警告有时候可能会使HTTPS页面出现不安全因素,甚至让使用EV SSL证书的网站出现不显示绿色地址栏等问题。本文将带您找出错误原因,解决Chrome对CNZZ统计代码报错的问题。
今天业务部门加CNZZ代码时,一直出现统计不到的问题,加入的代码如入:
<script src="https://s19.cnzz.com/z_stat.php?id=XXXXXXXX&web_id=XXXXXXXX" language="JavaScript"></script>
另外也试了
<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_XXXXXXXX'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s19.cnzz.com/z_stat.php%3Fid%3DXXXXXXXX' type='text/javascript'%3E%3C/script%3E"));</script>
放了几种代码都不行,
也检查了HTML页面中是否存在ERROR,都解决之后,
浏览器仍然报下面的警告,一直以为警告可以不处理,不过统计不到相关数据。
A parser-blocking, cross site (i.e. different eTLD+1) script, https://c.cnzz.com/core.php?web_id=XXXXXXXX
&t=z, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message. See https://www.chromestatus.com/feature/5718547946799104 for more details.
排查思路是
1、首页检查HTML页面是否错误,
2、检查HTML标签对是否完整
3、检查META标签是否有特殊标签,删除了一部分。
4、查看警告信息中的https://www.chromestatus.com/feature/5718547946799104 这个地址,不过要FQ一下。
5、通过上面的文档,发现是浏览器升级之后才出现的问题。
谷歌从Chrome 55版本开始干预“通过document.write插入的跨站解析器阻断脚本”的加载,提升页面加载速度。
根据Chromestatus的表述,对于诸如2G之类的连接速度较慢的用户来说,通过document.write加载的第三方脚本,性能损失通常非常严重,以至于主页内容的显示会延迟数十秒。
在浏览器呈现页面之前,必须通过解析HTML标记来构建DOM树。无论何时解析器遇到脚本,它都必须停止并执行脚本,才能继续解析HTML。如果脚本动态插入另一个脚本,解析器将被迫等待更长时间才能下载资源,这可能会导致一次或多次网络往返并延迟首次呈现页面的时间。
Chrome从第55版开始代表所有用户进行干预,具体来说,当满足以下所有条件时,Chrome将不执行通过document.write()插入的<script>元素:
- 用户处于慢速连接,特别是用户使用2G网络(未来这种干预可能延伸到其他使用慢速连接的用户,如慢速3G或WiFi)。
- Document.write()在Top层文档中。
- Document.write()中的脚本是解析器阻断脚本。但具有“异步”或“延迟”属性的脚本仍将正常执行。
- 该脚本不是托管在同一站点上。换句话说,Chrome浏览器不会针对匹配eTLD+1的脚本进行干预(例如,托管在js.example.org上脚本插入到www.example.org上)。
- 该脚本尚未在浏览器HTTP缓存中。缓存中的脚本不会导致网络延迟,所以仍会执行。
- 该页面的请求不是重新加载。如果用户触发了重新加载Chrome不会干预,会像平常一样执行页面。
- 第三方片段有时使用Document.write()加载脚本。第三方通过提供异步加载替代方案,可以允许第三方脚本加载而不会阻止页面剩余内容的显示。
将以上统计代码改为异步即可。
<script>
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=XXXXXXXX&async=1';
var root_s = document.getElementsByTagName('script')[0];
root_s.parentNode.insertBefore(cnzz_s_tag, root_s);
</script>