Gibt es eine bewährte Methode zum Generieren von HTML mit Javascript?
Lesezeit: 7 Minuten
ckarbass
Ich rufe einen Webdienst auf, der ein Array von Objekten in JSON zurückgibt. Ich möchte diese Objekte nehmen und ein Div mit HTML füllen. Nehmen wir an, jedes Objekt enthält eine URL und einen Namen.
Wenn ich für jedes Objekt folgenden HTML-Code generieren wollte:
Die Auswahl mong 1-4: hängt davon ab, wie viel Inhalt eingefügt werden soll. (bevorzugen Sie 4 für größere) wie viele verschiedene HTML-Teile insgesamt angehängt werden müssen (3 oder 4). mit was jdm vertraut ist. (Einfluss auf die Entwicklungszeit). Wenn Sie keine Tools kennen, ist es nur ein kleines Modal, das injiziert wird, sobald ich keinen besseren Weg als reines js kenne (1-2)
Die Optionen 1 und 2 werden Ihre direktesten Optionen sein, jedoch werden Sie bei beiden Optionen die Auswirkungen auf Leistung und Wartung spüren, indem Sie entweder Strings erstellen oder DOM-Objekte erstellen.
Das Erstellen von Vorlagen ist nicht so unausgereift, und Sie sehen es in den meisten großen Javascript-Frameworks als Popup.
Hier ist ein Beispiel in JQuery-Vorlagen-Plugin Das erspart Ihnen den Leistungseinbruch und ist wirklich, wirklich einfach:
var t = $.template('<div><img src="https://stackoverflow.com/questions/220603/${url}" />${name}</div>');
$(selector).append( t , {
url: jsonObj.url,
name: jsonObj.name
});
Ich sage, gehen Sie den coolen Weg (und leistungsfähiger, wartbarer) und verwenden Sie Templating.
JQuery-Templating scheint tot zu sein, siehe stackoverflow.com/questions/7911732/…
– James McMahon
22. Apr. ’13 um 20:26
@Jim Fiorato: Der Link ist tot :s
– Adrien Be
14. Februar ’14 um 16:32
Link ist tot, wie Adrien betont. Schlagen Sie vor, dass Sie Ihre Antwort aktualisieren, um Folgendes hinzuzufügen: Schnurrbart.js
– Herr Polywhirl
17. Februar ’14 um 21:46
Kann mir bitte jemand erklären, warum eine jQuery-basierte Antwort die akzeptierte ist? Ich bezweifle, dass dies die beste Vorgehensweise ist!
– WΩLLE – vɔlə
11. September ’16 um 17:27
@WoIIe Schlimmer noch, das jQuery-Plugin ist tot, daher ist diese Antwort veraltet.
– Franklin Yu
21. Dezember ’16 um 1:55
Wenn Sie unbedingt Strings verketten müssen, statt wie üblich:
var s="";
for (var i=0; i < 200; ++i) {s += "testing"; }
Verwenden Sie ein temporäres Array:
var s=[];
for (var i=0; i < 200; ++i) { s.push("testing"); }
s = s.join("");
Die Verwendung von Arrays ist viel schneller, insbesondere im IE. Ich habe vor einiger Zeit einige Tests mit Strings mit IE7, Opera und FF gemacht. Opera brauchte nur 0,4 Sekunden, um den Test durchzuführen, aber IE7 war nach 20 MINUTEN noch nicht fertig !!!! (Nein, ich mache keine Witze.) Mit Array war IE sehr schnell.
Ich habe vor langer Zeit den Browser gewechselt, also leide ich nicht so sehr. IE war ein schrecklicher Browser, aber er wird immer besser. Aber ich bezweifle, dass ich jemals zurück wechseln werde.
– manche
25. September ’10 um 11:15
Die langsame Leistung der ersten Methode ist wahrscheinlich, weil die Ergebniszeichenfolge 200 Mal neu zugewiesen werden muss und die Speicherzuweisungen langsam sein können. Nach zwei Iterationen haben Sie “testingtesting”. Nach drei Iterationen wird diese Zeichenfolge verworfen und Speicher mit genügend Platz für “testingtestingtesting” zugewiesen. Und so weiter 200 Mal mit allmählich zunehmender Länge. s.join() weist jedoch als Ergebnis einen neuen String zu, der lang genug ist, um alle aufzunehmen, und kopiert dann in jeden einzelnen. Eine Zuteilung, viel schneller.
var html = "<div><img src="#{src}" /> #{name}</div>".interpolate(json);
$('container').insert(html); // inserts at bottom
Ansatz #2:
var div = new Element('div');
div.insert( new Element('img', { src: json.src }) );
div.insert(" " + json.name);
$('container').insert(div); // inserts at bottom
Das explizite Generieren des HTML-Codes mit Zeichenfolgen anstelle von DOM-Elementen ist leistungsfähiger (vorausgesetzt, die Verkettung von Zeichenfolgen ist kein echtes Problem) und lesbar.
– Rodrick Chapman
21. Okt. 08 um 4:21 Uhr
Im IE ist die Verkettung von Strings immer ein Problem. Verwenden Sie stattdessen ein Array.
var tmpl="<div class="#{classname}">#{content}</div>";
var vals = {
classname : 'my-class',
content : 'This is my content.'
};
var html = $.tmpl(tmpl, vals);
Tzach
Ein modernerer Ansatz ist vielleicht die Verwendung einer Vorlagensprache wie z Schnurrbart, das Implementierungen in vielen Sprachen hat, einschließlich Javascript. Beispielsweise:
var view = {
url: "/hello",
name: function () {
return 'Jo' + 'hn';
}
};
var output = Mustache.render('<div><img src="https://stackoverflow.com/questions/220603/{{url}}" />{{name}}</div>', view);
Sie erhalten sogar einen zusätzlichen Vorteil – Sie können dieselben Vorlagen an anderen Stellen wiederverwenden, beispielsweise auf der Serverseite.
Wenn Sie kompliziertere Vorlagen benötigen (if-Anweisungen, Schleifen usw.), können Sie Lenker die mehr Funktionen hat und mit Moustache kompatibel ist.
Löwe
Sie können die HTML-Vorlage zu Ihrer Seite in einem versteckten Div hinzufügen und dann cloneNode und die Abfragefunktionen Ihrer bevorzugten Bibliothek verwenden, um sie zu füllen.
Es gibt eine Javascript-Bibliothek, die diesen Prozess viel einfacher macht namens BOB.
Für Ihr konkretes Beispiel:
<div><img src="the%20url" />the name</div>
Dies kann mit BOB durch den folgenden Code generiert werden.
new BOB("div").insert("img",{"src":"the%20url"}).up().content("the name").toString()
//=> "<div><img src="the%20url" />the name</div>"
Oder mit der kürzeren Syntax
new BOB("div").i("img",{"src":"the%20url"}).up().co("the name").s()
//=> "<div><img src="the%20url" />the name</div>"
Diese Bibliothek ist sehr mächtig und kann verwendet werden, um sehr komplexe Strukturen mit Dateneinfügung zu erstellen (ähnlich wie d3), zB:
data = [1,2,3,4,5,6,7]
new BOB("div").i("ul#count").do(data).i("li.number").co(BOB.d).up().up().a("a",{"href": "www.google.com"}).s()
//=> "<div><ul id="count"><li class="number">1</li><li class="number">2</li><li class="number">3</li><li class="number">4</li><li class="number">5</li><li class="number">6</li><li class="number">7</li></ul></div><a href="www.google.com"></a>"
BOB unterstützt derzeit nicht das Einfügen der Daten in das DOM. Das steht auf der Todoliste. Im Moment können Sie die Ausgabe einfach zusammen mit normalem JS oder jQuery verwenden und an einer beliebigen Stelle platzieren.
document.getElementById("parent").innerHTML = new BOB("div").insert("img",{"src":"the%20url"}).up().content("the name").s();
//Or jquery:
$("#parent").append(new BOB("div").insert("img",{"src":"the%20url"}).up().content("the name").s());
Ich habe diese Bibliothek erstellt, weil mir keine der Alternativen wie jquery und d3 gefallen hat. Der Code sehr kompliziert und schwer zu lesen. Die Arbeit mit BOB ist meiner Meinung nach, die offensichtlich voreingenommen ist, viel angenehmer.
BOB ist verfügbar auf Laube, damit du es bekommen kannst, indem du läufst bower install BOB.
Du hast eine tolle Arbeit geleistet. 🙂 Obwohl ich erwarte, Zeit zu investieren, um seine Struktur zu verstehen, bevor ich mich in einem komplexen Szenario anwende. Aber meiner Meinung nach die beste Lösung.
– Imran Faruqi
24. Dez. 20 um 4:45 Uhr
Danke @ImranFaruqi Es ist viel Zeit vergangen, seit ich an der Bibliothek gearbeitet habe, aber es sollte wie erwartet funktionieren. Zögern Sie nicht, dabei zu helfen, wenn es für Sie nützlich ist!
– Automatik
30. Dezember ’20 um 16:26
.
2241500cookie-checkGibt es eine bewährte Methode zum Generieren von HTML mit Javascript?yes
Sie können auch den Unterstrich js überprüfen: documentcloud.github.com/underscore/#template Es spielt sehr gut mit backbone.js
– luacassus
18. April ’12 um 18:36
Die Auswahl mong 1-4: hängt davon ab, wie viel Inhalt eingefügt werden soll. (bevorzugen Sie 4 für größere) wie viele verschiedene HTML-Teile insgesamt angehängt werden müssen (3 oder 4). mit was jdm vertraut ist. (Einfluss auf die Entwicklungszeit). Wenn Sie keine Tools kennen, ist es nur ein kleines Modal, das injiziert wird, sobald ich keinen besseren Weg als reines js kenne (1-2)
– Partizanos
14. Dezember ’16 um 18:19
html
string template
w3schools.com/js/js_string_templates.asp– Benutzer218867
13. November ’21 um 6:27