J'ai une chaîne HTML représentant un élément: '<li>text</li>'
. Je voudrais l'ajouter à un élément du DOM (un ul
dans mon cas). Comment puis-je faire cela avec Prototype ou avec les méthodes DOM?
(Je sais que je pourrais le faire facilement dans jQuery, mais malheureusement nous n'utilisons pas jQuery.)
javascript
dom
prototypejs
Omer Bokhari
la source
la source
var nodes = document.fromString("<b>Hello</b> <br>");
Réponses:
Remarque: la plupart des navigateurs actuels prennent en charge les
<template>
éléments HTML , qui offrent un moyen plus fiable de transformer la création d'éléments à partir de chaînes. Voir la réponse de Mark Amery ci-dessous pour plus de détails .Pour les navigateurs plus anciens et node / jsdom : (qui ne prend pas encore en charge les
<template>
éléments au moment de la rédaction), utilisez la méthode suivante. C'est la même chose que les bibliothèques utilisent pour obtenir des éléments DOM à partir d'une chaîne HTML ( avec un travail supplémentaire pour IE pour contourner les bogues avec son implémentation deinnerHTML
):Notez que contrairement aux modèles HTML, cela ne fonctionnera pas pour certains éléments qui ne peuvent pas légalement être des enfants de a
<div>
, tels que<td>
s.Si vous utilisez déjà une bibliothèque, je vous recommande de vous en tenir à la méthode approuvée par la bibliothèque pour créer des éléments à partir de chaînes HTML:
update()
méthode .jQuery(html)
etjQuery.parseHTML
.la source
createElementFromHTML
est trompeur cardiv.firstChild
retourne unNode
qui n'est pas unHTMLElement
exemple ne peut pasnode.setAttribute
. Pour créer unElement
retourdiv.firstElementChild
de la fonction à la place.<div>
habillage du HTML que j'ai ajouté.innerHTML
me gênait. Je n'ai jamais pensé à utiliser.firstChild
.div
et et la sortie est[object SVGSVGElement]
alors que le journal de la console me donne l'élément DOM correct. Qu'est-ce que je fais mal?HTML 5 a introduit l'
<template>
élément qui peut être utilisé à cet effet (comme décrit maintenant dans les spécifications WhatWG et les documents MDN ).Un
<template>
élément est utilisé pour déclarer des fragments de HTML qui peuvent être utilisés dans des scripts. L'élément est représenté dans le DOM comme unHTMLTemplateElement
qui a une.content
propriété deDocumentFragment
type, pour donner accès au contenu du modèle. Cela signifie que vous pouvez convertir une chaîne HTML à des éléments DOM en définissant leinnerHTML
d'un<template>
élément, pour atteindre ensuite dans latemplate
de ».content
la propriété.Exemples:
Notez que des approches similaires qui utilisent un élément de conteneur différent tel qu'un a
div
ne fonctionnent pas tout à fait. HTML a des restrictions sur les types d'éléments autorisés à exister à l'intérieur de quels autres types d'éléments; par exemple, vous ne pouvez pas mettre un entd
tant qu'enfant direct d'undiv
. Cela provoque la disparition de ces éléments si vous essayez de définir leinnerHTML
de adiv
pour les contenir. Puisque les<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 anciens navigateurs. En janvier 2018, Puis-je utiliser ... estime que 90% des utilisateurs dans le monde utilisent un navigateur qui prend en charge l'template
art . En particulier, aucune version d'Internet Explorer ne les prend en charge; Microsoft n'a pas implémenté letemplate
support avant la sortie d'Edge.Si vous avez la chance d'écrire du code uniquement destiné aux utilisateurs de navigateurs modernes, allez-y et utilisez-les dès maintenant. Sinon, vous devrez peut-être attendre un certain temps pour que les utilisateurs se rattrapent.
la source
html.trim
mais par l'analyse interne du paramètre innerHTML. Dans mon cas, il supprime les espaces importants faisant partie d'un textNode. :-(Utilisez insertAdjacentHTML () . Il fonctionne avec tous les navigateurs actuels, même avec IE11.
la source
insertAdjacentHTML
fonctionne avec tous les navigateurs depuis IE 4.0.innerHTML += ...
est que les références aux éléments précédents sont toujours intactes en utilisant cette méthode.beforebegin
,afterbegin
,beforeend
,afterend
. Voir l'article MDN.Les implémentations DOM plus récentes ont
range.createContextualFragment
, ce qui fait ce que vous voulez d'une manière indépendante du framework.Il est largement pris en charge. Pour être sûr cependant, vérifiez sa compatibilité dans le même lien MDN, car il va changer. En mai 2017, c'est tout:
la source
innerHTML
d'un div; certains éléments, commetd
s, seront ignorés et n'apparaîtront pas dans le fragment résultant.Pas besoin de réglage, vous avez une API native:
la source
<td>text</td>
. En effet,DOMParser
tente d'analyser un document HTML complet et tous les éléments ne sont pas valides en tant qu'éléments racine d'un document.Pour certains fragments html comme
<td>test</td>
, div.innerHTML, DOMParser.parseFromString et range.createContextualFragment (sans le bon contexte) les solutions mentionnées dans d'autres réponses ici, ne créeront pas l'<td>
élément.jQuery.parseHTML () les gère correctement (j'ai extrait la fonction parseHTML de jQuery 2 dans une fonction indépendante qui peut être utilisée dans des bases de code non jquery).
Si vous ne prenez en charge que Edge 13+, il est plus simple d'utiliser simplement la balise de modèle HTML5:
la source
Voici une façon simple de le faire:
la source
Vous pouvez créer des nœuds DOM valides à partir d'une chaîne en utilisant:
document.createRange().createContextualFragment()
L'exemple suivant ajoute un élément de bouton dans la page en prenant le balisage d'une chaîne:
la source
DocumentFragment
objet, il souffre toujours - à ma grande surprise - du même défaut que la réponse acceptée: si vous le faitesdocument.createRange().createContextualFragment('<td>bla</td>')
, vous obtenez un fragment qui contient juste 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 la spécification pour déterminer si c'est le bon comportement ou non.Avec Prototype, vous pouvez également faire:
HTML:
JS:
la source
J'utilise cette méthode (fonctionne dans IE9 +), même si elle n'analysera pas
<td>
ou d'autres enfants directs du corps invalides:la source
Pour améliorer en outre l' extrait .toDOM () utile que nous pouvons trouver à différents endroits, nous pouvons désormais utiliser en toute sécurité les backticks ( littéraux de modèle ).
Nous pouvons donc avoir des guillemets simples et doubles dans le foo déclaration html.
Cela se comporte comme des heredocs pour ceux qui connaissent le terme.
Cela peut être amélioré en outre avec des variables, pour rendre le modèle complexe:
Alors, pourquoi ne pas utiliser directement
.innerHTML +=
? Ce faisant, l'ensemble du DOM est recalculé par le navigateur, c'est beaucoup plus lent.https://caniuse.com/template-literals
la source
J'ai ajouté un
Document
prototype qui crée un élément à partir d'une chaîne:la source
td
art.HTML5 et ES6
<template>
Démo
la source
Tard mais juste comme une note;
Il est possible d'ajouter un élément trivial à l'élément cible en tant que conteneur et de le supprimer après utilisation.
// Testé sur chrome 23.0, firefox 18.0, c'est-à-dire 7-8-9 et opéra 12.11.
la source
Solution la plus rapide pour rendre le DOM à partir d'une chaîne:
Et ici vous pouvez vérifier les performances de la manipulation DOM React vs JS natif
Maintenant, vous pouvez simplement utiliser:
Et bien sûr, dans un futur proche, vous utiliserez des références de la mémoire car var "element" est votre nouveau DOM créé dans votre document.
Et rappelez-vous que "innerHTML =" est très lent: /
la source
Voici mon code, et cela fonctionne:
la source
Pour le diable, je pensais que je partagerais cela sur une approche compliquée mais simple que j'ai trouvée ... Peut-être que quelqu'un trouvera quelque chose d'utile.
la source
Pourquoi ne pas faire avec des js natifs?
la source
la source
Vous pouvez utiliser la fonction suivante pour convertir le texte "HTML" en élément
la source
td
al.Utiliser jnerator
la source
Voici le code de travail pour moi
Je voulais convertir la chaîne ' Text ' en élément HTML
la source
wwww
?var msg = "test" jQuery.parseHTML (msg)
la source
Cela fonctionnera aussi:
Cela ressemble plus à une manière jquery avec les appels de fonction chaînés.
la source