2010-02-15 4 views
0

Способ работы jQuery .clone(), как только вы вставляете клонированный объект где-то, вы не можете вставить его снова в другой раз, не повторно клонируя исходный объект. Например, если вы сделаете это:
jQuery clone бесконечное время?

var cloned = $('#elem1').clone(); 
$('#elem2').after(cloned); 
$('#elem2').after(cloned); 

только одна копия elem1 будет скопирована и второй after вызов не сделал бы ничего.

Есть ли способ не «очистить буфер обмена» после использования клонированного объекта? Сейчас я делаю это, клонируя объект, прежде чем вставлять его где-нибудь. Есть лучший способ сделать это?

ответ

3

Ваши две линии просто перемещают один и тот же набор элементов jQuery в два раза. Если вам нужна новая копия, вы должны снова клонировать ее. after() не клонирует ничего. Он просто перемещает контент вокруг. clone() в этом случае является тем, что создает контент.

var cloned = $('#elem1').clone(); 
$('#elem2').after(cloned); 
cloned = $('#elem1').clone(); 
$('#elem2').after(cloned); 

Кроме того, вы должны изменить или удалить атрибут ID, когда вы делаете что:

var cloned = $('#elem1').clone().removeAttr("id"); 
$('#elem2').after(cloned); 
cloned = $('#elem1').clone().removeAttr("id"); 
$('#elem2').after(cloned); 

, как дублированные идентификаторы технически не могут так поведение не определено.

+0

Да, я просто использовал идентификаторы в качестве примеров - должен был быть более осторожным. – Suan

+0

Не эксперт по jQuery; требуется второй поиск? Не могли бы вы сделать, например, 'cloned = cloned.clone()' вместо 'cloned = $ ('# elem1'). Clone()' в третьей строке? –

+0

@ danielWagner Это не очень хорошая идея, если только ваш клонированный элемент не был пустым (чего не должно быть, потому что тогда вы должны использовать цикл для создания этих элементов). В противном случае вы будете клонировать любой динамически добавленный вход, уже вставленный в вашу «клонированную» переменную;) –