2012-10-31 100 views
6

我試圖使用UnderscoreJS和它的_.debounce()方法來停止一個回調函數重複觸發keyup事件。我這樣做是因爲每次你開始輸入時,AJAX呼叫都會被激活,因此打電話給你輸入的每個字符都會非常昂貴(:使用下劃線的_.debounce()方法

這是我如何使用該方法:

onTypeEvents : function(selector, callback) { 
     return $(selector).on('keyup', function(event){ 

      var that = $(this).val().trim(); 

      switch(event.keyCode) { 
       case 8: 
        if(that !== '') { 
         if(that.length >= 2) { 
          return _.debounce(function() { callback.apply(that, [ that ]) }, 150); 
         } else { 
          return _.debounce(function() { callback.apply(null, [ null ]) }, 150); 
         }; 
        }; 
        break; 
       case 9: 
        break; 
       case 13: 
        break; 
       case 27: 
        break; 
       case 37: 
        break; 
       case 38: 
        break; 
       case 39: 
        break; 
       case 40: 
        break; 
       default: 
        if(that !== '') { 
         if(that.length >= 2) { 
          return _.debounce(function() { callback.apply(that, [ that ]) }, 150); 
         } else { 
          return _.debounce(function() { callback.apply(null, [ null ]) }, 150); 
         }; 
        }; 
        break; 
      }; 

      event.preventDefault(); 
      event.stopPropagation(); 
     }); 
    }, 

但很顯然,這是行不通的,因爲沒有什麼是生火了,但如果我的方法去掉我的代碼工作得很好(?:那麼有什麼可以去錯在那裏我是不是做錯了還是我我錯過了什麼?

回答

16

這個想法是去掉keyup回調本身。這樣,你的代碼只會響應用戶在停止輸入前輸入的最後一個鍵。類似於:

$(selector).on('keyup', _.debounce(function (e) { 
    switch (e.keyCode) { 
    /* your code */ 
    } 
}, 500)); 
+0

如果您只想刪除特定的密鑰代碼,該怎麼辦? switch語句中的debounce調用(如'_.debounce(myFunction,100);')似乎不起作用,'myFunction'永遠不會調用 – zok

+0

ok了:https://stackoverflow.com/questions/24306290/lodash反跳 - 不工作,在匿名函數 – zok