2011-02-11 83 views
2

当我每页显示少量时,它很快且非常好。当我将它增加到100或更多时,它开始变慢。在1000年它是无法忍受的!这是用于绘制网格的代码:为什么当显示的行数增加时jqGrid非常慢?

$("#stSearchTermsGrid").jqGrid({ 
     mtype: "POST", 
     postData:{}, 
     datatype: function(postdata) { 
      $.ajax({ 
       url: 'ajax/ajax_termsSearchGridSimple.php', 
       data: postdata, 
       async: false, 
       dataType: "xml", 
       error: function(){ 
        alert('Error loading XML document'); 
       }, 
       success: function(data,stat,xmldata){ 
        //check error 
        var $error=$(data).find('error').text(); 
        if($error!="0") 
        { 
         messageBox("Error",$error); 
         return; 
        } 
        //content 
        var $content=$(data).find('content').text(); 
        if($content!="0") 
        { 
         var thegrid = $("#stSearchTermsGrid")[0]; 
         thegrid.addXmlData(xmldata.responseXML); 
        } 
       } 
      }); 
     }, 
     colNames:["tId","term", "revTerm", "uType","freq","description","fId","facet","modifiedTime"], 
     colModel:[ 
      //tId 
      {name:'tId',index:'tId',align:"center",searchoptions:{sopt:['eq','ne','lt','le','gt','ge','in','ni']}}, 
      //term (editable) 
      {name:'term',index:'term',searchoptions:{sopt:['eq','ne','in','ni','bw','bn','ew','en','cn','nc']},editable:true,edittype:'text',editoptions:{size:20},editrules:{required:true},formoptions:{elmsuffix:'(*)'}}, 
      //revTerm (editable) 
      {name:'revTerm',index:'revTerm',searchoptions:{sopt:['eq','ne','in','ni','bw','bn','ew','en','cn','nc']},editable:true,edittype:'text',editoptions:{size:20},editrules:{required:true},formoptions:{elmsuffix:'(*)'}}, 
      //uType (editable) 
      {name:'uType',index:'uType',align:"center",searchoptions:{sopt:['eq','ne','in','ni']},editable:true,edittype:'select',editoptions:{value:{'':'any','NPU':'proper noun','NU':'noun','VU':'verb'}}}, 
      //freq 
      {name:'freq',index:'freq',align:"center",searchoptions:{sopt:['eq','ne','lt','le','gt','ge','in','ni']}}, 
      //description (editable) 
      {name:'description',index:'description',searchoptions:{sopt:['bw','bn','ew','en','cn','nc']},editable:true,edittype:'textarea',editoptions:{rows:"3"}}, 
      //fId 
      {name:'fId',index:'fId',align:"center",searchoptions:{sopt:['eq','ne','lt','le','gt','ge','in','ni']}}, 
      //facet 
      {name:'facet',index:'facet',searchoptions:{sopt:['eq','ne','in','ni','bw','bn','ew','en','cn','nc']}}, 
      //modifiedTime 
      {name:'modifiedTime',index:'modifiedTime',align:"center",searchoptions:{sopt:['eq','ne','lt','le','gt','ge','bw','bn','ew','en','cn','nc']}} 
     ], 
     gridComplete: function(){ 
      var $ids=$("#stSearchTermsGrid").jqGrid('getDataIDs'); 
      for($i=0;$i<$ids.length;$i++){ 
       var $reference="<a href='javascript:void();' onclick=\"toGoogle('stSearchTermsGrid','"+$ids[$i]+"');\">G</a>"; 
       //update columns 
       $("#stSearchTermsGrid").jqGrid('setRowData',$ids[$i],{"reference":$reference}); 

       //coloring the recently classified row 
       var $colorRecentlyModified = '#DFFC91'; 
       var modifiedTime = $("#stSearchTermsGrid").jqGrid('getCell',$ids[$i],'modifiedTime'); 
       var timeDiff = Math.abs(new Date() - new Date(modifiedTime.replace(/-/g,'/'))); 
       // 86400000 is the number of milliseconds in one day. Multiplying by days to mark the ones which are modified a few days ago 
       timeLimit = 86400000 * 1.5; 
       if(timeDiff < timeLimit) 
       { 
        for(colN=2; colN<9; colN++) 
         $("#stSearchTermsGrid").jqGrid('setCell', $ids[$i], colN, '', {'backgroundColor':$colorRecentlyModified});  
       } 

       //coloring the unclassified row 
       var $colorUnclassified = '#FFCECE'; 
       var $fId = $("#stSearchTermsGrid").jqGrid('getCell',$ids[$i],'fId'); 
       if($fId == "0") 
       { 
        for(colN=2; colN<9; colN++) 
         $("#stSearchTermsGrid").jqGrid('setCell', $ids[$i], colN, '', {'backgroundColor':$colorUnclassified});  

       } 

      } 
     }, 
     sortable: true, 
     //autowidth:true, 
     width: 900, //width for grid 
     height: 250, //height for grid 
     sortname: 'term', //default sort column 
     caption: "Terms", //caption for grid (empty will hide) 
     hidegrid: false, 
     gridview: true,  //load the grid more fast 
     multiselect: true, //support mulitselect 
     //multiboxonly: true, 
     pager: '#stSearchTermsGridPager', 
     rowNum:10, 
     rowList:[10,25,50,100,500,1000], 
     viewrecords: true, //show view record information 
     viewsortcols: [true,'vertical',true], //show sortable column with icons 
     editurl: 'ajax/ajax_termsEdit.php' 
    }); 
    $("#stSearchTermsGrid").jqGrid('navGrid','#stSearchTermsGridPager', 
     {edit:true,add:false,del:true,search:true,view:true,refresh:true}, 
     // edit options 
     {  
      onclickSubmit : function(params, posdata) { 
       var $tId=$("#stSearchTermsGrid").jqGrid('getGridParam','selrow'); 
       if($tId && $tId.length>0) 
       { 
        var $rowAry=$("#stSearchTermsGrid").jqGrid('getRowData',$tId); 
        var $fId=$rowAry["fId"]; 
        return {"fId":$fId} 
       } 
      }, 
      afterSubmit : gridAfterSubmit, 
      reloadAfterSubmit: true, 
      closeOnEscape:true, 
      bottominfo:"Fields marked with (*) are required." 
     }, 
     // add options 
     {}, 
     //del options 
     { 
      msg: "Selected records(s) will be permanently deleted and cannot be recovered.<br/> Are you sure?", 
      afterSubmit : gridAfterSubmit, 
      reloadAfterSubmit: true, 
      closeOnEscape:true 
     }, 
     // search options 
     {multipleSearch:true,closeOnEscape:true}, 
     //view options 
     { 
      closeOnEscape:true 
     } 
    ); 
    $("#stSearchTermsGrid").jqGrid('gridResize',{minWidth:900,maxWidth:2000,minHeight:250, maxHeight:1000}); 

回答

15

我看到很多可以改进网格的地方。

1)您应该使用分页。如果向用户显示1000行数据,则数据将不会立即显示在监视器。用户必须滚动浏览器的窗口才能看到大部分数据。哪种感觉必须花时间来画出不可见的窗口部分?关于jqGrid的滚动数据是作为浏览器窗口的滚动更有效。此外,没有人能够分析1000行数据。他必须改变排序并设置不同的过滤器,以便了解哪些数据对他来说很有趣。这是数据分页的另一个参数,并执行了一些搜索。它已经使用高级搜索,您可以考虑另外使用toolbar searching,其参数stringResult:trueadvanced searching兼容。

2)你应该重写代码gridComplete完全。我想,对于相对较大数量的行,函数是代码的瓶颈。要验证这只是临时评论功能,并比较网格绘画的时间。你应该明白,每当你通过id获取数据或通过id设置数据时,jQuery将不得不通过id搜索DOM元素。特别是修改页面上的数据可能会非常缓慢。顺便说一下,在我看来,你几乎为行的整个单元格设置了相同的“背景颜色”(什么是'backgroundColor'???)CSS样式。为什么不为该行设置“背景颜色”(<tr>元素)呢?

3)我强烈建议您不要使用datatype作为功能。你的服务器部分应该返回一些error HTTP code。如果loadError事件将起作用,并且您可以解码并显示自定义错误消息。您的数据中的所有其他数据似乎都是标准的,您不需要使用datatype作为函数。如果您将使用datatype:"xml",则可以尝试使用loadonce:true并实施客户端数据分页和排序,如果您在服务器上实现此功能时遇到问题。

我不想写太长的文字,所以我停下来了3个最重要的点。顺便说一下,如果您将XML转换为JSON作为用于与服务器通信的数据类型,那么它也会提高一点性能。

更新:要看到jqGrid的表现与1000行数据without pagingwith data paging看看链接。顺便说一句,没有分页的情况下,1000行的例子的表现也如此缓慢?

+1

@Ahmad Farid:我想你把我的答案投下来。我很有兴趣知道这个原因。我的意思是http://stackoverflow.com/faq#behonest中描述的规则。 – Oleg 2011-02-25 13:02:23