Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   append в jQuery (https://javascript.ru/forum/jquery/32351-append-v-jquery.html)

Shitbox2 12.10.2012 22:12

append в jQuery
 
Имеется коллекция элементов jQuery. Коллекция встраивается в DOM. Нужно, чтобы при добавлении элемента в коллекцию, он бы добавлялся к оставшимся элементам в DOM.

Делаю так:
var $coll = $(<p>коллекция</p>)
$('div').append($coll)

//Добавляется элемент в коллекцию и сразу встраивается в  DOM
$('div').append($coll.add($(<p>добавка</p>)))

Вопрос. Что происходит, когда аппендится один и тот же объект (в нашем случае $coll)? Удаляется из DOMa старый, и записывается новый такой же. Или существующие объекты не затрагиваются?

melky 12.10.2012 22:41

Цитата:

Сообщение от Shitbox2
Или существующие объекты не затрагиваются?

расследование и ответ снизу.

да. они просто перемещаются :

<div id="from" style="border: 1px red solid;">  <div id="target">FOOBAR</div> </div>
<div id="to" style="border: 1px green solid;"></div>

<script>
// сокращение
var $ = document.getElementById.bind(document);

// добавим какое-нибудь свойство к элементу :
$("target").myprop = "myvalue";

// по клику будем выводить значение этого свойства :
$("target").addEventListener("click", function (e) {
    alert( 'Значение свойства "myprop" :  ' + this.myprop);
});

// теперь переместим элемент в другой элемент.
$("to").appendChild( $("target") );
</script>


А вот что происходит с элементом, если его appendChild'ят в то же место, где он находится - вопрос.

Попробую полазить щас в исходниках V8 ... самому интересно стало :)

Node.appendChild отсылает нас к ContainerNode::appendCild, где после проверок на возможность вставки \ перемещения элемента (можем ли мы манипулировать вообще с ним) происходит проверка на то, одинаков ли this и цель вставки ( т.е. пытаемся ли мы вставить элемент сам в себя), всё-таки он вынимается из дерева и вставляется в родитель.

т.е. они каждый раз вынимаются из дерева, и вставляются на то же место.

это ненужная операция, которой нужно избегать.

Shitbox2 13.10.2012 10:39

Спасибо за расследование! Именно этого я и боялся. Как же сделать так, чтобы при пополнении коллекции пополнялся бы и ДОМ без перезаписи старых элементов?

Мне тут видится несколько вариантов:
1. Отойти от коллекции и каждую вставку клонировать в новый объект jQuery (так делал раньше). Но плодить кучу однородных клонов... наверное, не очень хорошо.
2. Вытаскивать новую вставку из объекта jQuery и аппендить напрямую. $('to').append($('target')[0].outerHTML). Но потом не получится изменить свойства вставки средствами jQuery (без поиска ее по ДОМу), так что тоже плохой вариант.
3-й способ еще не придумал. Кто-нибудь знает решение?

melky 13.10.2012 10:44

у JQ есть метод appendTo - отличный вариант.

Shitbox2 13.10.2012 15:32

А разве это не то же самое. что и append только с другим порядком следования элементов? Или в этом случае не используется appendChild?Ф


Часовой пояс GMT +3, время: 21:39.