【发布时间】:2011-04-01 14:28:57
【问题描述】:
大家好!
所以我在我的应用程序中使用 JQGrid 已经有一段时间了,在我开始优化之前,网格的速度并没有真正困扰我。
如果发现即使我有一个小网格(每页 20 个项目),悬停突出显示很慢,并且如果网格恰好需要页面上的滚动条,则页面的滚动真的很慢。
我尝试过异步发帖和 loadonce:true,但它们的绘制速度都一样慢。
我正在使用 jquery.ui.theme css。
我已经一起删除了分页,因此网格在屏幕上绝对只包含 20 个项目,并且悬停的绘制仍然很慢。
为了确保我的页面上没有其他内容,我将网格的显示设置为无,并且页面像往常一样快速运行 - 正如我所怀疑的那样。
使用 IE8 调试器,我使用分析器来测量我的 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"
}
});
【问题讨论】:
-
您能否发布完整的 javascript 代码(例如函数 filterGroup、setGridWidth、loadAnswersGrid 等),其中可以看到 ID 为 VariableGridContentConainer、QuestionTree、FQ 等元素的 HTML 代码。此外,您可以从服务器保存一个测试 JSON 响应(您可以使用 Fiddler,参见 fiddler2.com/fiddler2 或 Firebug)。这样就可以在不运行服务器的情况下重现您的问题。看来你可以改进一下,但必须有完整的代码才能更准确。
标签: jquery optimization jqgrid performance