2012-10-04 118 views
4

我使用jqGrid的篩選器工具欄,其選項searchOnEnter:false。我在字段中輸入一些文本後立即發送請求。在我的應用程序中,最好等待用戶輸入他想要的文本,然後在停止輸入時進行搜索。那麼,在jqGrid中是否可以在請求發送到服務器之前添加延遲?jqGrid搜索延遲

回答

3

這是正確的問題,但jqGrid無法在應用自動搜索之前指定超時。它總是500毫秒。

如果您檢查filterToolbar的源代碼,您會發現使用searchOnEnter選項的the following lines

$("input",thd).keydown(function(e){ 
    var key = e.which; 
    switch (key) { 
     case 13: 
      return false; 
     case 9 : 
     case 16: 
     case 37: 
     case 38: 
     case 39: 
     case 40: 
     case 27: 
      break; 
     default : 
      if(timeoutHnd) { clearTimeout(timeoutHnd); } 
      timeoutHnd = setTimeout(function(){triggerToolbar();},500); 
    } 
}); 

所以你幾乎可以連同默認searchOnEnter: false選項使用相同的代碼,哪些是你需要超時後手動執行的triggerToolbar呼叫。例如,該碼開始的下面fragmant搜索工具欄上的打字後3秒(3000毫秒)的超時之後搜索:

var timeoutHnd, k = $.ui.keyCode, 
    toSkip = [k.TAB, k.SHIFT, k.ALT, k.ESCAPE, k.LEFT, k.UP, k.RIGHT, k.DOWN, k.HOME, k.END, k.INSERT]; 
$grid.jqGrid("filterToolbar", {defaultSearch: "cn"}); 
$grid.closest(".ui-jqgrid-view") 
    .find(".ui-jqgrid-hdiv .ui-search-toolbar input[type=text]") 
    .keydown(function (e) { 
     var key = e.which; 
     if (key === k.ENTER) { 
      return false; 
     } 
     if ($.inArray(key, toSkip) < 0) { 
      if (timeoutHnd) { 
       clearTimeout(timeoutHnd); 
       timeoutHnd = 0; 
      } 
      timeoutHnd = setTimeout(function() { 
       $grid[0].triggerToolbar(); 
       timeoutHnd = 0; 
      }, 3000); 
     } 
    }); 

Here是相應的演示:

enter image description here

修訂:Free jqGrid jqGrid的分支支持autosearchDelay選項(默認值爲500)filterToolbar可以與autosearch: true(默認值)和searchOnEnter: false。因此上述技巧不是必需的。可以使用

$grid.jqGrid("filterToolbar", { 
    searchOnEnter: false, 
    autosearchDelay: 3000 // 3 sec 
}); 
+0

當從服務器獲取數據時,這不起作用。我試過你的代碼,如果使用服務器端數據,它不起作用。儘管如此,如果數據是本地的(就像在你的例子中一樣),這個工作很好。有什麼想法如何改變數據遠程獲取時的延遲? – user2435860

+0

@ user2435860:首先:什麼「不起作用」。秒:你做了什麼,你使用的jqGrid的版本和分支? [免費jqGrid](https://github.com/free-jqgrid/jqGrid)是我開發的分支。它有'filterToolbar'的'autosearchDelay'選項,可以和'autosearch:true'組合使用。因此,您可以使用'{autosearch:true,autosearchDelay:3000}'作爲'filterToolbar'的選項。它適用於任何'datatype'。 – Oleg

+0

你好,我正在使用jqgrid版本4.6。我正在加載數據並使用服務器端處理來處理它,並添加了一個過濾器選項。問題是我不能像你那樣改變setTimeout的延遲。它不適用於來自服務器的數據。我的問題是我處理大量的數據,500ms是不夠的,因爲之後的jqgrid被鎖定,直到獲取新的過濾數據,這將鎖定我的web應用程序。我試圖找到一種方法來停止triggerToolbar(),但直到現在還沒有成功。你有推薦給我嗎? – user2435860