Ich habe eine HTML-Zeichenfolge, die ein Element darstellt : '<li>text</li>'
. Ich möchte es an ein Element im DOM anhängen (a ul
in meinem Fall). Wie kann ich das mit Prototype oder mit DOM-Methoden machen?
(Ich weiß, dass ich dies in jQuery problemlos tun kann, aber leider verwenden wir jQuery nicht.)
javascript
dom
prototypejs
Omer Bokhari
quelle
quelle
var nodes = document.fromString("<b>Hello</b> <br>");
Antworten:
Hinweis: Die meisten aktuellen Browser unterstützen HTML-
<template>
Elemente, die eine zuverlässigere Möglichkeit bieten, das Erstellen von Elementen aus Zeichenfolgen zu ändern. Siehe Mark Amerys Antwort unten für Details .Verwenden Sie für ältere Browser und node / jsdom : (das
<template>
zum Zeitpunkt des Schreibens noch keine Elemente unterstützt ) die folgende Methode. Es ist dasselbe, was die Bibliotheken verwenden, um DOM-Elemente aus einer HTML-Zeichenfolge abzurufen ( mit etwas zusätzlicher Arbeit für den IE , um Fehler bei der Implementierung von zu umgeheninnerHTML
):Beachten Sie, dass dies im Gegensatz zu HTML-Vorlagen für einige Elemente, die legal keine untergeordneten Elemente von a sein können , wie z. B. s, nicht funktioniert .
<div>
<td>
Wenn Sie bereits eine Bibliothek verwenden, empfehlen wir Ihnen, sich an die von der Bibliothek genehmigte Methode zum Erstellen von Elementen aus HTML-Zeichenfolgen zu halten:
update()
Methode integriert .jQuery(html)
undjQuery.parseHTML
Methoden implementiert .quelle
createElementFromHTML
ist irreführend, dadiv.firstChild
a zurückgegeben wird,Node
was keinHTMLElement
zB kannnode.setAttribute
. So erstellen Sie stattdessen eineElement
Rückgabediv.firstElementChild
von der Funktion.<div>
Umschließen des HTML-Codes, mit dem ich hinzugefügt habe, hat.innerHTML
mich geärgert. Ich habe nie daran gedacht, es zu benutzen.firstChild
.div
und zu analysieren, und die Ausgabe erfolgt,[object SVGSVGElement]
während das Konsolenprotokoll mir das richtige DOM-Element gibt. Was mache ich falsch?In HTML 5 wurde das
<template>
Element eingeführt , das für diesen Zweck verwendet werden kann (wie jetzt in der WhatWG-Spezifikation und in den MDN-Dokumenten beschrieben) ).Ein
<template>
Element wird verwendet, um HTML-Fragmente zu deklarieren, die in Skripten verwendet werden können. Das Element wird im DOM als ein ElementHTMLTemplateElement
mit einer.content
Eigenschaft vomDocumentFragment
Typ dargestellt, um den Zugriff auf den Inhalt der Vorlage zu ermöglichen. Dies bedeutet, dass Sie eine HTML-Zeichenfolge in DOM-Elemente konvertieren können, indem Sie dasinnerHTML
eines<template>
Elements festlegen und dann in dastemplate
's greifen.content
Eigenschaft von .Beispiele:
Beachten Sie, dass ähnliche Ansätze, die ein anderes Containerelement verwenden, z. B. a
div
, nicht ganz funktionieren. In HTML gibt es Einschränkungen, welche Elementtypen in welchen anderen Elementtypen vorhanden sein dürfen. Zum Beispiel können Sie a nichttd
als direktes Kind von a setzendiv
. Dies führt dazu, dass diese Elemente verschwinden, wenn Sie versuchen, dasinnerHTML
von a so einzustellendiv
, dass sie sie enthalten. Schon seit<template>
s keine derartigen Einschränkungen für ihren Inhalt haben, gilt dieses Manko nicht, wenn eine Vorlage verwendet wird.Wird
template
jedoch in einigen alten Browsern nicht unterstützt. Ab Januar 2018 kann Can use ... Schätzungen zufolge verwenden 90% der Benutzer weltweit einen Browser, dertemplate
s unterstützt . Insbesondere unterstützt sie keine Version von Internet Explorer. Microsoft hat dietemplate
Unterstützung erst mit der Veröffentlichung von Edge implementiert .Wenn Sie das Glück haben, Code zu schreiben, der sich nur an Benutzer in modernen Browsern richtet, können Sie ihn jetzt verwenden. Andernfalls müssen Sie möglicherweise eine Weile warten, bis die Benutzer aufholen.
quelle
html.trim
Versteh mich nicht falsch, hier geht es nicht um die Leerzeichen , die durch inneres Parsen der innerHTML-Einstellung entfernt wurden. In meinem Fall werden wichtige Leerzeichen entfernt, die Teil eines textNode sind. :-(Verwenden Sie insertAdjacentHTML () . Es funktioniert mit allen aktuellen Browsern, auch mit IE11.
quelle
insertAdjacentHTML
funktioniert mit allen Browsern seit IE 4.0.innerHTML += ...
ist, dass Verweise auf vorherige Elemente mit dieser Methode noch intakt sind.beforebegin
,afterbegin
,beforeend
,afterend
. Siehe den MDN-Artikel.Neuere DOM-Implementierungen haben
range.createContextualFragment
das, was Sie wollen, auf rahmenunabhängige Weise.Es wird weitgehend unterstützt. Um sicherzugehen, überprüfen Sie die Kompatibilität in derselben MDN-Verbindung, da sie sich ändern wird. Ab Mai 2017 ist es das:
quelle
innerHTML
eines Div. Bestimmte Elemente wietd
s werden ignoriert und erscheinen nicht im resultierenden Fragment.Sie müssen keine Änderungen vornehmen, Sie haben eine native API:
quelle
<td>text</td>
. Dies liegt daran, dassDOMParser
versucht wird, ein vollständiges HTML-Dokument zu analysieren , und nicht alle Elemente als Stammelemente eines Dokuments gültig sind.Für bestimmte HTML-Fragmente wie
<td>test</td>
div.innerHTML, DOMParser.parseFromString und range.createContextualFragment (ohne den richtigen Kontext), die in anderen Antworten hier erwähnt werden, wird das<td>
Element nicht erstellt .jQuery.parseHTML () behandelt sie ordnungsgemäß (ich habe die parseHTML-Funktion von jQuery 2 in eine unabhängige Funktion extrahiert , die in Nicht-jquery-Codebasen verwendet werden kann).
Wenn Sie nur Edge 13+ unterstützen, ist es einfacher, nur das HTML5-Vorlagen-Tag zu verwenden:
quelle
Hier ist eine einfache Möglichkeit, dies zu tun:
quelle
Sie können gültige DOM-Knoten aus einer Zeichenfolge erstellen, indem Sie:
document.createRange().createContextualFragment()
Im folgenden Beispiel wird der Seite ein Schaltflächenelement hinzugefügt, das das Markup aus einer Zeichenfolge übernimmt:
quelle
DocumentFragment
Objekt, es immer noch - zu meiner großen Überraschung - leidet unter dem gleichen Mangel wie die akzeptierte Antwort: Wenn Sie das tundocument.createRange().createContextualFragment('<td>bla</td>')
, erhalten Sie ein Fragment , das nur den Text ‚bla‘ enthält ohne das<td>
Element. Zumindest beobachte ich das in Chrome 63; Ich habe mich nicht mit der Spezifikation befasst, um herauszufinden, ob es das richtige Verhalten ist oder nicht.Mit Prototype können Sie außerdem Folgendes tun:
HTML:
JS:
quelle
Ich verwende diese Methode (funktioniert in IE9 +), obwohl sie nicht analysiert
<td>
oder andere ungültige direkte Kinder des Körpers:quelle
Zur Verbesserung der weiterhin den nützlichen .toDOM () Code - Schnipsel , dass wir an verschiedenen Orten finden, können wir jetzt sicher verwenden Backticks ( Vorlage Literale ).
So können wir einfache und doppelte Anführungszeichen im foo haben HTML-Deklaration haben.
Dies verhält sich wie Heredocs für diejenigen, die mit dem Begriff vertraut sind.
Dies kann außerdem mit Variablen erweitert werden, um komplexe Vorlagen zu erstellen:
Warum also nicht direkt verwenden?
.innerHTML +=
? Auf diese Weise wird das gesamte DOM vom Browser neu berechnet, es ist viel langsamer.https://caniuse.com/template-literals
quelle
Ich habe einen
Document
Prototyp hinzugefügt , der ein Element aus einer Zeichenfolge erstellt:quelle
td
s nicht funktioniert .HTML5 & ES6
<template>
Demo
quelle
Spät aber nur als Notiz;
Es ist möglich, dem Zielelement ein triviales Element als Container hinzuzufügen und es nach der Verwendung zu entfernen.
// Getestet auf Chrom 23.0, Firefox 18.0, dh 7-8-9 und Oper 12.11.
quelle
Schnellste Lösung zum Rendern von DOM aus Zeichenfolgen:
Und hier können Sie die Leistung für DOM-Manipulation React vs native JS überprüfen
Jetzt können Sie einfach verwenden:
Und natürlich verwenden Sie in naher Zukunft Referenzen aus dem Speicher, da var "element" Ihr neu erstelltes DOM in Ihrem Dokument ist.
Und denken Sie daran, dass "innerHTML =" sehr langsam ist: /
quelle
Hier ist mein Code und es funktioniert:
quelle
Zum Teufel dachte ich, ich würde dies über einen komplizierten, aber dennoch einfachen Ansatz teilen, den ich mir ausgedacht habe ... Vielleicht findet jemand etwas Nützliches.
quelle
Warum nicht mit nativen js machen?
quelle
quelle
Mit der folgenden Funktion können Sie den Text "HTML" in das Element konvertieren
quelle
td
s funktioniert .Verwenden Sie jnerator
quelle
Hier ist Arbeitscode für mich
Ich wollte die Zeichenfolge ' Text ' in ein HTML-Element konvertieren
quelle
wwww
?var msg = "test" jQuery.parseHTML (msg)
quelle
Das wird auch funktionieren:
Mit den verketteten Funktionsaufrufen fühlt es sich eher wie eine Abfrage an.
quelle