Быстрее манипулировать существующим HTML или удалить HTML и затем воссоздать его? - PullRequest
3 голосов
/ 05 марта 2011

Этот проект, над которым я работаю, имеет список элементов и преобразует их в «граф» (не настоящий граф, но его можно назвать псевдо-графическим). У меня есть набор данных, я запускаю цикл for над данными, а затем создаю элемент li для каждого из них, создаю и родительский ul, добавляю li s и затем добавляю родителя к другому элементу DOM (мы будем называть это прародителем) уже на странице. После этого мне придется вносить в этот список последующие обновления в зависимости от взаимодействия с пользователем.
Кроме того, все это в контексте использования jQuery.

Теперь мой вопрос: быстрее ли создавать элементы один раз, а затем обновлять итоговый HTML при каждом последующем вызове, или быстрее воссоздавать каждый элемент, empty() родительский элемент (который избавляет от родительского элемента? ul), а затем заново добавить вновь созданный ul (что я сейчас и делаю)?

Имейте в виду, что когда я воссоздаю li s, их вообще нет в DOM, поэтому при их воссоздании перерисовки / перекомпоновки не происходит. Перекраска происходит только тогда, когда я заново добавляю только что созданный ul.

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

мысли

Ответы [ 2 ]

2 голосов
/ 05 марта 2011

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

Однако существует три основных подхода, каждый из которых может Быть самым быстрым.Первый вызывает только один перекрас;остальные только два, если вы правильно выбрали родительский узел.

  1. Создайте свой новый контент в виде строк HTML ([...].join("")), затем примените с .html(). Плюсы: обычно быстрее, чем метод № 2. Минусы: не обязательно на много, может оставить устаревшие данные / события jQuery (то есть может утечь, если вы не будете осторожны).

  2. Создайте свойновый контент с jQuery вне документа (например, поместите все свои <li> в <ul>, затем вставьте <ul> в документ после завершения построения), затем вставьте normall. Плюсы: легче читать, чем метод № 1. Минусы: работает хуже, чем сложнее ваша разметка.

  3. Удалите существующие узлы из документа (в идеале, один родительский узел, такой как <ul>), внесите изменения и вставьте их заново. Плюсы: может быть более понятным и более производительным, чем метод # 2, особенно в случае сложной разметки. Минусы: становится намного более сложным, если количество элементов изменяется между визуализациями.

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

1 голос
/ 05 марта 2011

Я бы предложил сначала профилировать ваш код.Преждевременная оптимизация - корень всего зла.

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