Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Перемещение элементов DOM (https://javascript.ru/forum/jquery/21197-peremeshhenie-ehlementov-dom.html)

DjDiablo 31.08.2011 22:41

Перемещение элементов DOM
 
нужно перемещать некий div, из одной ветки DOM в другую (тобиш тупа из одного td в td другой таблицы, да и вообще пофиг куда :lol: ), при этом все ссылки на этот div, а также обработчики должны сохранится.

Тоже самоё но более развёрнуто. Я использую JavaScriptMVC. то есть на перемещаемом DIV висит контроллер, и если я перемещу Div в другой контейнер, то контроллер должен остаться приклеенным.

есть CLONE конечно, но она клонирует а мне надо бы переместить.

Octane 31.08.2011 22:47

appendChild/inserBefore

DjDiablo 31.08.2011 22:56

Цитата:

Сообщение от Octane (Сообщение 123975)
appendChild/inserBefore

Краткость сестра таланта :)
Вроде должно подойти, спасибо.

kadabrik 31.08.2011 22:56

detach, append, appendTo, clone(true)... тысячи их))

Octane 31.08.2011 23:48

а я не глянул на раздел

melky 01.09.2011 00:31

  1. клонировать исходный эл
  2. вставить его в новое место
  3. удалить старый эл
  4. ?????
  5. PROFIT!

Aetae 01.09.2011 00:36

Цитата:

Сообщение от melky (Сообщение 123987)
  1. клонировать исходный эл
  2. вставить его в новое место
  3. удалить старый эл
  4. ?????
  5. PROFIT!

Но зачем... ?

ваый 01.09.2011 00:44

Цитата:

Сообщение от melky (Сообщение 123987)
  1. клонировать исходный эл
  2. вставить его в новое место
  3. удалить старый эл
  4. ?????
  5. PROFIT!

Или использовать appendChild вместо всего перечисленного!

melky 01.09.2011 00:54

точно, jquery же.. тоже не глянул раздел

ну тогда просто (пример)

$(el).detach().appendTo( anotherEl );


-----

Цитата:

Сообщение от ваый (Сообщение 123990)
Или использовать appendChild вместо всего перечисленного!

а как же атрибуты, обработчики событий ?

DjDiablo 01.09.2011 00:55

Цитата:

Сообщение от melky (Сообщение 123987)
  1. клонировать исходный эл
  2. вставить его в новое место
  3. удалить старый эл
  4. ?????
  5. PROFIT!

Дикий болт. Потому что контроллер умрёт так как ссылка на этот div будет undefined. Ты же удалишь элемент на который она ссылается. Кстати в javascriptMVC вместе с элементом dom удаляется и контроллер который к нему прикреплен. А вот клонируется ли он незнаю, даже если да, то это всё равно изврат. Но спасибо, эта мысль мне тоже первой в голову пришла.

думаю inserBefore более чем достаточно.

melky 01.09.2011 00:56

в jquery обработчики событий для этого элемента сохраняются, если использовать detach

Octane 01.09.2011 00:59

Цитата:

Сообщение от melky
а как же атрибуты, обработчики событий ?

appendChild и insertBefore перемещают элементы, если те уже находятся в дереве

ваый 01.09.2011 01:36

appendChild перемещает элемент, а не создает новый, поэтому все обработчики и атрибуты никуда не пропадают, элемент-то все тот же, просто на новом месте. Демонстрация:
<style>
.label {clear: both; font-family: Verdana; font-size: 12px;}
#test {width: 15px; height: 15px; background-color: darkseagreen; border: 1px #444 solid;}
.cont {width: 50px; height: 50px; border: 1px #555 solid; margin: 10px 10px 0 0; float: left; padding: 5px;}
.cont1 {background-color: #ddd;}
.cont2 {background-color: #ddd;}
</style>

<div class="label">Click on the green square.</div>

<div id="cont1" class="cont cont1">
    <div id="test" title="Click me!"></div>
</div>
<div id="cont2" class="cont cont2"></div>

<script>
document.getElementById('test').addEventListener('click', function() {
    var newParent = this.parentNode.id == 'cont1' ? 'cont2' : 'cont1';
    document.getElementById(newParent).appendChild(this);
}, false);
</script>

Aetae 01.09.2011 01:38

Цитата:

Сообщение от melky (Сообщение 123991)
а как же атрибуты, обработчики событий ?

В том то и фишка.
<style>
p{text-align:center;height:25px;margin:0;border:1px solid #000}
</style>
<div id="hover">
<p><input type="button" value="recolor"></p>
<p></p>
<p></p>
<p></p>
<p></p>
</div>
<script>
var input = document.getElementsByTagName('input')[0];
document.getElementById('hover').onmouseover = function(e){
  var t=e?e.target:window.event.srcElement;
  if(t.tagName=='P'&&!t.firstChild)t.appendChild(input);
}
input.onclick = function(){this.parentNode.style.backgroundColor = 'rgb('+Math.floor(Math.random()*256)+',0,0)'}
</script>

Т.е. можнро навешивать обработчики без привязки к конкретному элементу. Хотя это и черевато.)


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