我正在使用jqgrid treegrid在expand事件上远程加载数据。它正在快速检索数据,但是在客户端加载并且在崩溃节点上花费时间,它在IE8上给出了停止脚本错误。在FF和Chrome上,它确实需要时间,但无需处理任何脚本错误。我只有480条记录要显示,但是treegrid显示出巨大的性能缺陷。折叠FEB-2012节点时出现IE8错误......
答案 0 :(得分:3)
我测试了你的演示,我有一个热点,以显着提高性能。原因是the line内的expandRow:
$("#"+id,$t.grid.bDiv).css("display","");
another line内的
$("#"+id,$t.grid.bDiv).css("display","none");
这些行使用$t.grid.bDiv
作为jQuery上下文参数。因此,可以在不使用id存在的索引的情况下搜索来自$t.grid.bDiv
fill的数据。如果网格没有id重复(这可能是数据中的错误),可以删除$t.grid.bDiv
参数
The demo与原始演示相同,但我使用了上述行替换为
的函数的固定代码$("#"+$.jgrid.jqID(id)).css("display","");
和
$("#"+$.jgrid.jqID(id)).css("display","none");
我使用了原始的jqGrid 4.1.1 jquery.jqGrid.min.js
,但仅使用
expandRow
和collapseRow
函数的代码
$.jgrid.extend({
expandRow: function (record){
this.each(function(){
var $t = this;
if(!$t.grid || !$t.p.treeGrid) {return;}
var childern = $($t).jqGrid("getNodeChildren",record),
//if ($($t).jqGrid("isVisibleNode",record)) {
expanded = $t.p.treeReader.expanded_field;
$(childern).each(function(i){
var id = $.jgrid.getAccessor(this,$t.p.localReader.id);
//$("#"+id,$t.grid.bDiv).css("display","");
$("#"+$.jgrid.jqID(id)).css("display","");
if(this[expanded]) {
$($t).jqGrid("expandRow",this);
}
});
//}
});
},
collapseRow : function (record) {
this.each(function(){
var $t = this;
if(!$t.grid || !$t.p.treeGrid) {return;}
var childern = $($t).jqGrid("getNodeChildren",record),
expanded = $t.p.treeReader.expanded_field;
$(childern).each(function(i){
var id = $.jgrid.getAccessor(this,$t.p.localReader.id);
//$("#"+id,$t.grid.bDiv).css("display","none");
$("#"+$.jgrid.jqID(id)).css("display","none");
if(this[expanded]){
$($t).jqGrid("collapseRow",this);
}
});
});
}
});
我认为可以更好地提高代码的性能,但至少简单的更改可以显着提高折叠或扩展具有多个项目的树节点的性能。
更新:我刚刚发布了the pull request,修复了jqGrid主代码中描述的上述问题。我决定使用$($t.rows.namedItem(id))
而不是上面描述的$(“#”+ $。jgrid.jqID(id))。我没有完全衡量性能,但namedItem的用法应该是最接近原始jqGrid代码的,我希望它作为jQuery的id选择器更快一点。
更新2:修复现在位于github上jqGrid的主代码中(参见here)