La création d'un nouvel élément du DOM à partir d'une chaîne HTML à l'aide intégrée dans les méthodes du DOM ou Prototype
J'ai une chaîne HTML représentant un élément: '<li>text</li>'
. J'aimerais ajouter à un élément dans le DOM (un ul
dans mon cas). Comment puis-je le faire avec un Prototype ou avec les méthodes du DOM?
(Je sais que je pourrais le faire facilement en jQuery, mais malheureusement nous ne sommes pas à l'aide de jQuery.)
- Désolé, ce que vous essayez d'accomplir exactement? Chaîne HTML -> élément du dom?
- Il est malheureux que ces solutions sont donc indirects. Je souhaite que le comité des normes de spécifier quelque chose de similaire comme:
var nodes = document.fromString("<b>Hello</b> <br>");
- MDN: "HTML_to_DOM"
- J'ai eu un problème avec le ci-dessus, parce que j'ai eu les attributs nécessaires pour être passé le long et je n'ai pas envie de l'analyse d'eux: "<table id='5ccf9305-4b10-aec6-3c55-a6d218bfb107' class='table de données de la ligne-frontière d'affichage' cellspacing='0' width='100%'></table>" alors, j'ai simplement utilisé: $("<table id='5ccf9305-4b10-aec6-3c55-a6d218bfb107' class='table de données de la ligne-frontière d'affichage' cellspacing='0' width='100%'></table>")
Vous devez vous connecter pour publier un commentaire.
Remarque: la plupart des navigateurs actuels HTML
<template>
éléments, qui fournissent un moyen plus fiable de tournage de créer des éléments de chaînes de caractères. Voir Marque Amery la réponse ci-dessous pour plus de détails.Pour les anciens navigateurs, et node/jsdom: (qui n'est pas encore en charge
<template>
éléments au moment de l'écriture), utilisez la méthode suivante. C'est la même chose que les bibliothèques de l'utilisation à faire pour obtenir des éléments du DOM à partir d'une chaîne HTML (avec du travail supplémentaire pour IE pour contourner les bugs à sa mise en œuvre deinnerHTML
):Noter que, contrairement à des modèles HTML ce ne de travail pour certains éléments qui ne peuvent pas légalement être les enfants d'un
<div>
, comme<td>
s.Si vous utilisez déjà une bibliothèque, je vous recommande de vous en tenir à la bibliothèque méthode approuvée de créer des éléments de chaînes HTML:
update()
méthode.jQuery(html)
etjQuery.parseHTML
méthodes.createElementFromHTML
est trompeuse, car lesdiv.firstChild
renvoie uneNode
qui n'est pas unHTMLElement
par exemple, ne peut pasnode.setAttribute
. Pour créer unElement
retourdiv.firstElementChild
à partir de la fonction à la place.<div>
habillage de l'HTML, j'ai ajouté avec.innerHTML
a été ennuyeux moi. Je n'ai jamais pensé à utiliser.firstChild
.div
et et la sortie est[object SVGSVGElement]
tandis que le journal de la console me donne le bon élément du DOM. Ce que je fais mal?innerHTML
ne sera pas exécuté. Pour ces cas, mieux vaut aller avecvar script = document.createElement('script')
, et ensuite utiliserscript.src
ouscript.textContent
selon que le script est en ligne. Ensuite, ajouter le script avecdocument.body.appendChild(script)
.HTML 5 introduit la
<template>
élément qui peut être utilisé à cette fin (comme décrite dans la WhatWG spec et MDN docs).Un
<template>
est un élément HTML qui est permis à tout autre type d'élément comme un enfant. Letemplate
a un.content
de la propriété que vous pouvez y accéder avec le JavaScript qui pointe vers unDocumentFragment
avec le modèle de contenu. Cela signifie que vous pouvez convertir une chaîne HTML pour les éléments DOM, par la définition de lainnerHTML
d'un<template>
élément, puis pénètre dans latemplate
's.content
propriété.Exemples:
Noter que des approches similaires que utiliser un autre élément de conteneur comme une
div
n'avez pas assez de travail. HTML a des restrictions sur les types d'éléments peuvent exister à l'intérieur de laquelle d'autres types d'éléments; par exemple, vous ne pouvez pas mettre untd
comme un enfant direct d'undiv
. Ce sont les causes de ces éléments à disparaître, si vous essayez de définir lainnerHTML
d'undiv
pour les contenir. Depuis<template>
s n'ont pas de telles restrictions sur leur contenu, cette lacune ne s'applique pas lors de l'utilisation d'un modèle.Cependant,
template
n'est pas pris en charge dans certains navigateurs plus anciens. À partir de janvier 2018, puis-je utiliser... estimations 90% des utilisateurs sont globalement à l'aide d'un navigateur qui prend en chargemodèle
s. En particulier, aucune version d'Internet Explorer prend en charge les; Microsoft n'est pas de mettre en œuvretemplate
un soutien jusqu'à la libération de Bord.Si vous êtes assez chanceux pour être à l'écriture de code c'est uniquement destinée aux utilisateurs sur les navigateurs modernes, aller de l'avant et de les utiliser dès maintenant. Sinon, vous pourriez avoir à attendre un certain temps pour les utilisateurs de se rattraper.
innerHTML
définie comme une propriété de DOM fragment d'objets (à partir de<template>.content
) sur MDN: developer.mozilla.org/en-US/docs/Web/API/DocumentFragmentinnerHTML
du modèle lui-même (qui est unElement
), pas sa.content
(qui est unDocumentFragment
).html.trim
mais par l'intérieur de l'analyse de innerHTML réglage. Dans mon cas, il supprime les espaces importants faisant partie d'un textNode. 🙁Utilisation insertAdjacentHTML(). Il fonctionne avec tous les navigateurs actuels, même avec IE11.
JS:
HTML:
insertAdjacentHTML
fonctionne avec tous les navigateurs depuis IE 4.0.innerHTML += ...
est que les références à des éléments précédents est encore intact, à l'aide de cette méthode.beforebegin
,afterbegin
,beforeend
,afterend
. Voir le MDN article.Plus récent DOM implémentations ont
plage.createContextualFragment
, qui fait ce que vous voulez dans un cadre de manière indépendante.Il est largement pris en charge. Pour être sûr que, vérifier sa compatibilité bas dans la même MDN lien, car il sera en train de changer. En Mai 2017, ce qu'il est:
innerHTML
d'un div; certains éléments, commetd
s, sera ignoré et ne pas apparaître dans le résultat de ce fragment.Pas besoin de tweak, vous avez une API native:
<td>text</td>
. C'est parce queDOMParser
est d'essayer d'analyser un plein document HTML, et non pas tous les éléments ne sont valables qu'à la racine éléments d'un document.Heres un moyen simple de le faire:
Pour certains fragments de html comme
<td>test</td>
, div.innerHTML, DOMParser.parseFromString et de la plage.createContextualFragment (sans le bon contexte) solutions mentionnées dans d'autres réponses ici, ne va pas créer l'<td>
élément.jQuery.parseHTML() gère correctement (j'ai extrait jQuery 2 parseHTML fonction dans une fonction indépendante qui peut être utilisé dans la non-jquery code).
Si vous ne soutenir Edge 13+, il est plus simple de n'utiliser que le HTML5 template tag:
Avec Prototype, vous pouvez également le faire:
HTML:
JS:
Vous pouvez créer valide les nœuds DOM à partir d'une chaîne à l'aide de:
document.createRange().createContextualFragment()
L'exemple suivant ajoute un élément de bouton dans la page en prenant le balisage à partir d'une chaîne:
JS:
DocumentFragment
objet, toujours - à ma grande surprise - souffre du même défaut que l'on a accepté la réponse: si vous nedocument.createRange().createContextualFragment('<td>bla</td>')
, vous obtenez un fragment qui contient uniquement le texte " bla " sans l'<td>
élément. Ou du moins, c'est ce que j'observe dans Chrome 63; je n'ai pas fouillé dans les spec de comprendre si c'est le correct comportement ou pas.Je suis en utilisant cette méthode, qui Fonctionne dans IE9+), bien qu'il ne sera pas analyser
<td>
ou certains autres non valide direct de l'enfant de corps:J'ai ajouté un
Document
prototype qui crée un élément de la chaîne:td
s.À améliorer en outre la durée de .toDOM() extrait que l'on peut trouver dans des endroits différents, nous pouvons maintenant en toute sécurité utilisation backticks (modèle de littéraux).
Afin que nous puissions avoir les guillemets simples et doubles dans le foo html déclaration.
Cela se comportent comme des heredocs pour ceux qui sont familiers avec le terme.
Cela peut être amélioré en outre, avec des variables, des complexes de template:
JS:
CSS:
Alors, pourquoi ne pas utiliser directement
.innerHTML +=
?Ce faisant, l'ensemble de la DOM est recalculé par le navigateur, c'est beaucoup plus lent.
https://caniuse.com/template-literals
Tard, mais juste une remarque;
Il est possible d'ajouter un élément trivial à la cible de l'élément de conteneur et l'enlever après utilisation.
//Testé sur chrome 23.0, firefox 18.0, c'est à dire 7-8-9 et de l'opéra 12.11.
Voici mon code, et ça fonctionne:
HTML5 & ES6
<template>
Démo
JS:
CSS:
HTML:
Pour le fun j'ai pensé que je devais partager ce plus compliqué, mais encore approche simple, je suis venu avec... Peut-être que quelqu'un va trouver quelque chose d'utile.
var msg = "test"
jQuery.parseHTML(msg)
Ici est du code qui fonctionne pour moi
J'ai voulu convertir ' Texte " chaîne de l'élément HTML
Utilisation jnerator
Vous pouvez utiliser la fonction suivante pour convertir le texte "HTML" à l'élément
JS:
td
s.Ce sera trop de travail:
Il se sent plus comme un jquery sorte avec l'enchaînement des appels de fonction.