大家好 我将一个AJAX请求延迟3秒,然后用响应更新一个div。但我面临的问题是,当用户同时点击所有三个链接时,请求的内容会在div中不断更新。我想要做的是,只提供最后点击的ajax请求内容,但不应该中止以前的请求。有什么方法可以实现吗?提前致谢
$('.links li a').click(function(event){
event.preventDefault();
var getUrl = $(this).attr("href");
var printCall = function() {
$.ajax({
url: getUrl,
type: "GET",
beforeSend: function() { },
error: function(request){ alert(request) },
success: function(data) { $('#graphContent').html(data); }
});
};
setTimeout(printCall, 3000);
});
<ul>
<li><a href="http://localhost/test.php">Link 1</a></li>
<li><a href="http://localhost">Link 2</a></li>
<li><a href="index.html">Link 3</a></li>
</ul>
答案 0 :(得分:3)
你需要:
对于第一项,可以通过使用带有setTimeout()返回的ID的clearTimeout()来取消超时函数调用......非常简单。至于第二点,您可以通过为每个调用加时间戳并将成功函数包含的timestamp变量的值与最后一次单击调用的时间戳进行比较来实现。
见下文:
// A tracker object outside the scope of all click functions
var pendingCall = { timeStamp: null, procID: null };
$('.links li a').click(function (e) {
e.preventDefault();
var getUrl = $(this).attr("href");
// A timestamp for this call
var timeStamp = Date.now();
var printCall = function () {
$.ajax({
url: getUrl,
type: "GET",
beforeSend: function () { },
error: function (request) { alert(request) },
success: function (data) {
// Short-circuit execution if the timestamp on this call doesn't match the last one made
if (pendingCall.timeStamp != timeStamp) { return false; }
// The action to take
$('#graphContent').html(data);
// Clear the reference to this timeout call
pendingCall.procID = null;
}
});
};
// Clear the timeout on the last call made if it exists
if (pendingCall.procID) {
clearTimeout(pendingCall.procID)
};
// Update the timeout call tracker
pendingCall = { timeStamp: timeStamp, procID: setTimeout(printCall, 3000) };
});