我有一個文本欄位,我通過檢查資料庫中的匹配數來回應輸入,但是如果用戶快速鍵入幾個字符,我不想無緣無故地用太多查詢來打擊資料庫。
在網上搜索,建議似乎是將其全部包裝在 中setTimeout(),但我顯然不明白如何正確使用它。這是我目前的代碼:
$(".qs-text").keyup(function() {
if ($(this).val().length > 2) {
setTimeout(function() {
$.get("ajax_request.php?req=Quicksearch&qs=" $(".qs-text").val(), function(data) {
$('.qs-hits').text(data);
});
}, 500);
} else {
$('.qs-hits').text('-');
}
});
它確實等待了 500 毫秒,并且在超時期限結束時,它確實使用了請求中欄位的最終狀態 - 很好。
但是,它會發送多個相同的請求(我輸入的每個字符一個)而不是一個。這違背了首先設定超時的目的。我幾乎可以理解為什么代碼會這樣做,因為keyup每次都會觸發事件,但我不知道如何解決它。還有其他問題的標題聽起來像我要問的問題,但我讀過的每個問題都大不相同,以至于我無法將其中任何一個完全應用到我的案例中。
uj5u.com熱心網友回復:
創建新時需要取消超時。
var timeout = null;
$(".qs-text").keyup(function() {
if(timeout != null) clearTimeout(timeout);
if ($(this).val().length > 2) {
timeout = setTimeout(function() { $.get("ajax_request.php?req=Quicksearch&qs=" $(".qs-text").val(), function(data) {
$('.qs-hits').text(data);
}); },500);
} else {
$('.qs-hits').text('-');
}
});
uj5u.com熱心網友回復:
我們通常將超時存盤在變數中,然后在呼叫新超時時有條件地清除它。但是對于大型 Web 應用程式,我建議使用 Web 套接字進行此類后續呼叫以獲得實時體驗
var timer;
$(".qs-text").keyup(function() {
if ($(this).val().length > 2) {
clearTimeout(timer);
timer = setTimeout(function() {
$.get("ajax_request.php?req=Quicksearch&qs=" $(".qs-text").val(), function(data) {
$('.qs-hits').text(data);
});
}, 500);
} else {
$('.qs-hits').text('-');
}
});
uj5u.com熱心網友回復:
我建議使用 lodash 之類的東西進行去抖動,這樣你就可以做這樣的事情
$(".qs-text").keyup(function() {
_.debounce(()=> {
$.get("ajax_request.php?req=Quicksearch&qs=" $(".qs-text").val(), function(data) {
$('.qs-hits').text(data);
})
}, 500)
});
有關更多資訊,請訪問 https://lodash.com/docs/4.17.15#debounce
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/326296.html
標籤:javascript 查询 阿贾克斯
