JQGrid重绘速度很慢

时间:2010-08-20 10:48:06

标签: jquery optimization jqgrid performance

嘿大家好!

所以我现在已经在我的应用程序中使用了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"
        }
    });

1 个答案:

答案 0 :(得分:9)

你没有发布完整的JavaScript代码,所以我写了一些评论,你可以根据现有的信息优化jqGrid。

  1. 您最好避免使用afterInsertRow并在gridCompleteloadComplete中执行相同的工作。然后,您可以在jqGrid的定义中添加gridview: true参数,并快速构建网格(有关详细信息,请阅读jqgrid, firefox and css- text-decoration problem)。 afterInsertRow jQuery('.jqgrow',jQuery('#tblVariables')).addClass('jstree-draggable');loadComplete中的gridComplete可以轻松取代Groups中的当前操作。
  2. 您根据隐藏HiddenGroups列的包含构建Groups列的值。您从服务器发送的包含Groups列的数据似乎被覆盖。您可以根据Groups的{​​{3}}构建包含HiddenGroups列的相同内容。然后,您可以删除不需要的formatter:'checkbox'列。请查看custom formatter以获取自定义格式化程序的示例,并在jqGrid: Editable column that always shows a select上查看Add multiple input elements in a custom edit type field的示例。可能定义custom editing对你来说也很有意思。
  3. 这有点像品味,但HiddenVarjsonReader的使用似乎是合适的。此外,可以看到您从服务器发送“True”或“False”字符串作为列的值。发送1和0遵循相同的结果,但减小大小 发送的数据。
  4. 如果您删除某些默认值(例如imgpath)或已弃用的值(例如colModel(请参阅custom unformater)并从{{1删除默认值),则可以缩小javascript的大小(如editable: false)。
  5. 您可以在http://www.trirand.com/jqgridwiki/doku.php?id=wiki:upgrade_from_3.4.x_to_3.5找到jqGrid的其他一些常规优化方法的说明。

    更新:可能您不需要在Groups中插入选择元素。而不是只有在选择行或处于编辑模式时才能执行此操作。从整个Groups中删除select元素的构造可以提高网格的性能并简化代码。您可以将editoptionsvalue用作函数,或使用what is the best way to optimize my json on an asp.net-mvc site的其他可能性。然后,onchange事件与select的绑定可以dataEvents替换为type: 'change'