如何通过两个嵌套的匿名函数(带超时的事件处理程序)传递变量

时间:2013-06-29 22:47:51

标签: javascript jquery javascript-events

我有一些代码循环遍历每个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变量?

2 个答案:

答案 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));
}