2012-10-04 121 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