我有一系列可点击的链接“btns”
function eventData(e) {
dataLayer.push({
'event': 'home_cta',
'iteration': i, // HERE. I WANT TO ADD WHICH ELEMENT INDEX WITHIN THE FOR LOOP HERE
'gtm.element': e.target,
'gtm.elementClasses': e.target.className || '',
'gtm.elementId': e.target.id || '',
'gtm.elementTarget': e.target.target || '',
'gtm.elementUrl': e.target.href || e.target.action || '',
'gtm.originalEvent': e
});
eventData函数在这里:
var somevar = "bla"
我有两个问题:
'iteration'
,我将如何将其传递给for循环中的eventData?string getClientIp(ssh_session session) {
struct sockaddr_storage tmp;
struct sockaddr_in *sock;
unsigned int len = 100;
char ip[100] = "\0";
getpeername(ssh_get_fd(session), (struct sockaddr*)&tmp, &len);
sock = (struct sockaddr_in *)&tmp;
inet_ntop(AF_INET, &sock->sin_addr, ip, len);
string ip_str = ip;
return ip_str;
}
属性中突出显示了这一点。因此,我想在每次迭代时得到1到6之间的数字(因为变量“btns”的长度为6)。我该怎么做?答案 0 :(得分:4)
这将涉及IIFE(立即调用的函数表达式):
for (var i = 0; i < btns.length; i++) {
(function(somevar, i) {
btns[i].addEventListener('click', function(e) {
eventData(e, somevar, i);
}, false);
})(somevar, i);
}
addEventListener
只将一个参数和一个参数传递给它的回调,
所以你必须“手动”调用你的eventData
功能。
(注意,没有(function() { ... })()
,每个事件监听器
将btns.length
作为i
的值传递给他们。)
为了更多地解释IIFE,这是你基本上做的事情:
var f = function(somevar, i) {
// ...
};
f(somevar, i);
也就是说,你正在创建一个函数并立即调用它(因此
名称)。同样,这样做是为了i
(和somevar
的价值
对于适当的迭代,保持相同的变化。
答案 1 :(得分:0)
您还可以使用.bind()
来修复&#34;当前索引的绑定函数的第一个参数。
for (var i=0; i<btns.length; i++ ) {
btns[i].addEventListener('click',
// <this> in the function will be the clicked button (as usual)
// but the first passed parameter would be the current iteration step <i>
eventData.bind(btns[i], i),
false);
}
function eventData(iteration, e) {
//...
'iteration': iteration,
}