私はこの非常に単純な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: ノード変数を作成したのは、無視する理由により、SetTimeout 匿名関数内で $(this) にアクセスできなくなったためです。
更新 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 は削除できますが (機能しないため...)、わかりやすくするために残します。
みんな、ありがとう。