通过GTM用Cookie统计会话页面浏览量时遇JS编译错误求助
咱们一步步来排查和解决你的问题,先从你最新版本的代码错误说起,再回头梳理第一次的问题:
首先修复当前代码的语法错误
你当前遇到的第16行semi-colon expected错误,根源是字符串引号嵌套冲突:
document.cookie = "viewCount="1"; path=/";
外层已经用了双引号包裹整个cookie字符串,里面的"1"又用了双引号,导致解析器无法正确识别字符串边界。你可以二选一修复:
- 内层改用单引号:
document.cookie = "viewCount='1'; path=/";
- 转义内层的双引号:
document.cookie = "viewCount=\"1\"; path=/";
再说说第一次代码的问题(GTM自定义代码的注意事项)
你第一次代码最后直接调用了viewAppend();,这是你遇到')' expected解析错误的核心原因:Google Tag Manager的自定义JavaScript变量要求代码最终返回一个值(或是一个可执行的函数),不能直接在顶级作用域执行函数调用——GTM会自动把你的变量代码包裹在一个匿名函数里,直接执行函数调用会破坏语法结构。
另外补充两个优化点:
- 统计页面浏览量时,一定要把cookie值转成数字再累加(你第二次代码里加了
parseInt(oldCookie),这步做得很对,否则会变成字符串拼接,比如"1"会变成"11"而不是2); - 建议给cookie加上
SameSite=Lax属性,避免浏览器的跨域安全限制,同时默认的会话级cookie(关闭浏览器即失效)刚好符合你“会话内统计”的需求。
适合GTM的最终代码方案
方案1:用自定义HTML标签执行统计逻辑(推荐)
因为设置cookie是一个执行动作,而非返回值,放在自定义HTML标签里更合适:
<script> function readCookie(name) { var cookieName = name + "="; var cookieSplit = document.cookie.split(';'); for (var i = 0; i < cookieSplit.length; i++) { var cookies = cookieSplit[i]; while (cookies.charAt(0) === ' ') cookies = cookies.substring(1, cookies.length); if (cookies.indexOf(cookieName) === 0) return cookies.substring(cookieName.length, cookies.length); } return null; } function viewAppend() { var oldCookie = readCookie('viewCount'); if (oldCookie === null) { document.cookie = "viewCount=1; path=/; SameSite=Lax"; } else { // 加上基数10避免parseInt的进制解析错误 var views = parseInt(oldCookie, 10) + 1; document.cookie = "viewCount=" + views + "; path=/; SameSite=Lax"; } } viewAppend(); </script>
方案2:用自定义变量获取当前浏览量数值
如果需要在其他标签里调用当前的浏览量数值,可以用自定义变量返回该值:
function() { function readCookie(name) { var cookieName = name + "="; var cookieSplit = document.cookie.split(';'); for (var i = 0; i < cookieSplit.length; i++) { var cookies = cookieSplit[i]; while (cookies.charAt(0) === ' ') cookies = cookies.substring(1, cookies.length); if (cookies.indexOf(cookieName) === 0) return cookies.substring(cookieName.length, cookies.length); } return null; } var oldCount = readCookie('viewCount'); return oldCount ? parseInt(oldCount, 10) : 0; }
内容的提问来源于stack exchange,提问作者Andrew Ransom
相关产品推荐
相关产品推荐

