【问题标题】:call addEventListener in loop with variable使用变量在循环中调用 addEventListener
【发布时间】:2013-08-09 22:18:45
【问题描述】:

我是 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();

【问题讨论】:

    标签: javascript dom-events addeventlistener


    【解决方案1】:

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

    您需要将整个事件或getElementByid 包裹在闭包内,这里是代码 sn -p

      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/

    希望以上答案对你有意义

    【讨论】:

    • 传递实际的 MouseEvent。如果您编辑答案以包含该内容,我可以接受。
    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多