代码之家  ›  专栏  ›  技术社区  ›  TheLovelySausage

带事件和绑定变量的javascript addEventListener

  •  0
  • TheLovelySausage  · 技术社区  · 7 年前

    我正忙于动态地为某些按钮分配函数,我遇到了一个奇怪的问题,我完全被它难住了。

    为了演示,我有以下简单的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);
    }
    

    分别地,它们都工作得很好,但是我很难在bind函数中传递事件参数。

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


    更新

    这似乎是一个可能的解决办法,尽管我不知道如何诚实

    同一个循环

    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);
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Prakash Sharma    7 年前

    forEach

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