jQuery показывает/скрывает столбец на большой производительности таблицы

У меня есть таблица HTML приблизительно с 30 столбцами и где-нибудь между 10 - 500 строками выхода. Я хотел бы показать/скрыть ряд столбцов o нажатие кнопки.

Я попробовал 2 подхода

  1. выполните итерации через thead таблицы th и сделайте .show () или .hide () на TH и TD.
  2. выполните итерации через thead таблицы th и класс изменения для показывания/скрытия TH и TD.

функция реализована как после отрывка. Однако производительность не является настолько большой. Покажите/Скройте говорят, что 20 столбцов занимают приблизительно 5~10 секунд на, возможно, 80~120 строках данных.

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

function ToggleHeadVisibility(showHide) {

    var index = 0;

    $('#' + gridViewName + ' thead th').each(function(index) {
        index++;
        if (showHide == "SHOW") {
            /*
            $('#' + gridViewName + ' th:nth-child(' + (index) + ')').show();
            $('#' + gridViewName + ' td:nth-child(' + (index) + ')').show();
            */
            $('#' + gridViewName + ' th:nth-child(' + (index) + ')').removeClass('columnHide');
            $('#' + gridViewName + ' td:nth-child(' + (index) + ')').removeClass('columnHide');
        } else if (showHide = "HIDE") {
            /*
            //if (showColumnArray.has($(this).get(0).innerHTML)) {
            if (showColumnArray.has($(this).attr('title'))) {
            $('#' + gridViewName + ' th:nth-child(' + (index) + ')').show();
            $('#' + gridViewName + ' td:nth-child(' + (index) + ')').show();
            }
            else {
            $('#' + gridViewName + ' th:nth-child(' + (index) + ')').hide();
            $('#' + gridViewName + ' td:nth-child(' + (index) + ')').hide();
            }
            */
            if (showColumnArray.has($(this).attr('title'))) {
                $('#' + gridViewName + ' th:nth-child(' + (index) + ')').removeClass('columnHide');
                $('#' + gridViewName + ' td:nth-child(' + (index) + ')').removeClass('columnHide');
            } else {
                $('#' + gridViewName + ' th:nth-child(' + (index) + ')').addClass('columnHide');
                $('#' + gridViewName + ' td:nth-child(' + (index) + ')').addClass('columnHide');
            }

        }
    });
}
7
задан Milap 19 February 2016 в 09:49
поделиться

6 ответов

Некоторые предложения:

  1. При построении таблицы добавьте классы CSS, такие как col1, col2, col3 и т. Д., В ячейки заголовка и данных. Затем вы можете просто выполнить $ ("td.col1"). Hide (); , чтобы скрыть соответствующий столбец. Это быстрее, чем n-й дочерний селектор.

  2. В IE и Firefox вы можете установить visibility: collapse на элемент col , чтобы свернуть весь столбец. Это будет намного быстрее. К сожалению, не поддерживается в браузерах Webkit http://www.quirksmode.org/css/columns.html . Вы можете разветвлять свой код на основе браузера, чтобы он работал быстро, по крайней мере, в IE и Firefox.

  3. Если ваша таблица имеет table-layout: fixed , это может значительно повысить производительность, поскольку вашему браузеру не нужно постоянно вычислять ширину столбцов каждый раз, когда вы касаетесь таблицы, как в автоматическом режиме. .

  4. Рассмотрите возможность удаления таблицы из дерева DOM (через .remove () ), выполните операцию массового отображения / скрытия и вставьте ее обратно. Это общее правило, когда вы хотите выполнить массовую операцию над DOM-дерево.

9
ответ дан 7 December 2019 в 01:15
поделиться

вот код, который я использовал, чтобы скрыть "n-й" столбец в моей сетке ...

  if (true) {
      $('th:nth-child(' + c + ')').show();
      $('td:nth-child(' + c + ')').show();                           
  }
  else {
      $('th:nth-child(' + c + ')').hide();
      $('td:nth-child(' + c + ')').hide();                          
  }

Очень похоже на ваш, за исключением того, что я использовал jQuery-переключатель "показать / скрыть";

кажется, что он показывает / скрыть столбец из 400 строк за 1 секунду ...

Борик

0
ответ дан 7 December 2019 в 01:15
поделиться

Вы можете многое сделать в области кэширования. Для начала, кешируйте свой контейнер gridView:

var gridView = $('#' + gridViewName);

И затем можно кэшировать строку:

var row[0] = gridView.find('tr:nth-child(0)'); // Not sure the path is right, but you get the idea...

Кроме того, выполняйте фактическое скрытие с использованием набора, а не .each ()

row[0].addClass('columnHide'); // Calls addClass() on each element in the set

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

0
ответ дан 7 December 2019 в 01:15
поделиться

Очевидно, эта альтернатива более удобна для отображения и скрытия элементов:

.css({'display':'none'}) & .css({'display':'block'});

http://www.learningjquery.com/2010/05/now-you-see-me-showhide -performance

Но я подозреваю, что ваша настоящая проблема - это цикл.

1
ответ дан 7 December 2019 в 01:15
поделиться

Могу я предложить что-то вроде этого?

$(function() {
    $('#show').click(function() {
        var i;
        for (i = 0; i < titles.length; i++)
        {
            ToggleHeadVisibility('SHOW', titles[i]);
        }
    });

    $('#hide').click(function() {
        var i;
        for (i = 0; i < titles.length; i++)
        {
            ToggleHeadVisibility('HIDE', titles[i]);
        }
    });
});

var titles = ['one', 'three', 'five'];

function ToggleHeadVisibility(showHide, title)
{
    var x = $('th[title=' + title + ']').index();
    var selectString = 'th:nth-child(' + (x + 1) + '), td:nth-child(' + (x + 1) + ')';
    var $set = $(selectString);

    if (showHide === "SHOW")
    {
        $set.show();
    }
    else if (showHide === "HIDE")
    {
        $set.hide();
    }
}

Я думаю, что проблема в вашем цикле. Вы перебираете каждое в таблице. Если вы хотите найти только определенные, почему бы просто не перебрать те, которые хотите найти?

Итак, вот что происходит именно здесь. При нажатии кнопки «показать» (или «скрыть») мы перебираем массив заголовков, вызывая ToggleHeadVisibility.

В этой функции мы получаем индекс первого элемента с данным заголовком, а затем показываем или скрываем узлы nth-child (x).

Я запускал его на таблице с 6 столбцами, показывая и скрывая по 3 за раз, и более 1000 строк. Это довольно быстро для того, что делает.

Обратите внимание, что если ваши заголовки не уникальны, он найдет только первый в таблице.

0
ответ дан 7 December 2019 в 01:15
поделиться

Итерация по строкам и столбцам всегда замедляет работу. Попробуйте манипулировать правилами CSS напрямую, чтобы избежать повторения в вашем JavaScript и заставить браузер делать это за вас.

Проверьте плагины jQueryRule и jQueryCSSRule .

Прямое манипулирование правилами CSS может быть полезным, если вы объедините все правила. Вот быстрый тест с 500 строками и 50 столбцами. Большая часть времени уходит на повторный рендеринг, а время, потраченное на функцию JavaScript, дает мне в среднем 200–300 мс в Chrome и 0 мс в Firefox. В настоящее время он использует стандартные API-интерфейсы, но распространить это на IE тривиально.

Он работает путем создания нового узла