Comment créer des objets de Document avec JavaScript
Fondamentalement c'est la question, comment est-on censé construire un Document objet à partir d'une chaîne de HTML dynamiquement en javascript?
- C'est un vrai objet de Document. Pas sûr de ce que tu veux dire par "le simple xml/html structure"...
- Je veux dire le texte, la séquence de balises.
- Si vous regardez le cahier des charges de la
send()
méthode, vous remarquerez que les chaînes sont couverts par le "DOMString" cas. Par conséquent, le "Document" de cas ne peut pas dire une chaîne de caractères, c'est un objet qui implémente l'Document
l'interface spécifiée dans les DOM standard. - Oui, je l'ai lu, je voulais juste préciser, peut-être que vous connaissez des exemples de XMLHttpRequest utilisé pour envoyer le Document objet? Côté-question reste cependant - c'est peut-être pas que la large diffusion de l'usage, mais comment voulez-vous construire d'objet de Document?
- Maintenant que nous informés de cela, je vous recommande de modifier votre question, de sorte que le côté-question devient la principale question - "Comment créer des objets de Document avec JavaScript".
- Ok, allons-y.
- Si vous n'obtenez pas une bonne réponse dans les prochains 45 heures, rappelez-moi de mettre un bounty sur ce...
Vous devez vous connecter pour publier un commentaire.
Il y a deux méthodes définies dans les spécifications,
createDocument
de DOM de Base Niveau 2 etcreateHTMLDocument
de HTML5. L'ancien crée un document XML (y compris XHTML), la création d'un document HTML. Résident tous les deux, comme des fonctions, sur laDOMImplementation
interface.En réalité, ces méthodes sont plutôt jeunes et mis en œuvre seulement dans les dernières versions de navigateur. Selon http://quirksmode.org et MDN, les navigateurs suivants soutien
createHTMLDocument
:Assez intéressant, vous pouvez (genre de) créer un document HTML dans les anciennes versions d'Internet Explorer, à l'aide
ActiveXObject
:L'objet résultant sera un nouveau document, qui peut être manipulé comme tout autre document.
DOMParser.prototype.parseFromString
ou sur le réglage de lainnerHTML
propriété de le nouveau document de l'élément HTML. Toutefois, d'après MSDN (et démontré dans les essais) de la propriété innerHTML d'éléments HTML (et plusieurs autres) est lecture seule et ne peut pas être défini dans IE jusqu'à et y compris IE 9.document.open()
,document.write()
etdocument.close()
. Ils travaillent tous sous tous les navigateurs, y compris IE6 et inférieur. Le seul inconvénient est que toutes les méthodes pour IE6-8 analyser et exécuter le code JavaScript, qui n'est probablement pas souhaitable (ce qui n'était pas dans mon cas).document.open
etc. semble fonctionner revenir à IE 6 et est une alternative utile, mais il ne fonctionne pas dans les anciennes Firefox et les autres alors que lestringToXMLDoc
fonction que j'ai posté n', comme le fait lastringToHTMLDoc
fonction.document.open
est minuscule (Firefox pris en charge dans 1.5), probablement pas assez pour s'inquiéter.En supposant que vous êtes en train de créer un entièrement analysée objet d'un Document à partir d'une chaîne de balisage et d'un type de contenu vous aussi vous connaissez (peut-être parce que vous avez obtenu le code html à partir d'un xmlhttprequest, et ainsi obtenu le type de contenu dans ses
Content-Type
en-tête http, probablement habituellementtext/html
), il devrait être facile:dans un idéal de l'avenir du monde où navigateur
DOMParser
implémentations sont aussi fortes et compétentes que leur document rendu – c'est peut-être une bonne pipe de rêve exigence pour l'avenirHTML6
efforts de standardisation. Il s'avère aucun des navigateurs actuels, bien que.Vous avez probablement le plus facile (mais toujours en désordre) problème d'avoir une chaîne de html vous voulez obtenir un entièrement analysée
Document
objet. Voici une autre de prendre sur la façon de faire, qui devrait aussi fonctionner dans tous les navigateurs, tout d'abord vous faire un HTMLDocument
objet:et puis remplir avec votre fragment html:
Maintenant, vous avez une entièrement analysée DOM dans la doc, que vous pouvez exécuter
alert(doc.title)
sur, tranche avec les sélecteurs css commedoc.querySelectorAll('p')
ou idem à l'aide de XPathdoc.evaluate
.Cela fonctionne réellement moderne navigateurs WebKit, comme le Chrome et Safari (j'ai juste testé dans Chrome 22 et Safari 6, respectivement) – voici un exemple de l'actuel code source de la page, recrée dans une nouvelle variable de document
src
, lit son titre, l'écrase avec un html cité de la version du même code source et affiche le résultat dans un iframe: http://codepen.io/johan/full/KLIeEMalheureusement, je ne pense pas que tout autre contemporain de navigateurs sont assez solides implémentations encore.
doc.open()
write
/close
affecte le document en cours au lieu de ladoc
document. IE6+, Firefox 4+, Chrome 1+ et Safari 3.2+ prend en charge correctement cette méthode. J'ai envoyé un rapport de bug à l'Opéra.Par la spec (doc), on peut utiliser le
createHTMLDocument
méthode deDOMImplementation
, accessible viadocument.implementation
comme suit:DOMImplementation
: https://developer.mozilla.org/en/DOM/document.implementationDOMImplementation.createHTMLDocument
: https://developer.mozilla.org/En/DOM/DOMImplementation.createHTMLDocumentUne mise à jour de réponse pour 2014, DOMparser a évolué. Cela fonctionne dans tous les navigateurs actuels que je peux trouver, et devrait fonctionner aussi dans les versions antérieures d'IE, à l'aide ecManaut du document.la mise en œuvre.createHTMLDocument(") l'approche ci-dessus.
Essentiellement, IE, Opera, Firefox peut tout analyser "text/html". Safari s'analyse comme "text/xml".
Méfiez-vous de l'intolérance d'analyse XML, cependant. Le Safari analyser décomposera à la non-rupture des espaces et autres caractères HTML (français/allemand accents) désignés par des esperluettes. Plutôt que de traiter chaque personnage séparément, le code ci-dessous remplace tous les esperluettes sans signification chaîne de caractères "j!J!". Cette chaîne peut ensuite être ré-rendu par une esperluette lors de l'affichage des résultats dans un navigateur (de plus simple, j'ai trouvé que d'essayer de gérer les esperluettes dans les "faux" d'analyse XML).
Les ouvrages suivants, dans la plupart des navigateurs les plus courants, mais pas certains. C'est comment de simples il devrait être (mais n'est-ce pas):
Pour tenir compte de l'agent utilisateur aléas, les éléments suivants peuvent être mieux (veuillez noter que l'attribution):
Ne soyez pas rebutés par la quantité de code, il y a beaucoup de commentaires, il peut être raccourcie un peu, mais devient de moins en moins lisible.
Oh, et si le balisage est valide XML, la vie est beaucoup plus simple:
open()
,write()
etclose()
membres dedocument
, et cela peut être fait en collaboration avecnew ActiveXObject("htmlfile")
. Si vous n'êtes pas inquiet au sujet de l'exécution de script dans internet explorer 6 à 8, c'est un temps beaucoup plus court/plus facile d'approche. Votre modification à Eli Gris du code peut également utiliser ces méthodes et de réduire la taille vers le bas de manière significative.