在带有变量的循环中调用addEventListener

call addEventListener in loop with variable

本文关键字:调用 addEventListener 循环 变量      更新时间:2023-09-26

我是JavaScript新手。我有6个元素,我想配备非常相似的事件监听器。我有一个可行的暴力解决方案,我想改进它,但(我认为)我在JavaScript闭包方面遇到了麻烦。

工作代码:

  elem = document.getElementById("court1button");
  elem.addEventListener("click", wassern_id1, false);
  elem = document.getElementById("court1xbutton");
  elem.addEventListener("click", abbrechen_id1, false);
  elem = document.getElementById("court2button");
  elem.addEventListener("click", wassern_id2, false);
  elem = document.getElementById("court2xbutton");
  elem.addEventListener("click", abbrechen_id2, false);
  ... 4 more times ...
  function wassern_id1(event) {
    wassern(1, event)
  }
  function wassern_id2(event) {
    wassern(2, event)
  }
  ... 4 more times ...
  function abbrechen_id1(event) {
    abbrechen(1, event)
  }
  function abbrechen_id2(event) {
    abbrechen(2, event)
  }
  ... 4 more times ...
  function wassern(id, event) { ...
  function abbrechen(id, event) { ...

当我发现https://stackoverflow.com/a/2520602/2536029并理解为什么它不能工作。然后我想出了下面的代码,它也不起作用,但现在我不再理解为什么它不起作用了。有人能向我解释一下并帮助我创建工作代码吗?

for (var id = 1; id <= 6; id++) {
  elem = document.getElementById("court" + id + "button");
  elem.addEventListener(
    "click",
    function(id2, event2){ 
      wassern(id2, event2); 
    }(id, event),
    false
  );
  elem = document.getElementById("court" + id + "xbutton");
  elem.addEventListener(
    "click",
    function(id2, event2){ 
      abbrechen(id2, event2); 
    }(id, event),
    false
  );
}

PS:问题是,调用时event未定义

function wassern(id, event) { ... event.stopPropagation();

您需要将事件侦听器机制放入闭包中,在外行闭包中,内部函数的返回值中,您希望您的事件侦听器即使在执行循环或范围结束后也应该存在。

您需要将整个事件或getElementByid包装在闭包中,这是的代码片段

  for (var id = 1; id <= 2; id++) {
     (function(id){
       elem = document.getElementById("court" + id + "button");
       elem.addEventListener(
        "click",
        function(event){wassern(id, event);},
        false
      );
      elem = document.getElementById("court" + id + "xbutton");
      elem.addEventListener(
        "click",
        function(event){abbrechen(id, event);},
        false
      );
    })(id)
  }

对于获取事件,您可以通过此,这是指addEventListner 内的事件

这是jsFiddle代码http://jsfiddle.net/Xtgr4/

希望以上答案对您有意义