我有一个输入框,每次按键都有一个ajax请求。所以,如果我输入“name”字样,将会有4个成功的请求。所以我实际上只想要执行的最新请求。所以如果我输入“name”这个词,那么只有一个请求将是最后一个请求。
我也有一个解决方案(这是一个简单的点击方法示例)
JS脚本
var callid = 1;
function ajaxCall (checkval ){
if(checkval == callid){
$.ajax({
type: 'post',
url: baseurl + "test/call_ajax",
data: {
val: "1"
},
success: function(data) {
console.log(data)
}
});
}
}
function call(){
var send = callid+=1;
setTimeout( function(){ ajaxCall(send) } , 500);
}
html脚本
<a href="#" onclick="call()" > Call ajax </a>
这很完美。但我认为如果有办法进一步完善它。
任何想法:)
答案 0 :(得分:4)
我相信你正在为事件调度寻找一些更好的意图技术。
var eventDispatcher = null;
$('.textbox').keyup(function(){
if(eventDispatcher) clearTimeout(eventDispatcher);
eventDispatcher = setTimeout(function(){
$.ajax({ ... });
}, 300);
});
答案 1 :(得分:3)
你可以在setTimeout中做你的ajax。因此,您无需声明和检查其他变量或编写其他函数,如call()
$(document).ready(function () {
var timer;
$('#fillMe').keypress(function () {
clearTimeout(timer);
timer = setTimeout(function () {
//replace this with your ajax call
var content = $('#fillMe').val();
$('#result').text('You will only see this if the user stopped typing: ' + content);
}, 1000); // waits 1s before getting executed
});
});
<input type="text" id="fillMe">
<div id="result"></div>
在每个按键事件中,这会清除超时并立即创建新的超时。这意味着只有当用户停止键入至少1秒钟时才会执行setTimeout函数的内容。 当然,1秒只是示例目的的值。您可以将其更改为您想要的任何内容,或者认为这是一个美好的时光(如500毫秒)
查看我的jsfiddle
答案 2 :(得分:1)
setTimeout返回一个id,您可以存储并使用它来清除以前设置的计时器:
var timerId;
function call() {
if (timerId !== undefined) {
clearTimeout(timerId);
}
timerId = setTimeout( function() { ajaxCall(send) }, 500);
}
结果应该是在输入最后一个字母后500ms调用ajaxCall方法。