我有一些代码循环遍历每个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
变量?
答案 0 :(得分:3)
尝试从发送到超时的函数参数中删除event
:
$('#comment_editor' + id).on("paste cut",
function (event) {
setTimeout(
function () {
comment_change(event.data.param1, id);
}, 1);
}
);
这样你的event
将从外部封闭中“继承”。
答案 1 :(得分: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));
}