2010-02-17 3 views
4

J'ai une page avec un iframe et j'aimerais extraire un noeud DOM du cadre enfant et le placer sur la page parente. Cela fonctionne dans Firefox (3.5), mais pas dans Internet Explorer (7). J'ai décomposé le code du plus simple possible.Impossible d'appendChild à un noeud créé à partir d'une autre image

<!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> 

je reçois une erreur "Invalid argument" sur la ligne "fragment.appendChild(div);". L'erreur semble provenir du fait que je crée le fragment de document à partir du document iframe et l'élément div du document parent. Ce code fonctionne si les deux utilisent le même document. Je souhaite conserver tous les événements qui pourraient être attachés aux nœuds DOM, donc je ne veux pas utiliser innerHTML.

Quelqu'un sait-il une solution pour cela?

+0

Je ne pense pas que vous serez en mesure de résoudre ce problème. – SLaks

+0

FYI, j'ai découvert que cela fonctionne dans IE8. – Adam

Répondre

2

Je suis hasarder une supposition, mais vous pourriez essayer de créer la méthode div en utilisant

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

au lieu de

var div = document.createElement("div") 

En utilisant createElement() du document principal peut être la raison pour laquelle IE est avoir un problème.

+0

Oui, ça marche. Mais cela ne résout pas ce que j'essaie vraiment de faire, déplacer les nœuds de l'enfant vers le parent. – Adam

4

Votre problème est que vous n'adoptez pas les noeuds dans le fragment qui sont créés dans le document actuel. Utilisez soit les éléments suivants:

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

ou

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

Votre premier exemple ne fonctionnerait pas en pratique parce que je n'ai aucun contrôle sur la façon dont l'élément div est créé. Je reçois une erreur "L'objet ne supporte pas cette propriété ou méthode" en essayant d'appeler "adopterNode". – Adam

0

Je pense avoir trouvé la réponse ici: http://www.alistapart.com/articles/crossbrowserscripting/

Importation de documents de deux propriétés différentes ownerDocument ... nécessite l'utilisation du La méthode DOM Niveau 2 importNode(), puisque dans ces cas le DOM ne permettra pas un simple document.appendChild().

Questions connexes