2010-04-12 9 views
0

Quelle est la wayto modifier le « corps » d'un arbre dom comme celui-ci en utilisant javascript:arbre dom Javascript modification

Original htm: <html> <head></head> <body> blah blah blah </body> </html> 

Modified html: <html> <head> </head> <abc> <body> blah blah blad </body> </abc> </html> 

C'est, je tiens à mettre l'ensemble corps noeud dans un autre nœud.

Le code que je suis en train est:

// Création d'un iframe

var orig_iframe = document.createElement ('iframe');

// Copier le contenu du corps à l'intérieur iframe

orig_iframe.contentDocument.innerHTML = document.body.innerHTML (je l'espère!);

// Définir corps du document à null

document.body.innerHTML = '';

// Ajouter iframe au corps

document.body.appendChild (orig_iframe);

qui ne fonctionne pas. De toute évidence, il me manque quelque chose!

Merci!

+0

Que se passe-t-il? Avez-vous des messages d'erreur? –

+2

Je ne voudrais pas essayer cela. Vous essayez de générer un DOM qui n'est pas conforme à la spécification HTML.Les navigateurs effectuent certains niveaux de récupération d'erreurs et parfois rejettent catégoriquement les modifications qui tentent de violer la spécification. – Quentin

+0

Voulez-vous envelopper un dans l'élément ? –

Répondre

1

orig_iframe.contentDocument.innerHTML = document.body.innerHTML;

Il n'y a pas la propriété innerHTML sur HTMLDocument, uniquement sur HTMLElement. Vous voudrez probablement définir innerHTML sur l'élément body du document iframe. Cependant, en écrivant iframe s a dynamiquement quelques rides du navigateur.

var html= document.body.innerHTML; 
var iframe= document.createElement('iframe'); 
document.body.appendChild(iframe); 
var idoc= 'contentDocument' in iframe? iframe.contentDocument : iframe.contentWindow.document; 
idoc.write('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head></head><body></body></html>'); 
idoc.close(); 
idoc.body.innerHTML= html; 

L'entreprise avec contentWindow est nécessaire pour IE jusqu'à la version 7, qui ne prennent pas en charge la propriété standard contentDocument.

L'appel write() consiste à s'assurer qu'un document minimal est présent dans le iframe afin que vous puissiez ensuite définir innerHTML sur son corps. La déclaration <!DOCTYPE est nécessaire pour mettre cette fenêtre en mode Standards (ce que j'espère utiliser également sur le document principal).

Pendant que vous pouvaitdocument.write le contenu HTML dans le nouveau document, qui provoquerait des <script> éléments à l'intérieur du corps pour exécuter à nouveau dans le nouveau document, que vous ne voulez probablement pas. L'écriture en innerHTML évite l'exécution immédiate des scripts de la chaîne.