2010-08-20 114 views
3

嘿,大家好!JQGrid重繪速度慢

所以我現在在我的應用程序一段時間了jqGrid的和速度電網處理不當的真正困擾我,直到我開始優化。

如果發現即使我有一個小網格(每頁20個項目)懸停突出顯示速度很慢,並且如果網格碰巧需要頁面上的滾動條,頁面的滾動確實很慢。

我試過異步帖子也loadonce:真,他們都畫慢。

我正在使用jquery.ui.theme css。

我已經一起刪除了分頁,因此網格絕對只在屏幕上包含20個項目,並且懸停的繪圖仍然很慢。

只是爲了確保它在我的頁面上沒有任何其他內容,我將網格的顯示設置爲無,並且頁面像往常一樣快速運行 - 就像我懷疑的那樣。

使用IE8調試器,我使用profiler來測量我的javascript和html的速度,這些速度非常快 - 所以它絕對是屏幕上的網格繪圖。

我很感激任何和所有幫助或建議以提高性能。

我會附上我的網格定義(這是相當大的),萬一你可能認爲它可能是一些有:

$("#tblVariables").jqGrid({ 
     url: '/StudyAdmin/GetVariable.aspx?FilterType=' + Filter + '&SelectedFolder=' + SelectedFolder + '&SelectedGroup=' + SelectedGroup, 
     datatype: "json", 
     mtype: "POST", 
     colNames: ['Variable Name', 'Hidden Original Text', 'Original Text', 'Label', 'Hidden', 'Groups', 'HiddenGroups'], 
     colModel: [ 
      { name: 'VarName', index: 'VarName', editable: false }, 
      { name: 'VarOriginalText', index: 'VarOriginalText', hidden: true, editable: true, editrules: { edithidden: true} }, 
      { name: 'VarOriginalTextToShow', index: 'VarOriginalTextToShow', editable: false, sortable: false }, 
      { name: 'VarReportingText', index: 'VarReportingText', editable: true }, 
      { name: 'HiddenVar', index: 'HiddenVar', editable: true, edittype: "select", editoptions: { value: { "true": "True", "false": "False"}} }, 
      { name: 'Groups', index: 'Groups', editable: false }, 
      { name: 'HiddenGroups', index: 'HiddenGroups', hidden: true, editable: true, editrules: { edithidden: true} } 
     ], 
     editurl: "/StudyAdmin/Editvariable.aspx", 
     height: "100%", 
     gridComplete: function() { 
      var grid = jQuery("#tblVariables"); 
      var ids = grid.jqGrid('getDataIDs'); 
      for (var i = 0; i < ids.length; i++) { 
       var rowId = ids[i]; 
       var splitGroups = $('#tblVariables').getCell(rowId, 'HiddenGroups').split(","); 
       if (splitGroups.length == 1 && splitGroups[0] == "") splitGroups = ""; 
       var GroupSelect = "<select id='Group_" + rowId + "' onchange='filterGroup(this)'>"; 
       if (splitGroups.length > 0) GroupSelect += "<option value='HasSelectGroup'>Select Group</option>"; 
       else GroupSelect += "<option value='NotHasSelectGroup'>No Groups</option>"; 
       for (var k = 0; k < splitGroups.length; k++) { 
        GroupSelect += "<option value='" + splitGroups[k] + "'>" + splitGroups[k] + "</option>"; 
       } 
       //add all groups in here 
       GroupSelect += "</select>"; 
       grid.jqGrid('setRowData', rowId, { Groups: GroupSelect }); 
      } 
      setGridWidth($("#VariableGridContentConainer").width() - 19); 
     }, 
     afterInsertRow: function (rowid, rowdata, rowelem) { 
      $("#" + rowid).addClass('jstree-draggable'); 
     }, 
     ondblClickRow: function (id, ri, ci) { 
      lastSelRow = id; 
      $("#tblVariables").jqGrid('editRow', id, true); 
     }, 
     onSelectRow: function (id) { 
      if ($('#QuestionTree').find("#FQ" + id).attr("id") !== undefined) { 
       $.jstree._focused().select_node("#FQ" + id); 
      } 
      if (id == null) { 
       //$("#tblAnswers").setGridParam({ url: "/StudyAdmin/GetAnswers.aspx", page: 1 }).trigger('reloadGrid'); 
       $('#tblAnswers').GridUnload(); 
       loadAnswersGrid("-1"); 
      } else { 
       //$("#tblAnswers").setGridParam({ url: "/StudyAdmin/GetAnswers.aspx?id=" + id, page: 1 }).trigger('reloadGrid'); 
       $('#tblAnswers').GridUnload(); 
       loadAnswersGrid(id); 
       if (id && id !== lastSelRow) $("#tblVariables").jqGrid('saveRow', lastSelRow); 
      } 
     }, 
     viewrecords: true, 
     rowNum: 20, 
     loadonce: true, 
     pager: jQuery('#pagernav'), 
     sortname: 'VarName', 
     sortorder: "asc", 
     imgpath: '/Content/Images/', 
     jsonReader: { 
      root: "rows", 
      page: "page", 
      total: "total", 
      records: "records", 
      repeatitems: true, 
      cell: "cell", 
      id: "id" 
     } 
    }); 
+0

你可以發佈完整的JavaScript代碼(例如函數filterGroup,setGridWidth,loadAnswersGrid等),HTML代碼可以看到具有ID VariableGridContentConainer,QuestionTree,FQ等元素。此外,您可以從服務器保存一個測試JSON響應(您可以使用Fiddler,請參閱http://www.fiddler2.com/fiddler2/或Firebug)。然後,無需運行服務器就可以重現問題。看起來你的罐頭可以很好地改進,但必須有完整的代碼才能更精確。 – Oleg 2010-08-20 11:09:57

回答

9

你沒有發佈完整的JavaScript代碼,所以我寫了一些說明如何根據現有信息對jqGrid進行優化。

  1. 你最好避免afterInsertRow用法,做同樣的工作,gridCompleteloadComplete。然後,您可以在jqGrid的定義中添加gridview: true參數,並且網格將快速構建(有關更多詳細信息,請參閱jqgrid, firefox and css- text-decoration problem)。您目前在afterInsertRow中的操作可以很容易地由jQuery('.jqgrow',jQuery('#tblVariables')).addClass('jstree-draggable');替換爲loadCompletegridComplete
  2. 根據隱藏的HiddenGroups列的列包構造Groups列的值。您從服務器發送的包含Groups列的數據似乎會被覆蓋。您可以構建Groups列的相同列表,其編號爲Groupscustom formatter。那麼可能你可以刪除不需要的HiddenGroups列。有關自定義格式化程序的示例,請參閱jqGrid: Editable column that always shows a select,作爲custom editing的示例,請參閱Add multiple input elements in a custom edit type field。大概定義custom unformater也會對你很有意思。
  3. 這是一個有點味道的問題,但使用formatter:'checkbox'HiddenVar似乎是我適當的。此外可以看到,您從服務器發送「True」或「False」字符串作爲列的值。 1和0的發送遵循相同的結果,但減小發送的數據的大小 。
  4. 您可以減少您的JavaScript的大小,如果你刪除喜歡imgpath一些默認值(如jsonReader)或過時的值(見http://www.trirand.com/jqgridwiki/doku.php?id=wiki:upgrade_from_3.4.x_to_3.5)和colModel(如editable: false)刪除默認值。

jqGrid的一些其他一般優化方法的描述,你可以在what is the best way to optimize my json on an asp.net-mvc site找到。

更新:可能你並不需要在Groups中插入select元素。除此之外,只有在選定行或處於編輯模式時纔可以執行此操作。從整個Groups中刪除選擇元素的構造可以提高網格的性能並簡化代碼。您可以使用editoptionsvalue作爲函數或使用editoptions的其他可能性。 onchange事件與選擇的綁定可以隨後用type: 'change'替換爲dataEvents

+1

你好! 我剛剛看了一下我的郵件。非常感謝你的回覆!你真的很有幫助^ _^ 當我回到辦公室並讓你知道我的結果時,我會嘗試一些改變。 我真的很感謝你的深思熟慮和有益的答覆。 – Bob 2010-08-22 18:02:12