循环遍历全局数组并将事件侦听器添加到文档
Looping through a global array and adding event listener to document
我确定这是一个作用域或迭代器闭包问题,但我无法让它工作。如果这是一个非常明显的修复,请提前致歉。
这是 GTM 中的自定义 HTML 标签。这个想法是监听 WPCF7(WordPress Contact Form 7)表单提交事件并将相应的事件推送到 GTM dataLayer。
//Event listener array
var listeningEvents = [
["wpcf7mailsent","CF7formSubmitAndSent"], //Mail sent successfully
["wpcf7submit","CF7formSubmit"], //Form submitted
["wpcf7spam","CF7formSpam"], //Form spam
["wpcf7invalid","CF7formInvalid"], //Form invalid
["wpcf7mailfailed","CF7formMailFail"] //Form fail
];
//Loop through event listener array & action
for( var i = 0; i < listeningEvents.length; i++){
document.addEventListener( listeningEvents[i][0],
(function(i, event, listeningEvents) {
dataLayer.push({
'event' : listeningEvents[i][1]
});
})()
);
}
我在 dataLayer.push 之前一直在使用 console.log 进行调试。 addEventListener 中的 listeningEvents[i][1] 未定义。
我已经尝试遵循这里的一些建议:
https://www.pluralsight.com/guides/javascript-callbacks-variable-scope-problem
但我一直收到未定义的错误。
实在不想单独添加事件监听5次了。我真的希望能够扩展事件侦听器列表以供将来维护。
[编辑]
我想我在这里找到了一个可行的解决方案:
https://arstechnica.com/civis/viewtopic.php?f=20&t=138763
var stuff = ['a', 'b', 'c'];
for(var i=0; i<stuff.length; i++)
{
var closureMaker = function(line) {
return function(event){ alert(line); };
};
var closure = closureMaker( stuff[i] );
addEventListener('click', closure, false);
}
$i 不再是我的问题 - 它正在从 addEventListener 内部访问我的全局数组。
我在您的代码中看到的唯一问题是 "i" 是函数中的一个参数。
不要在内部直接访问"i",而是将其作为函数参数传递,如下所示。
如果直接访问"i",由于闭包问题,会得到"i"的最后一个值。
for( var i = 0; i < listeningEvents.length; i++){
document.addEventListener( listeningEvents[i][0],
(function(i, event, listeningEvents) {
dataLayer.push({
'event' : listeningEvents[i][1]
});
})(i)
);
}
我想我在这里找到了一个可行的解决方案:
https://arstechnica.com/civis/viewtopic.php?f=20&t=138763
var stuff = ['a', 'b', 'c'];
for(var i=0; i<stuff.length; i++)
{
var closureMaker = function(line) {
return function(event){ alert(line); };
};
var closure = closureMaker( stuff[i] );
addEventListener('click', closure, false);
}
$i 不再是我的问题 - 它正在从 addEventListener 内部访问我的全局数组。
我确定这是一个作用域或迭代器闭包问题,但我无法让它工作。如果这是一个非常明显的修复,请提前致歉。
这是 GTM 中的自定义 HTML 标签。这个想法是监听 WPCF7(WordPress Contact Form 7)表单提交事件并将相应的事件推送到 GTM dataLayer。
//Event listener array
var listeningEvents = [
["wpcf7mailsent","CF7formSubmitAndSent"], //Mail sent successfully
["wpcf7submit","CF7formSubmit"], //Form submitted
["wpcf7spam","CF7formSpam"], //Form spam
["wpcf7invalid","CF7formInvalid"], //Form invalid
["wpcf7mailfailed","CF7formMailFail"] //Form fail
];
//Loop through event listener array & action
for( var i = 0; i < listeningEvents.length; i++){
document.addEventListener( listeningEvents[i][0],
(function(i, event, listeningEvents) {
dataLayer.push({
'event' : listeningEvents[i][1]
});
})()
);
}
我在 dataLayer.push 之前一直在使用 console.log 进行调试。 addEventListener 中的 listeningEvents[i][1] 未定义。
我已经尝试遵循这里的一些建议: https://www.pluralsight.com/guides/javascript-callbacks-variable-scope-problem
但我一直收到未定义的错误。
实在不想单独添加事件监听5次了。我真的希望能够扩展事件侦听器列表以供将来维护。
[编辑]
我想我在这里找到了一个可行的解决方案: https://arstechnica.com/civis/viewtopic.php?f=20&t=138763
var stuff = ['a', 'b', 'c'];
for(var i=0; i<stuff.length; i++)
{
var closureMaker = function(line) {
return function(event){ alert(line); };
};
var closure = closureMaker( stuff[i] );
addEventListener('click', closure, false);
}
$i 不再是我的问题 - 它正在从 addEventListener 内部访问我的全局数组。
我在您的代码中看到的唯一问题是 "i" 是函数中的一个参数。
不要在内部直接访问"i",而是将其作为函数参数传递,如下所示。
如果直接访问"i",由于闭包问题,会得到"i"的最后一个值。
for( var i = 0; i < listeningEvents.length; i++){
document.addEventListener( listeningEvents[i][0],
(function(i, event, listeningEvents) {
dataLayer.push({
'event' : listeningEvents[i][1]
});
})(i)
);
}
我想我在这里找到了一个可行的解决方案: https://arstechnica.com/civis/viewtopic.php?f=20&t=138763
var stuff = ['a', 'b', 'c'];
for(var i=0; i<stuff.length; i++)
{
var closureMaker = function(line) {
return function(event){ alert(line); };
};
var closure = closureMaker( stuff[i] );
addEventListener('click', closure, false);
}
$i 不再是我的问题 - 它正在从 addEventListener 内部访问我的全局数组。