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

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

<b>this</b>
в ней будет указывать на текущий элемент, а в первом аргументе ей будет передаваться индекс элемента в объекте
<b>jQuery</b>
. Методы
<b>append(), prepend()</b>
и
<b>replaceWith()</b>
будут передавать функции во втором аргументе текущее содержимое элемента в виде строки с разметкой HTML. А методы
<b>befоге()</b>
и
<b>after()</b>
будут вызывать функцию без второго аргумента.

Все пять методов, представленные выше, применяются к целевым элементам и принимают вставляемое содержимое в виде аргумента. Для каждого из этих пяти методов имеется парный метод, действующий в обратном порядке: он вызывается относительно содержимого и принимает целевые элементы в виде аргументов. Пары методов перечислены в следующей таблице:

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

Методы, продемонстрированные в примере выше, перечислены во втором столбце. Методы, перечисленные в третьем столбце, будут демонстрироваться ниже. Есть несколько важных замечаний, касающихся этих пар методов:

• Если любому методу из второго столбца передать строку, он будет интерпретировать ее как разметку HTML. Если передать строку любому методу из третьего столбца, он будет интерпретировать ее как селектор, идентифицирующий целевые элементы. (Целевые элементы можно также указывать явно, передавая объект

<b>jQuery</b>
,
<b>Element</b>
или
<b>Node</b>
.)

• Методы из третьего столбца не принимают функции в аргументах, в отличие от методов из второго столбца.

• Методы из второго столбца возвращают объект

<b>jQuery</b>
, относительно которого они вызываются. Элементы в этом объекте
<b>jQuery</b>
могут иметь новое содержимое или новые братские элементы, но сами они не изменяются. Методы из третьего столбца вызываются относительно содержимого, которое должно быть вставлено, и возвращают новый объект
<b>jQuery</b>
, представляющий новое содержимое после вставки. В частности, обратите внимание, что если содержимое вставляется сразу в несколько мест, возвращаемый объект
<b>jQuery</b>
будет включать по одному элементу для каждой позиции вставки.

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

<b>$()</b>
нельзя передать простой текст (без угловых скобок, которые позволили бы идентифицировать его как разметку HTML), потому что он будет интерпретироваться как селектор. По этой причине требуется явно создать текстовый узел, который должен быть вставлен:

<b>$C'&lt;br/&gt;+message&quot;).appendTo(''#log&quot;); // Добавить разметку html в #log </b>

<b>$(document.createTextNode(”§&quot;)).prependTo( &quot;h1&quot;); // Добавить текстовый узел во все &lt;h1&gt; </b>

<b>$('&lt;hr/&gt;&quot;).insertBefore(&quot;h1&quot;); // Вставить линию перед каждым &lt;h1&gt;</b>

<b>$(&quot;&lt;hr/&gt;&quot;).insertAfter(&quot;h1&quot;);  // Вставить линию после каждого &lt;h1&gt;</b>

<b>$(&quot;&lt;br/&gt;&quot;).replaceAll(&quot;hr&quot;);   // Заменить элементы &lt;hr/&gt; на &lt;br/&gt;</b>

19.3.2. Копирование элементов

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

<b>clone().</b>
Метод
<b>сlопе()</b>
создает и возвращает копии всех выбранных элементов (и всех потомков этих элементов). Копии элементов, находящиеся в возвращаемом объекте
<b>jQuery</b>
, не являются частью документа, но их можно вставить в документ с помощью любого из методов, представленных выше:

<b>// Добавить новый div с атрибутом id=&quot;linklist&quot; в конец документа </b>

<b>$(document.body).append(&quot;&lt;div id= 'linklist' &gt;&lt;h1&gt;List of Links&lt;/h1&gt;&lt;/div&gt;&quot;);</b>

<b>// Скопировать все ссылки в документе и вставить их в этот новый div </b>

<b>$(&quot;а&quot;).clone().appendTo(&quot;#linklist&quot;);</b>

<b>// Вставить элементы &lt;Ьг/&gt; после каждой ссылки, чтобы они отображались в отдельных строках </b>

<b>$(&quot;#linklist &gt; а&quot;).after(&quot;&lt;br/&gt;&quot;);</b>

По умолчанию метод clone() не копирует обработчики событий (раздел 19.4) и другие данные (раздел 19.2.7), связанные с элементами. Если необходимо будет скопировать эти дополнительные данные, передайте методу

<b>clone()</b>
значение true.

19.3.3. Обертывание элементов

Другой способ вставки элементов в HTML-документ связан с обертыванием новым элементом (или элементами) одного или более элементов. Объект

<b>jQuery</b>
определяет три метода обертывания. Метод
<b>wrap()</b>
обертывает каждый выбранный элемент. Метод
<b>wrapInner()</b>
обертывает содержимое каждого выбранного элемента. А метод
<b>wrapAll()</b>
обертывает все выбранные элементы как единое целое. По умолчанию этим методам передается вновь созданный обертывающий элемент или строка с разметкой HTML, которая будет использована для создания обертки. Строка с разметкой HTML может включать вложенные элементы, если это необходимо, но на самом верхнем уровне она должна содержать единственный элемент. Если любому из этих методов передать функцию, она будет вызываться по одному разу в контексте каждого элемента (с индексом элемента в виде единственного аргумента) и должна возвращать строку, элемент
<b>Element</b>
или объект
<b>jQuery</b>
. Например: