JQueryUI自动完成如何处理异步结果
How does JQueryUI Autocomplete handle asynchronous results?
我很难理解JQueryUI的自动完成函数如何处理导致异步结果的重复按键。我需要一些功能类似的东西,但我无法正确获得自动完成的结果。示例:
$(document).ready(function() {
$('#textinput').live('keyup', function() {
$.get('bacon.php', function(data) {
$('#holder').html(data);
});
});
});
问题是,如果快速键入,结果往往不会按正确的顺序返回。如果我键入单词"KEY",我可能会得到"K"、"KEY"answers"KE"的结果,从而混淆#holder的内容。我注意到JQueryUI自动完成没有这个问题,但我不明白它是如何处理的。
我还没有查看jQuery关于这个特定问题的自动完成功能,但我对自定义自动完成脚本所做的是,如果在特定时间内按下了另一个键,我会中止XHR请求。类似这样的东西:
var xhr, throttle;
$('.autocomplete').keyup(function() {
var $this = $(this);
if (throttle)
clearTimeout(throttle); // Clear the previous request
xhr.abort(); // Abort the last XHR request
throttle = setTimeout( function() {
xhr = $.getJSON('autocomplete.php', { data: $this.val() }, function(data) {
// do something with response
});
}, 250); // wait 250 milliseconds before running this
});
基本上,节流阀确保我们在发送请求之前等待250毫秒,以防用户仍在键入(您可以将其设置为任何值)。"xhr"变量将XMLHttpRequest保存在一个变量中,如果我们得到另一个按键,而响应还没有返回,那么我们中止前一个按键的操作,确保只有最新的一个按键返回响应。
希望能有所帮助。
祝你好运:)
我只是在做一些非常相关的事情。一个简单的"延迟"API,用于将函数转换为延迟委托。
Function.prototype.delayed = function(ms, reset)
{
var timeout;
var fn = this;
return function()
{
var args = arguments;
var scope = this;
if (reset && timeout) clearTimeout(timeout);
timeout = setTimeout(function() { fn.apply(scope, args) }, ms);
};
};
样品使用见小提琴。
在你的情况下,它会像这个
$(document).ready(function() {
$('#textinput').live('keyup', (function() {
$.get('bacon.php', function(data) {
$('#holder').html(data);
});
}).delayed(300, true));
});
遇到了完全相同的问题,并偶然发现了Addy Osmani提到的代理模式。
我认为它与实时观测者事件更相关
$( "button" ).on( "click", function () {
setTimeout( $.proxy( function () {
// "this" now refers to our element as we wanted
$( this ).addClass( "active" );
}, this), 500);
});
希望对有所帮助
相关文章:
- 如何处理异步获取的数据
- 直接 Web 远程处理异步问题
- ExtJs 处理异步调用
- 处理异步函数
- 使用Canvas和ForEach处理异步调用
- window.set同步处理异步调用的超时
- 在应用程序框架中处理异步 Javascript 代码的最佳实践
- Redux - 智能组件 - 在挂载组件之前如何处理异步操作
- 节点.js处理异步
- 余烬集成测试错误.处理异步副作用
- 如何在JS socket.io聊天中处理异步用户数据
- 如何在JavaScript中处理异步函数结果
- 如何在 node.js 中处理异步应用程序中的模块
- 处理异步加载的函数中的无限循环
- 如何处理异步函数和集合
- 使用Ramda处理异步编程
- 在服务器端的节点中处理异步响应
- JQueryUI自动完成如何处理异步结果
- 如何使用JS承诺处理异步调用
- 在Node.js中处理异步循环的最佳模式