appendChild в IE6/IE7 не работает с существующими элементами

У меня есть div, который нужно переместить из одного места в другое в DOM. Итак, на данный момент я делаю это так:

flex.utils.get('oPopup_About').appendChild(flex.utils.get('oUpdater_About'));

Но IE, будучи, ну, IE, не работает. Он работает во всех других браузерах, но не в IE.

Мне нужно сделать это таким образом, поскольку элемент (div) 'oUpdater_About' необходимо использовать повторно, поскольку он заполняется снова и снова.

Так что мне просто нужно иметь возможность перемещать div по DOM, appendChild позволит этому происходить во всех браузерах, но IE.

Заранее спасибо!


person jamesmhaley    schedule 05.08.2009    source источник
comment
appendChild всегда работал у меня в IE. Вы уверены, что flex.utils.get возвращает фактический узел элемента DOM, а не какой-то объект, похожий на узел, специфичный для библиотеки?   -  person NickFitz    schedule 05.08.2009
comment
Определенно, это всего лишь оболочка для сценария document.getElementById. Я попытался заменить его на document.getElementById, та же проблема. Может быть проблема в том, что я не создаю элемент на лету? Что он уже существует в DOM при загрузке. Теоретически не должно! Но вы знаете IE.   -  person jamesmhaley    schedule 05.08.2009
comment
Я никогда не сталкивался с этой проблемой; IE всегда работал у меня правильно, удаляя элемент из его существующего родителя и добавляя его к новому родителю. Попробуйте поместить оба узла в переменные, прежде чем выполнять добавление, чтобы вы могли использовать alert() (или предпочитаемый вами инструмент отладки), просто чтобы убедиться, что вы получаете то, что, по вашему мнению, получаете.   -  person NickFitz    schedule 05.08.2009
comment
Еще одна вещь: если элемент, к которому вы пытаетесь добавить, является таблицей, я считаю, что IE заставляет вас явно находить элемент tbody и добавлять к нему.   -  person NickFitz    schedule 05.08.2009


Ответы (3)


Вы должны сначала удалить узел, прежде чем вы сможете добавить его где-либо еще. Один узел не может находиться в двух местах одновременно.

var node = flex.utils.get('oUpdater_About')
node.parentNode.removeChild(node);
flex.utils.get('oPopup_About').appendChild(node);
person port-zero    schedule 05.08.2009
comment
Ты серьезно? это дико! вам не нужно делать это с помощью обычных манипуляций с DOM. Вызывает ли гибкая оболочка один и тот же код в IE и других браузерах? - person scunliffe; 05.08.2009
comment
@scanliffe: я не нашел подсказок, можете ли вы повторно добавить узел, который уже добавлен где-то в DOM. У вас есть источник, который мог бы прояснить это для меня? - person port-zero; 06.08.2009
comment
у меня был цикл ajax, который будет вызывать appendChild для каждого из моих дочерних узлов (даже если он фактически не перемещен на другой родительский узел). моя утечка памяти в IE решается простым вызовом removeChild. - person mangokun; 29.11.2010

обязательно клонируйте oUpdater_About (с node.cloneNode(true)) таким образом, вы получите копию и сможете повторно использовать фрагмент dom так часто, как хотите (в любом браузере)

person Niko    schedule 05.08.2009
comment
Я думаю, вы могли пропустить часть, где Спаркифилд сказал, что хочет перемещать элементы, а не копировать их. - person Jason Musgrove; 05.08.2009
comment
Вот и все, Джейсон, клонирование элемента будет означать, что у меня конфликтуют идентификаторы и элемент. Мне нужен один элемент, который нужно перемещать, а не копировать. Спасибо - person jamesmhaley; 05.08.2009

Этот пост предполагает, что действительно существует проблема с appendChild в отношении этого:

http://metadeveloper.blogspot.com/2007/01/ie-7-appendchild-bug.html

Вы пытались клонировать его, удалить, а затем вставить вместо него клон?

Джеймс

person James Wiseman    schedule 05.08.2009
comment
Да, это еще одна забава в IE. Вы должны добавить TR к TBODY в IE. Попытка добавить их непосредственно в TABLE потерпит неудачу. - person scunliffe; 05.08.2009