JavaScript. Подробное руководство, 6-е издание, стр. 214

Одна из особенностей объекта

<b>DocumentFragment</b>
состоит в том, что он позволяет манипулировать множеством узлов как единственным узлом: если объект
<b>DocumentFragment</b>
передать методу
<b>appendChild(), insertBefore()</b>
или
<b>replaceChild(),</b>
в документ будут вставлены дочерние элементы фрагмента, а не сам фрагмент. (Дочерние элементы будут перемещены из фрагмента в документ, а сам фрагмент опустеет и будет готов для повторного использования.) Следующая функция использует объект
<b>DocumentFragment</b>
для перестановки в обратном порядке дочерних элементов узла:

<b>// Выполняет перестановку дочерних элементов узла n в обратном порядке </b>

<b>function reverse(n) {</b>

<b>  // Создать пустой объект DocumentFragment, который будет играть роль</b>

<b>  // временного контейнера</b>

<b>  var f = document.сreateDocumentFragment();</b>

<b>  // Выполнить обход дочерних элементов в обратном порядке и переместить каждый</b>

<b>  // из них в объект фрагмента. Последний дочерний элемент узла n станет первым</b>

<b>  // дочерним элементом фрагмента f, и наоборот. Обратите внимание, что при добавлении</b>

<b>  // дочернего элемента в фрагмент f он автоматически удаляется из узла n. </b>

<b>  while(n.lastChild) f.appendChild(n.lastChild);</b>

<b>  // В заключение переместить сразу все дочерние элементы </b>

<b>  // из фрагмента f обратно в узел n. </b>

<b>  n.appendChild(f);</b>

<b>}</b>

В примере 15.6 представлена реализация метода

<b>insertAdjacentHTML()</b>
(раздел 15.5.1) с применением свойства
<b>innerHTML</b>
и объекта
<b>DocumentFragment</b>
. В нем также определяются функции вставки разметки HTML с более логичными именами, чем неочевидное
<b>insertAdjacentHTML()</b>
. Вложенная вспомогательная функция
<b>fragment()</b>
является, пожалуй, наиболее интересной частью этого примера: она возвращает объект
<b>DocumentFragment</b>
, содержащий разобранное представление указанной ей строки с разметкой HTML.

Пример 15.6. Реализация метода

<b>insertAdjacentHTML()</b>
с использованием свойства
<b>innerHTML</b>

<b>// Этот модуль определяет метод Element.insertAdjacentHTML для броузеров,</b>

<b>// не поддерживающих его, а также определяет переносимые функции вставки HTML,</b>

<b>// имеющие более логичные имена, чем имя insertAdjacentHTML:</b>

<b>// Insert.before(), Insert.after(), Insert.atStart(), Insert.atEnd() </b>

<b>var Insert = (function() {</b>

<b>  // Если элементы имеют собственный метод insertAdjacentHTML, использовать </b>

<b>  // его в четырех функциях вставки HTML, имеющих более понятные имена, </b>

<b>  if (document.createElement(&quot;div&quot;).insertAdjacentHTML) {</b>

<b>    return {</b>

<b>      before: function(e,h) {e.insertAdjacentHTML(&quot;beforebegin&quot;,h);},</b>

<b>      after: function(e,h) {e.insertAdjacentHTML(&quot;afterend&quot;,h);},</b>

<b>      atStart: function(e,h) {e.insertAdjacentHTML(&quot;afterbegin&quot;,h);},</b>

<b>      atEnd: function(e,h) {e.insertAdjacentHTMLC'beforeend&quot;,h);}</b>

<b>    };</b>

<b>  }</b>

<b>  // Иначе, в случае отсутствия стандартного метода insertAdjacentHTML,</b>

<b>  // реализовать те же самые четыре функции вставки и затем использовать их </b>

<b>  // в определении метода insertAdjacentHTML.</b>

<b>  // Сначала необходимо определить вспомогательный метод, который принимает</b>

<b>  // строку с разметкой HTML и возвращает объект DocumentFragment,</b>

<b>  // содержащий разобранное представление этой разметки</b>

<b>  function fragment(html) {</b>

<b>    var elt = document.createElement(&quot;div&quot;); // Пустой элемент </b>

<b>    var frag = document.createDocumentFragment(); // Пустой фрагмент </b>

<b>    elt.innerHTML = html; // Содержимое элемента</b>

<b>    while(elt.firstChild) // Переместить все узлы</b>

<b>      frag.appendChild(elt.firstChild); // из elt в frag</b>

<b>    return frag; // И вернуть frag</b>

<b>  }</b>

<b>  var Insert = {</b>

<b>    before: function(elt, html) {</b>

<b>      elt.parentNode.insertBefore(fragment(html), elt):</b>

<b>    },</b>

<b>    after: function(elt, html) {</b>

<b>      elt.parentNode.insertBefore(fragment(html),elt.nextSibling);</b>