2015-03-09 4 views
4

У меня есть любопытство с плагином, который я написал для Knockout, который называется knockout-fast-foreach, а именно, что является самым быстрым способом многократного клонирования набора узлов и ввода их в DOM.Самый быстрый способ многократного клонирования набора узлов

Есть две вещи, которые должны произойти в клонировании, а именно: copying out the source template nodes и injecting them back into the DOM.

В настоящее время существует несколько вариантов дизайна, которые применяются, которые включают в себя:

  1. Узлы источника будут дети одного DOM объекта;
  2. У цели могут быть братья и сестры, не затронутые инъекцией DOM, то есть не все дочерние узлы могут измениться;
  3. Источником может быть <template>, <script> или обычный узел HTML DOM.

Так, например:

<template id='src'>ø</template> 
<div id='target' data-bind='fastForEach: $data'> 
</div> 

Когда применяется связывание с ko.applyBindings([1, 2, 3], document.getElementById('target')) результатом будет:

<template id='src'>ø <span data-bind='text: $data'></span></template> 
<div id='target' data-bind='fastForEach: $data'> 
    ø <span data-bind='text: $data'>1</span> 
    ø <span data-bind='text: $data'>2</span> 
    ø <span data-bind='text: $data'>3</span> 
</div> 

Хотя этот пример KO-конкретнее, производительность манипулирования DOM должна быть относительно универсальной характеристикой.

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

Возможно ли, что существует более быстрый способ клонирования и копирования нескольких элементов (например, с использованием фрагментов документа)?

+3

У вас есть интересный вопрос здесь, но он довольно широк. Возможно, вы можете попробовать [CodeReview.StackExchange.com] (http://CodeReview.StackExchange.com)? На стороне примечание, фактический код находится на связанном внешнем сайте, но я бы сказал, что соответствующие биты должны быть в вопросе, чтобы предотвратить гниль ссылки c.q. сделать вопрос самодостаточным. Я думаю, что то же самое относится и к CodeReview SE, где ценятся ссылки на полные кодовые базы, но ожидается, что у вопроса будет соответствующий код. – Jeroen

+0

Вам нужно беспокоиться о «копировании» событий и свойств при клонировании элементов? Или достаточно копировать атрибуты? Если это последний, по мере увеличения количества элементов, почти всегда будет работать более эффективно работать с html-строками (путем получения и установки 'innerHTML') вместо работы с фактическими элементами DOM. – Brandon

+0

Спасибо @Brandon; просто структура + атрибуты; нет никаких событий и свойств, о которых можно беспокоиться. Как вы можете заметить, хотя из ограничения №2 невозможно эффективно использовать 'innerHTML', поскольку не все дочерние элементы данного узла могут меняться. –

ответ

1

Вы используете привязку данных. Это само по себе будет медленным. Лучшая производительность всегда будет заключаться в том, чтобы манипулировать строкой с dom, а затем вставлять ее в dom за один раз - element.innerHTML = «ваш новый html». Еще лучше, чтобы он не был встроен, потому что это замедляет рендеринг браузера. Итерационное добавление в dom преломляет браузер. См. - http://davidwalsh.name/css-js-animation.