jQuery UI 自动完成:你如何启动一个异步进程并在它完成之前退出它

Posted

技术标签:

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

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

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

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

这种事情是怎么做到的?

【问题讨论】:

【参考方案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( );

以上是关于jQuery UI 自动完成:你如何启动一个异步进程并在它完成之前退出它的主要内容,如果未能解决你的问题,请参考以下文章

jQuery UI 自动完成:如何让 TAB 选择列表中的第一个选项?

jQuery 输入选择器

如何在引导侧导航顶部显示 jQuery-ui 自动完成?

如何使用 KnockoutJS 和 JQuery UI 创建自动完成组合框

如何在 JQuery UI 自动完成中添加一个 html 元素?

如何从 onchange 事件外部获取 jQuery UI 自动完成值?