我有这个非常简单的 jQuery 函数:
$(".milestone-in-tree").live({
mouseenter: function() {
setTimeout(
$.ajax({
type: "GET",
url:"/projects/pmnodes/" + $(this).data("pmnode") + "/addbuttons.js"
}),5000)
},
mouseleave: function() {
$(".grid-btn").delay(800).remove();
}
});
我想让它在将 AJAX 请求发送到服务器之前等待 5 秒,但它不会等待,它只是立即发送它。为什么?
更新:
感谢您的所有反馈。我更改了所有答案中建议的功能:
$(".milestone-in-tree").live({
mouseenter: function() {
var node = $(this).data("pmnode")
setTimeout(function() {
$.ajax({
type: "GET",
url:"/projects/pmnodes/" + node + "/addbuttons.js"
}),5000});
},
mouseleave: function() {
$(".grid-btn").delay(800).remove();
}
});
但我仍然没有延迟。有什么我误解了吗?PS:我创建了 node 变量,因为我忽略了一个原因, $(this) 在 SetTimeout 匿名函数中不再可访问。
更新 2
最后,我可以设法得到延迟,但我意识到在延迟之后请求仍然发送到服务器,即使在两者之间触发了 mouseleave 事件......
我可以找到解决方法。这是完全不同的。延迟不再起作用,但是 ajax 请求在 mouseleave 事件中被中止,这是我真正需要的。对于那些可能感兴趣的人,这是代码:
var button_request;
$(".milestone-in-tree").live({
mouseover: function() {
var node = $(this).data("pmnode");
button_request = $.ajax({
type: "GET",
url:"/projects/pmnodes/" + node + "/addbuttons.js"
});
setTimeout(function() {button_request;},5000)
},
mouseleave: function() {
if (button_request) {
button_request.abort();
button_request = null;
}
$(".grid-btn").remove();
}
});
当然 setTimeout 可以删除(因为它不起作用......)但为了清楚起见,我将其保留。
谢谢大家。