1

我为我的网站编写了一个自动完成插件,它采用文件路径和搜索数据,然后发布一个帖子以获取结果。我意识到我在输入的每个键上都张贴,这不好。所以我想添加一个超时,它只会在最后一次键入后 1 秒(或者可能 0.5 秒)进行搜索。不幸的是,setTimeout 似乎找不到我的函数,我不知道为什么。FireBug 中的特定错误是“ReferenceError: search is not defined”。如果我不使用超时,搜索就会被调用。一些帮助解决这个问题(似乎是范围问题)会很好。

这是我试图开始工作的代码(删减,还有更多)。搜索功能和keyup是重要的部分。一旦我可以让它工作,我会将 setTimeout 上方的东西移动到函数中(假设变量通过正常)。显然我必须将 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();
});

}

4

1 回答 1

2

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

setTimeout(search, 1000);

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


PS 如果您使用的字符串必须是setTimeout('search()', 1000),那么该search函数必须在全局范围内,这通常是不可取的。避免使用带有setTimeout(). 请改用 javascript 函数引用(如我的第一个示例)。


仅供参考,如果你想用它setTimeout()来完成这项工作,那么算法通常比你说明的要复杂。您需要从中保存 timerID setTimeout(),每次获得关键事件时,您都可以取消前一个计时器并启动一个新计时器。这将在用户暂停输入 1 秒后发送帖子(这种行为的常用算法)。

于 2013-09-04T18:50:38.353 回答