Hey Everybody!
So i've had JQGrid in my application for a while now and the speed of the grid hasnt really bothered me up until I started optimization.
If find that even if I have a small grid (20 items per page) the hover highlighting is slow and if the grid happens to need a scroll bar on the page, the scrolling of the page is really slow.
I've tried asynchronous posts and also loadonce:true and they both draw just as slow.
I'm using the jquery.ui.theme css.
I've removed paging all together so that the grid absolutely only contains 20 items on the screen and still the drawing of the hover is slow.
Just to be sure it wasnt anything else on my page I set the display of the grid to none, and the page ran fast as usual - just as i suspected.
Using IE8 debugger, I used the profiler to measure speeds of my javascript and html and these speeds were really fast - so it's definitely the drawing of the grid on screen.
I'd appreciated any and all help or suggestions for improved performance.
I'll attach my grid definition (it is quite big), in case you may think it could be something there:
$("#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"
}
});
You don't post the full JavaScript code, so I write some remarks how you jqGrid can be optimized based on existing information.
- You should better avoid the usage of
afterInsertRow
and do the same work ingridComplete
orloadComplete
. Then you can addgridview: true
parameter in the definition of jqGrid and the grid will be constructed quickly (read jqgrid, firefox and css- text-decoration problem for more details). Your current action inafterInsertRow
can be easy replaced byjQuery('.jqgrow',jQuery('#tblVariables')).addClass('jstree-draggable');
inloadComplete
orgridComplete
. - You construct the value of
Groups
column based on the contain of hiddenHiddenGroups
column. The data which you send from the server as the contain ofGroups
column seems be overwritten. You can construct the same contain ofGroups
column with respect of custom formatter of theGroups
. Then probably you can remove unneededHiddenGroups
column at all. Look at jqGrid: Editable column that always shows a select for an example of custom formatter and at Add multiple input elements in a custom edit type field as example of custom editing. Probably defining of custom unformater will be also interesting for you. - It's a little the matter of taste, but the usage of
formatter:'checkbox'
for the columnHiddenVar
seems me appropriate. Moreover one can see that you send "True" or "False" strings from the server as the value for the column. Sending of 1 and 0 follows to the same results, but reduce the size of the data which are sent. - You can reduce the size of your javascript if you remove some default values (like
jsonReader
) or deprecated values likeimgpath
(see http://www.trirand.com/jqgridwiki/doku.php?id=wiki:upgrade_from_3.4.x_to_3.5) and remove default values fromcolModel
(likeeditable: false
).
Description of some other general optimization ways for jqGrid you can find in what is the best way to optimize my json on an asp.net-mvc site.
UPDATED: Probably you don't really need to insert select elements in Groups
. Instead of that you can do this only if the row is selected or is in editing mode. Removing of construction of the select elements from the whole Groups
can improve performance of your grid and simplify the code. You can use editoptions
with value
as a function or use other possibilities of editoptions. Binding of onchange
event to the select can be then replaced to dataEvents
with type: 'change'
.
精彩评论