【问题标题】:jQuery UI Autocomplete: how do you start an asynchronous process and quit it before it finishesjQuery UI 自动完成:你如何启动一个异步进程并在它完成之前退出它
【发布时间】:2010-12-14 14:02:51
【问题描述】:

我正在使用 jQuery UI Autocomplete 来构建搜索界面。

我已经定义了一个自定义函数,它返回搜索结果并在按下键时自动更新它们,但是,有时这个自定义函数在按下下一个键之前没有完成(即当我已经编写时它仍在处理“Wash” “Washi”(正在写“Washington”的路上)。

我希望每次调用自动完成“源”事件来取消前一个功能(Wash)并启动新功能(Washi)。具有取消呼叫功能(Washi)和启动功能(Washi)等。

这种事情是怎么做到的?

【问题讨论】:

    标签: jquery jquery-ui jquery-ui-autocomplete


    【解决方案1】:

    你应该可以做这样的事情:

    var lastXhr;
    $( "#myAutocomplete" ).autocomplete({
        source: function( request, response ) {
            if (lastXhr) lastXhr.abort();
            lastXhr = $.getJSON( "search.php", request, function( data, status, xhr ) {
                if ( xhr === lastXhr ) {
                    response( data );
                }
            });
        }
    });
    

    lastXhr var 存储最新的 xhr 请求。如果有一组并且调用了源函数,则它会中止 lastXhr 请求并创建一个新请求。当ajax请求返回时,如果确保它与lastXhr匹配,则它不会调用response()函数。

    【讨论】:

    • 有没有办法包装任意函数/对象,使其具有 abort() 方法并以非阻塞方式运行?还是这个技巧只适用于 $.getJSON 包装器?
    • @tjb abort 专用于 ajax 请求。
    • 彼得森,我认为你的答案是正确的,我接受。但是,这是否可行:我将 URL 写成我知道总会成功的东西,然后我编写一个与返回的数据无关但做其他有用的函数的函数。在那种情况下,我是否能够中止(即使函数被阻塞),并以这种方式通过任意函数获得上述功能?
    • 感谢 tjb 提出这个问题(我也想知道同样的事情!),感谢@PetersenDidIt 的这一行,这是我以前从未见过的:if (lastXhr) lastXhr.abort( );
    猜你喜欢
    • 2010-10-11
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多