jQuery回调和延迟动作:范围

时间:2013-10-23 06:48:32

标签: javascript jquery ajax jquery-callback

我正在研究类似自动完成的功能,但不完全相同。主要区别在于ajax返回的匹配值显示在单独div中的列表中(而不是用户键入的输入文本框)。

无论如何,我使用了来自这个SO问题How to delay the .keyup() handler until the user stops typing?的一些代码来延迟工作。本质上,在每个按键上,它们的jQuery事件处理程序调用myDelay(),给它一个运行的函数和一个超时。如果在下一次按键之前超时未到期,则设置为触发的功能将被另一个(以及新超时)替换。

我的问题是我要求延迟的函数是带有成功处理程序的jQuery ajax调用。当我在成功处理程序中更改值时,在父作用域中看不到更改。

这是延迟功能。它存在于全球范围内。

var myDelay = (function () {
    var timer = 0;
    return function (callback, ms){
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
})();

以下是使用延迟的代码:

var mySearch = {
    publicSearch : function () {
        $('#publicSearch').keypress(function () {
            myDelay(function () {
                var list;
                var term = $('#publicSearch input[type=text]').val();
                if (term) {
                    $.getJSON('/search/public', { term : term }, function (data) {

                        // assign some value to `list` here
                    })
                } else {
                    list='Please type a term to search on';
                }
                $('#publicSearch div').html(list);
            }, 1000);
        });
    }
}

在ajax成功处理程序中,我可以将list的值设置为我喜欢的任何值,但不会在父作用域中看到它。当我调用$('#publicSearch div').html(list)时,div的内容被设置为null。

我认为这只是一个范围问题,但我无法解决。

请注意,使用延迟的代码位于mySearch命名空间中。这是因为我有几种不同类型的搜索要构建,我需要一种组织代码的机制。

0 个答案:

没有答案