2012-04-12 89 views
9

我有用戶在輸入時進行ajax調用。問題是,它使呼籲每一個正在鍵入字母,所以我設置超時這樣的:等待功能,直到用戶停止輸入

$(input).live('keyup', function(e){ 

setTimeout(function(){ 

var xx = $(input).val(); 
doSearch(xx); 

}, 400); 

}); 

它等待400毫秒,但然後執行每一個KEYUP。我怎樣才能改變這種做法,使最後輸入的字母后大約400毫秒只發一次'ajax'?

(我用「延遲」在過去,但這並不在所有與我的腳本工作...)你需要每一個新的按鍵時,如復位定時器

+0

已經有其他問題提供的解決方案:https://stackoverflow.com/questions/4220126/run-javascript-function-when-user-finishes-typing-instead-of-on-key-up/16324620 #16324620 – 2016-06-21 07:01:30

回答

18
timer = 0; 
function mySearch(){ 
    var xx = $(input).val(); 
    doSearch(xx); 
} 
$(input).live('keyup', function(e){ 
    if (timer) { 
     clearTimeout(timer); 
    } 
    timer = setTimeout(mySearch, 400); 
}); 

最好是你的功能轉移到一個名爲函數並調用它多次,「導致否則你要創建的是不必要的,

+0

這就像一個魅力:) – Youss 2012-04-12 13:12:13

+0

@Youss和如果你按下並釋放一個鍵,然後再按住另一個鍵會發生什麼? – Alnitak 2012-04-12 13:19:18

+0

@Alnitak,你是對的,還有其他問題,例如當你輸入太慢(兩個鍵之間超過400ms),但在正常情況下,它使事情變得更加平滑 – Gavriel 2012-04-12 13:21:38

4

(function() { 
    var timer = null; 

    $(input).live('keyup', function(e) { 
     timer = setTimeout(..., 400); 
    }); 

    $(input).live('keydown', function(e) { 
     clearTimeout(timer); 
    }); 
)(); 

函數表達式用於確保timer變量的範圍被限制到需要它的這兩個功能。

+0

應該使用'.on('keyup',...)'由於jquery 1.7'.live'已被棄用。 – ZombieCode 2014-09-03 17:44:02

+0

@Ekaterina是的,它可能應該,但這是對OP代碼的最小修改。 – Alnitak 2014-09-03 19:37:22

0

我認爲,相對昂貴的每個KEYUP另一個lambda函數你可能使用delay()再次在這種情況下,只要你沒事爲混合添加一個新的臨時「東西」。這對你有用嗎?

$(input).live('keyup', function(e) { 
    if (!$(input).hasClass("outRunningAJob")) { 
     var xx = $(input).val(); 
     $(input).addClass("outRunningAJob"); 
     doSearch(xx); 
     $(input).delay(400).queue(function() { 
      $(this).removeClass("outRunningAJob"); 
      $(this).dequeue(); 
     }); 
    } 
}); 
+0

似乎是一種解決方法...... @Flöcsy提供的答案更直接。 ps什麼是outRunningAJob :) – Youss 2012-04-12 13:17:04

+0

我個人還沒有對'timeout'功能感到滿意,所以我想也許你是在類似的地方,因爲你在問它。這是一種解決方法嗎?這是我目前如何解決這個問題。如果你現在更熟悉使用'延遲',那麼這可能是更好的解決方案(在可維護性方面)。 'outRunningAJob'只是隨心所欲的自我記錄。很開心你喜歡 :-) – veeTrain 2012-04-12 13:36:21

0

我發現下面的更容易實現:

$(input).on('keyup', function() { 
    delay(function() { 
     if (input).val() !== '' && $(input).val() !== $(input).attr('searchString')) { 
      // make the AJAX call at this time 
      // Store the value sent so we can compare when JSON returns 
      $(input).attr('searchString', $(input).val()); 

      namepicker2_Search_Prep(input); 
     } 
    }, 500); 
}); 

通過存儲當前字符串你能看到用戶已停止打字。然後你可以安全地調用你的函數來做需要處理的事情。