Проблемы производительности jQuery и DOM в IE8 - PullRequest
8 голосов
/ 23 января 2012

Я разработал модуль на своей работе в JQuery, в основном это таблица со следующей функциональностью

  • Уровень ячейки Редактировать
  • Редактирование уровня строки
  • Отбросьте n, отбросьте строки, чтобы изменить положение
  • Показать / скрыть столбцы
  • Изменение размера столбца

все отлично работает в последних браузерах, таких как FF9.0, IE9 и Chrome, , но в старых браузерах, таких как IE8 и FF3.6, так как количество строк в таблице увеличивает производительность страницы, значительно снижается . Я пробовал много оптимизаций от манипуляций с JQuery и DOM, но все еще не влиял на производительность. Любая идея, если я что-то упускаю или совет, чтобы улучшить производительность, то есть до приемлемого уровня.

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

Ответы [ 2 ]

13 голосов
/ 24 января 2012

Существует два основных способа повысить производительность при работе с большими html-страницами - уменьшить количество повторений страниц и уменьшить количество обработчиков.

1. Уменьшить количество повторений страниц

Каждый раз, когда вы вносите изменения в DOM, он должен сам перерисовываться. Это рефлоу. Сведите их к минимуму, создав строку или фрагмент DOM со всеми вашими манипуляциями с DOM, а затем вставив их на свою страницу. Это вызовет только один рефлоу. Например, если вы добавляете таблицу, создайте всю таблицу с текстом в ней, как и должно быть, затем вставьте ее в одну операцию.

JQuery позволяет вам создать фрагмент DOM следующим образом:

var table = $('<table></table');

Вы можете манипулировать своим фрагментом стандартными способами:

var line = $('<tr><td>Some Data</td></tr>');
line.css('color','red');
table.append(line);

Затем, когда фрагмент будет завершен, добавьте его в DOM за один шаг:

$('body').append(table);

вы запустите только один перекомпоновка, и процесс будет на несколько порядков быстрее.

2. Уменьшить количество обработчиков

Если у вас много элементов управления в каждой строке, это много обработчиков. Вместо этого создайте только один обработчик и присоедините его к корневому каталогу документа, а затем, когда он будет вызван, проверьте целевой атрибут, чтобы узнать, что делать. В JQuery вы можете использовать новые обработчики «on» для этого или использовать старые обработчики «live» стиля.

например:

$('table td').on('click', function() {
  //do work here
});

Будет создан только один обработчик, который будет обрабатывать все события td click.

Выполните оба этих действия, и вы увидите значительно улучшенную производительность.

4 голосов
/ 23 января 2012

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

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

Вы также можете попытаться визуализировать таблицу на лету:

Ао вы получили свой стол и получилимассив с информацией в javascript (или с помощью ajax), плюс вы получили информацию о том, где вы находитесь в таблице (строке) и как долго таблица (maxrows).

Затем создайте таблицу, которая будет настолько большойкак окно просмотра, может быть, немного больше.Все, что выше и ниже области просмотра, обрабатывается большим <div> или чем-то, что растянуто до высоты оставшихся строк или строк перед самой верхней строкой в ​​области просмотра.

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

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

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