Late binding onclick event

前端 未结 2 1009
忘掉有多难
忘掉有多难 2021-01-27 19:22

Following part of my javscript(using jquery).

list = [\'a\', \'b\', \'c\'];
for(var i = 0 ; i< list.length ; i++) {
   $(\"click here\").
          


        
相关标签:
2条回答
  • 2021-01-27 20:01

    You'll need a closure new scope as the iteration finishes before the event handler is triggered, so when the click happens, the loop has finished and i is the last value it's set to, a new scope keeps the value of i local to that scope

    list = ['a', 'b', 'c'];
    
    for(var i=0; i<list.length; i++) {
    
       (function(j) {
    
           $("<a>click here</a>").click(function(){
              foo(list[j]);
           }).appendTo('#sometag');
    
       }(i));
    
    }
    
    function foo(val) {
        console.log(val);
    }
    

    Another option is to add more jQuery

    list = ['a', 'b', 'c'];
    
    $.each(list, function(index, item) {
        $("<a />", {text : 'click here',
                    on   : {
                        click : function() {
                            foo(item);
                        }
                    }
        }).appendTo('#sometag');
    });
    
    function foo(val) {
        console.log(val);
    }
    
    0 讨论(0)
  • 2021-01-27 20:22

    Create a closure to retain the value of i for the particular iteration when the function is executed, without a closure i remains in scope causing all of the created functions to eventually have the value at the last iteration:

    var list = ['a', 'b', 'c'];
    for(var i = 0 ; i< list.length ; i++) {
       var func = createFoo(list[i]);
       $("<a>click here</a>").
          click(func).
          appendTo('#sometag');
    }
    function createFoo(value){
        return function(){
            foo(value);
        };
    }
    function foo(val) {
        console.log(val);
    }
    

    JS Fiddle: http://jsfiddle.net/5dUgw/

    Also note you need to change int to var since this is JS.

    0 讨论(0)
提交回复
热议问题