【问题标题】:JavaScript addEventListener with Event and Binding a variable带有事件和绑定变量的 JavaScript addEventListener
【发布时间】:2019-07-01 22:23:12
【问题描述】:

我正忙于尝试为某些按钮动态分配功能,但遇到了一个让我非常困惑的奇怪问题。

我有以下简单的 HTML 用于演示目的

<div id="butts">
   <button>BUTT 01</button>
   <button>BUTT 02</button>
</div>

现在我正在使用带有以下循环(包括事件)的 JavaScript 为这些按钮分配功能

var butts = $("#butts").find("button");
for(var cnt = 0; cnt < butts.length; cnt ++) {

   // get button description just for testing
   var buttonDesc = $(butts[cnt]).text();

   // EVENT
   butts[cnt].addEventListener (
      "click", function(event) {
         funcEvent(event)
      }
   );

}

调用一个非常简单的测试函数来验证它是否工作

function funcEvent(event) {
   console.log("funcEvent");
   console.log(event);
}

这工作正常,但我还需要将一个变量传递给我通常会执行如下操作的函数

var butts = $("#butts").find("button");
for(var cnt = 0; cnt < butts.length; cnt ++) {

   // get button description just for testing
   var buttonDesc = $(butts[cnt]).text();

   // BIND
   butts[cnt].addEventListener (
      "click", funcBind.bind(this, buttonDesc)
   );

}

另一个非常简单的测试函数

function funcBind(buttonDesc) {
   console.log("funcBind");
   console.log(buttonDesc);
}

分别他们都工作得很好,但我很难在绑定函数中传递事件参数

我正在尝试将两者结合起来,以便我可以调用一个可以同时接收事件和参数的函数


更新

这似乎是一个可能的解决方案,虽然我不明白如何诚实

同一个循环

var butts = $("#butts").find("button");
for(var cnt = 0; cnt < butts.length; cnt ++) {

   // get button description just for testing
   // using var did not work (always last element of array)
   // var buttonDesc = $(butts[cnt]).text();
   let buttonDesc = $(butts[cnt]).text();

   // EVENT
   butts[cnt].addEventListener (
      "click", function(event) {
         funcEventBind(event, buttonDesc);
      }
   );

}

调用一个非常简单的测试函数来验证它是否工作

function funcBindEvent(event, buttonDesc) {
   console.log("funcEvent");
   console.log(event);
   console.log(buttonDesc);
}

【问题讨论】:

    标签: javascript scope arguments actionlistener


    【解决方案1】:

    您需要创建一个闭包,以便偶数处理程序回调包含上下文。您可以像这样使用forEach 来做到这一点

    butts.forEach(function(bt) {
      var buttonDesc = $(bt).text();
    
       // BIND
       bt.addEventListener (
          "click", function(event){
              funcBind(event, buttonDesc)
           }
       );
    })
    

    【讨论】:

    • 我确实尝试过,但 buttonDesc 变量始终是循环中的最后一个描述,所以我认为它没有正确绑定
    • @Trent 您是否使用forEach 函数(而不是 for 循环),正如我在回答中描述的那样?
    • 不,它告诉我 butts.forEach 不是函数
    • @Trent 你在forEach 之前添加了var butts = $("#butts").find("button"); 行,对吧?
    • @Trent let 之所以有效,是因为它与var 不同,它是块作用域。我没有建议 let 解决方案,因为在循环内创建函数通常不是一种好的做法。
    猜你喜欢
    • 2017-03-05
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多