如何将其他参数传递到事件中

时间:2015-11-14 15:30:58

标签: javascript

我有一系列可点击的链接“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"

我有两个问题:

  1. 如何在每次迭代时将任何内容传递给eventData?例如,如果'iteration',我将如何将其传递给for循环中的eventData?
  2. 我想将迭代号传递给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)。我该怎么做?

2 个答案:

答案 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,
}

fiddle