2013-06-29 19 views
0

我有一些代码循环遍历每个id并添加一个字符计数处理程序。因为我需要将id变量传递给处理函数,所以我需要使用这个匿名函数event.data.param1。添加处理程序时,因为他们被延迟,所以处理程序需要有做什么,它需要做之前超时如何通过两个嵌套匿名函数(事件处理程序与超时)传递变量

$('#comment_editor' + id).on("click dbclick mousedown mousemove mouseover mouseout mouseup keydown keypress keyup blur change focus select", {param1: id}, 
function (event) { 
    comment_change(event.data.param1); 
}); 

粘贴和剪切需要一个修复。同样,我需要将id变量传递给处理程序,但是我还需要通过超时。我设置了它,但它不起作用。

$('#comment_editor'+updates[i][0]).on("paste cut", {param1:id}, 
    function (event) { 
     setTimeout(
      function (event) { 
       comment_change(event.data.param1); 
      }, 1); 
    } 
); 
} 

我怎样才能得到过去/剪切处理程序接受id变量?

+1

,但你没有在第二一段代码传递数据... – Musa

回答

3

尝试从功能PARAM删除event您发送超时:

$('#comment_editor' + id).on("paste cut", 
    function (event) { 
     setTimeout(
      function() { 
       comment_change(event.data.param1, id); 
      }, 1); 
    } 
); 

这样,你event从外部封闭将“继承”。

+0

完美的作品。我想我必须将该变量传递给超时函数,但我猜不是。 – user1755043

1

您不能在for内部引用id,因为当处理程序将被执行时,id将始终引用循环内部处理的最后一个值。

因此应该将处理程序创建移动到另一个方法,如getHandlerFor(id)。通过这种方式,您可以将每个id与该方法的上下文绑定在一起,并且您可以直接从函数内引用id

,如:

var getHandlerFor = function (id) { 
    return function (event) { 
     setTimeout(
      function() { 
       // use id without worries, since it has been bound to the context of this method. 
       comment_change(event.data.param1); 
      }, 1); 
    }; 
}; 

/* ... */ 

for(var id in ids){ 
    $('#comment_editor' + id).on("paste cut", getHandlerFor(id)); 
} 
+0

OP_can_引用for循环中的'id',因为他或她正在使用它的方式在被绑定的事件处理函数中根本没有使用。这就是设置“{param1:id}”数据的关键。你显示的代码将不起作用,因为它仍然在处理程序中引用'event.data.param1',但是你已经将该参数移除到设置数据的'.on()'。 – nnnnnn

相关问题