Binding click event handlers in a loop causing problems in jQuery

前端 未结 3 651
一个人的身影
一个人的身影 2021-01-19 14:49

I am trying to run the following code:

I pass parameter to a function, but it always has the value of the last object run through the loop. I read some articles abou

相关标签:
3条回答
  • 2021-01-19 15:26

    It is a scope problem. By the time the event handler function is executed, the value of parentId has changed and is not longer what you expected.

    This can be solved making the original event handler function be returned by another function which, in turn, is passed the value of parentId as argument:

    function getEventHandlerFunction(id){
        return function() {
            alert(id);  // variable found in the closure with the expected value
        };
    }
    
    
    aDisplayCol.bind('click', getEventHandlerFunction(parentId));
    
    0 讨论(0)
  • 2021-01-19 15:41

    Perhaps there's a problem with using parentId in the callback.

    Try alert(parents[i]['PARENT_ID']);.

    EDIT: Let's see if we can get around our scope issues with .data().

    aDisplayCol.data("parentId",parents[i]['PARENT_ID']);
    aDisplayCol.click(function() {
       alert($(this).data('parentId'));
    });
    
    0 讨论(0)
  • 2021-01-19 15:44

    You can avoid the clouseres problems with the eventData parameter of the bind function like this

    var message = 'Spoon!';
    $('#foo').bind('click', {msg: message}, function(event) {
        alert(event.data.msg);
    });
    message = 'Not in the face!';
    $('#bar').bind('click', {msg: message}, function(event) {
        alert(event.data.msg);
    });
    

    this is from the jquery bind api documentation http://api.jquery.com/bind/#passing-event-data

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