3

我试图使用闭包将 onKeyUp 事件分配给表单中的所有输入。该数组fields包含需要分配给它们的事件的所有字段名称。该数组包含需要 ajax 验证ajaxFields的字段名称(来自数组)。fields

function createEvents(fields,ajaxFields) {
    for(var x=0;x<fields.length;x++) {

        $('input[name='+fields[x]+']').keyup(function(field) { 
        //assign an onKeyUp event
            return function() {
                //some code using variable 'field' and array 'ajaxFields'
        }(fields[x]));
    }
}

我希望在用户完成输入该字段后的一秒钟执行 onKeyUp 函数,每次按键启动时都会插入(onKeyUp)。这将节省大量的处理空间,更不用说 ajax 调用了。到目前为止,我正在使用这个:

clearTimeout(timer);
timer = setTimeout('validate()' ,1000);

您可能已经注意到该函数validate()不存在,那是因为我不知道如何将闭包包装在命名函数中,我什至不确定我是否应该...

那么我该怎么做呢?

编辑:这是一个当前的小提琴

4

2 回答 2

2

您可以(并且应该)将函数传递给setTimeout而不是字符串。

clearTimeout(timer);
timer = setTimeout(function(){
    // your code here
}, 1000);

所以,在你的keyup,尝试这样的事情:

$('input[name='+fields[x]+']').keyup(function(field) { 
//assign an onKeyUp event
    return function() {
        var that = this,
            $this = $(this);
        clearTimeout($this.data('timeout'));
        $this.data('timeout', setTimeout(function(){
            //some code using variable 'field' and array 'ajaxFields'
            // "this" will not be your element in here, make sure to use "that" (or "$this")
        }, 1000));
    };
}(fields[x]));

我将超时保存在 中$this.data,这样每个元素都可以有自己的超时,而不是使用全局变量。

更新演示:http: //jsfiddle.net/Z43Bq/3/

于 2012-05-14T18:45:24.740 回答
1

这就是你的代码应该是这样的:

var timer;

$(document).ready(function() {
    var fields = $('.field');
    var ajaxFields = $('.ajax-field');

    createEvents(fields, ajaxFields);
});

function createEvents(fields,ajaxFields) {
    // Use jQuery's "foreach" method
    $(fields).each(function(inx, field) {
        // Bind the listener here
        $(field).keyup(function(ev) {
            // Clear timeout if necessary
            if (timer != null) clearTimeout(timer);

            // Set the timeout
            timer = setTimeout(function() {
                // Your code should here

                console.log('Fields: ', fields, '\nAjax Fields: ', ajaxFields, '\nTHE field: ', field);
            }, 1000);
        });
    });
}

还要检查工作代码的小提琴:http: //jsfiddle.net/BLyhE/

于 2012-05-14T18:47:52.167 回答