我在标记管理器中有一个标记,当用户尝试提交表单但其缺失或包含无效字段时,它会向我提供已显示为无效字段的数据。
使用以下代码完成:
// Get user Agent
var Uagent = navigator.userAgent;
// Validation Errors Check
document.getElementById("btnSubmit").onclick = function() {
errorLoop();
}
function errorLoop() {
var runner = document.getElementsByClassName("invalid"),
formEmail = document.getElementById('email').value,
dataL = [];
dataLayer.push({'formEmail' : formEmail});
if (runner) {
for (var i = 0; i < runner.length; i++) {
var errName = runner[i].getAttribute("name"),
errId = runner[i]
.getAttribute("id");
dataL.push("Field: " + errName + " - ID: " + errId);
} //End for
dataL.toString();
var vadout = dataL + " Device: " + Uagent;
console.log(dataL);
dataLayer.push({
'formEmail' : formEmail,
'validationError': vadout,
'event' : 'errorpush'
});
} //End if
} //End errorLoop
所以这里基本上发生的是提交我们正在检查表单以查看是否有任何字段具有类invalid
&amp;如果确实如此,则添加名称&amp;然后打印数组的字段ID然后将数组打印到数据层。
标记本身是使用名为errorpush
的自定义事件触发的。
问题在于,这只有大约80%的时间我们仍然会让很多人获得验证错误,但验证错误似乎没有进入数据层并回到谷歌分析。
我正在考虑为数据层推送添加一个settimeout延迟,我将离开并尝试但是想知道是否有人知道任何可能导致此问题的任何事情。
答案 0 :(得分:0)
如果没有类名为“invalid”的元素,则将您的跑步者声明为空数组。但是你的if语句只是检查声明:
if(runner){
}
将永远为真,但没有“无效”元素。因此,dataL.push("Field: " + errName + " - ID: " + errId);
将永远不会在你的for循环中执行,但dataLayer.push
将会执行,因此您将获得errorpush事件而不会出现任何错误。
要解决这个问题,我建议重写你的if语句:
if(runner.length > 0){
}
我希望这能解决你的问题。