2010-02-17 3 views
4

У меня есть страница с iframe и вы хотите извлечь узел DOM из дочернего фрейма и поместить его на родительскую страницу. Это работает в Firefox (3.5), но не в Internet Explorer (7).Не удается appendChild к узлу, созданному из другого фрейма

Я разбил код на самый простой способ.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 

<html> 
<head> 
<title>Fragment</title> 
</head> 

<body> 

<iframe src="blank.html"></iframe> 

<script type="text/javascript"> 
window.onload = function() { 
    var fragment = document.createDocumentFragment(); 
    var div = frames[0].document.createElement("div"); 
    fragment.appendChild(div); 
}; 
</script> 

</body> 
</html> 

Я получаю сообщение об ошибке "Invalid argument" на линии "fragment.appendChild(div);". Ошибка, похоже, связана с тем, что я создаю фрагмент документа из документа iframe и элемент div из родительского документа. Этот код работает, если оба используют один и тот же документ.

Я хочу сохранить любые события, которые могут быть прикреплены к узлам DOM, поэтому я не хочу использовать innerHTML.

Кто-нибудь знает об этом?

+0

Я не думаю, что вы сможете это исправить. – SLaks

+0

FYI, я узнал, что он работает в IE8. – Adam

ответ

2

Я просто рискуя догадку здесь, но вы можете попробовать создания DIV с помощью

var div = frames[0].document.createElement("div") 

вместо

var div = document.createElement("div") 

Используя метод основного документа createElement() может быть причиной ИЭ проблема.

+0

Да, это действительно работает. Но это не исправить то, что я действительно пытаюсь сделать, переместить узлы с дочернего на родительский. – Adam

4

Ваша проблема в том, что вы не используете узлы во фрагменте, созданном в текущем документе. Используйте либо следующее:

fragment.appendChild(fragment.ownerDocument.createElement("div")); 

или

fragment.appendChild(fragment.ownerDocument.adoptNode(document.createElement("div")); 
+0

Ваш первый пример не будет работать на практике, потому что у меня нет контроля над тем, как создается элемент div. Я получаю сообщение об ошибке «Объект не поддерживает это свойство или метод» при попытке вызвать «acceptNode». – Adam

0

Я думаю, что я нашел ответ здесь: http://www.alistapart.com/articles/crossbrowserscripting/

Импорт документов из двух различных ownerDocument свойств ... требует использование DOM Уровень 2 метод importNode(), поскольку в этих случаях DOM не разрешит простой document.appendChild().

Смежные вопросы