如何避免在 keyup 事件上连续 ajax 请求的开销
How to avoid overhead of continuous ajax request on keyup event?
例如,在搜索表单中,当用户输入一些文本时,此时,AJAX请求应该在每个keyup事件上发送,搜索键作为查询字符串。搜索键将是输入框中的值。
如果用户输入"ABCD",在这种情况下,前 3 个 AJAX 请求应该被终止/取消,因为在第 4 个 AJAX 请求中搜索键将是"ABCD"
$(document).ready(function(){
$("#searchInput").keyup(function(){
ajaxSearch( $("#searchInput").val() );
});
});
在 keyup 事件上,我调用了以下"ajaxSearch()"函数。
function ajaxSearch(searchKey) {
$.ajax({
type: "get",
url: "http://example.com/ajaxRequestHandler/",
data: "action=search&searchkey=" + searchKey
}).done(function() {
/* process response */
});
}
var request;
function ajaxSearch(searchKey) {
/* if request is in-process, kill it */
if(request) {
request.abort();
};
request = $.ajax({
type: "get",
url: "http://example.com/ajaxRequestHandler/",
data: "action=search&searchkey=" + searchKey
}).done(function() {
/* process response */
/* response received, reset variable */
request = null;
});
}
为了避免多个 ajax 请求;我们可以参考并实现 David Walsh 博客文章中提到的去抖动函数。它从Underscore.js中获得了一些关于去抖动函数实现的深刻见解。去抖动功能只会每几分之一秒触发一次,而不是在触发后触发。它肯定有助于限制连续的网络请求。
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
var ajaxSearch = debounce(function(searchKey) {
//send an AJAX network request.
$.ajax({
type: "get",
url: "http://example.com/ajaxRequestHandler/",
data: "action=search&searchkey=" + searchKey
}).done(function() {
/* process response */
});
//250 indicates the minimum time interval between the series of events being fired
}, 250);
$("#searchInput").keyup(function(){
ajaxSearch($("#searchInput").val());
});
随着Atul Bhosale的回答,当用户输入"ABCD"时,仍然有四个请求。这只是服务器的打字速度和响应时间的问题。
最好使用超时。在这种情况下,如果用户键入"完成/超时",则仅发送请求:
$("#searchInput").keyup(function(){
var value = $(this).val();
setTimeout( function() { ajaxSearch(value) }, 300 );
});
只需玩弄超时。对我来说,300ms很好...
相关文章:
- ajax请求的顺序总是不同的
- 从ajax请求中获取javascript对象
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- JavaScript代码未正确检查ajax请求
- "日期“;AJAX请求返回的类型值未定义
- 在等待ajax请求时显示微调器并禁用页面
- 跨域ajax请求
- Ajax请求返回空的数据字符串,但首先得到了正确的数据
- Javascript-如何让脚本与Ajax请求的数据一起运行
- ajax请求成功,但可以'我看不到我的数据
- 如何将给定的curl命令复制为jquery ajax请求
- 为什么我能够从javascript控制台发送跨域ajax请求
- 一台特定计算机的Ajax请求数据未定义/失败
- 获取ajax请求的请求头
- 原型Ajax请求参数为嵌套json
- 可以't从AJAX请求中筛选数据
- jQuery Mobile Collapse上的AJAX请求
- 暂停函数执行流程,直到ajax请求完成