jQuery插件子函数和setTimeout

时间:2013-09-04 18:44:03

标签: jquery scope settimeout

我为我的网站编写了一个自动完成插件,它接受文件路径和搜索数据,然后发布帖子以获得结果。我意识到的是,我在每个输入的密钥上发布,这并不好。所以我想添加一个超时,只能在最后一个键盘后1秒(或者可能是0.5秒)进行搜索。不幸的是,似乎setTimeout无法找到我的功能,我不知道为什么。 FireBug中的特定错误是“ReferenceError:搜索未定义”。如果我不使用超时,搜索就会被调用。有些帮助解决这个问题(看起来像是范围问题)会很好。

这是我正在努力工作的代码(修剪下来,还有更多)。搜索功能和键盘是重要的部分。一旦我可以使这个工作,我会将setTimeout上方的东西移动到函数中(假设变量通过ok)。显然我必须将setTimeout分配给一个变量,这样我就可以覆盖它,并且在时间过后只调用一次。

jQuery.fn.autocomplete = function (pathOption, sendData) {
function search() {
    console.log(this);
}

var $inputBox = $(this), onWrapper = false;
$inputBox.keyup(function () {
    if ($(this).val().length >= 3 && $(this).val() != $(this).data('placeholder')) {
        $.extend(sendData, { search: $(this).val() });
        $.post(SITEROOT + pathOption, sendData, function (data) {
            if (data.length > 0) {
                $resultsDiv.html(data).slideDown();
            } else $resultsDiv.slideUp();
        });

        setTimeout('search', 1000);
    } else $resultsDiv.slideUp();
});

}

1 个答案:

答案 0 :(得分:2)

更改为使用函数引用而不是字符串:

setTimeout(search, 1000);

您几乎不想使用setTimeout()的字符串。如果您只是使用这样的函数引用,只要该函数在setTimeout()调用的范围内,它就可以工作。


P.S。如果你使用的字符串必须是setTimeout('search()', 1000),那么search函数必须处于全局范围内,这通常是不受欢迎的。避免使用setTimeout()的字符串。使用javascript函数引用(如我的第一个示例中所示)。


仅供参考,如果您想使用setTimeout()来完成这项工作,那么算法通常比您所说的更为复杂。您需要从setTimeout()保存timerID,因此,每次获得按键事件时,您都可以取消之前的计时器并开始新的计时器。然后,在用户暂停键入后,这将发送帖子1秒(此类行为的常用算法)。