Проблемы с производительностью Jqgrid в IE8 - PullRequest
2 голосов
/ 06 марта 2012

Я использую jqgrid treegrid для удаленной загрузки данных при событии расширения. Он быстро извлекает данные, но требует времени для загрузки на стороне клиента, а также при свертывании узла, выдает ошибку сценария остановки на IE8. На FF и Chrome это занимает время, но работает без ошибок скрипта. У меня есть только 480 записей для отображения, но TreeGrid показывает огромный недостаток производительности. Ошибка IE8 при сворачивании узла FEB-2012 ...

enter image description here

1 Ответ

3 голосов
/ 06 марта 2012

Я протестировал ваше демо, и у меня есть один совет, чтобы значительно улучшить производительность. Причиной являются строка внутри expandRow :

$("#"+id,$t.grid.bDiv).css("display","");

и другая строка внутри collapseRow :

$("#"+id,$t.grid.bDiv).css("display","none");

В строках используется $t.grid.bDiv в качестве параметра контекста jQuery. Отсюда следует, что данные из $t.grid.bDiv fill будут искать без использования индекса, существующего для идентификаторов. Если в сетке нет дубликатов идентификаторов (что может быть ошибкой в ​​данных), можно удалить параметр $t.grid.bDiv

Демонстрационная версия идентична вашей исходной демонстрационной версии, но я использовал фиксированный код функции, в которой вышеуказанные строки заменены на

$("#"+$.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);
                }
            });
        });
    }
});

Я думаю, что можно еще больше повысить производительность кода, но, по крайней мере, простое изменение может значительно повысить производительность свертывания или расширения узлов дерева, имеющих много элементов.

ОБНОВЛЕНО: Я только что опубликовал запрос на получение , который устраняет описанную выше проблему в основном коде jqGrid. Я решил использовать $($t.rows.namedItem(id)) вместо описанного выше $ ("#" + $. Jgrid.jqID (id)). Я точно не измерил производительность, но использование namedItem должно быть максимально близко к исходному коду jqGrid, и я надеюсь, что он работает немного быстрее как селектор идентификатора jQuery.

ОБНОВЛЕНО 2: Исправление теперь в основном коде jqGrid на github (см. здесь )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...