Gibt es eine bewährte Methode zum Generieren von HTML mit Javascript?

Lesezeit: 7 Minuten

Gibt es eine bewahrte Methode zum Generieren von HTML mit
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:

<div><img src="https://stackoverflow.com/questions/220603/the%20url" />the name</div>

Gibt es dafür eine Best Practice? Ich sehe ein paar Möglichkeiten, dies zu tun:

  1. Strings verketten
  2. Elemente erstellen
  3. Verwenden Sie ein Vorlagen-Plugin
  4. Generieren Sie den HTML-Code auf dem Server und stellen Sie ihn dann über JSON bereit.

  • 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


Gibt es eine bewahrte Methode zum Generieren von HTML mit
Jim Fiorato

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.

    – EricP

    24. Mai ’14 um 0:11

  • @JoeCoder, stimmte zu, es ist ein Shlemiel The Painter-Algorithmus. joelonsoftware.com/articles/fog0000000319.html

    – Jodrell

    23. September ’15 um 15:43

Jede der ersten beiden Optionen ist sowohl üblich als auch akzeptabel.

Ich werde Beispiele für jeden geben in Prototyp.

// assuming JSON looks like this:
// { 'src': 'foo/bar.jpg', 'name': 'Lorem ipsum' }

Ansatz #1:

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.

    – manche

    7. Dez. 08 um 16:31 Uhr

Hier ist ein Beispiel mit my Einfache Vorlagen Plugin für jQuery:

var tmpl="<div class="#{classname}">#{content}</div>";
var vals = {
    classname : 'my-class',
    content   : 'This is my content.'
};
var html = $.tmpl(tmpl, vals);

1641744716 446 Gibt es eine bewahrte Methode zum Generieren von HTML mit
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.

Gibt es eine bewahrte Methode zum Generieren von HTML mit
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.

/* CSS */
.template {display:none;}

<!--HTML-->
<div class="template">
  <div class="container">
    <h1></h1>
    <img src="" alt="" />
  </div>
</div>

/*Javascript (using Prototype)*/
var copy = $$(".template .container")[0].cloneNode(true);
myElement.appendChild(copy);
$(copy).select("h1").each(function(e) {/*do stuff to h1*/})
$(copy).select("img").each(function(e) {/*do stuff to img*/})

1641744716 821 Gibt es eine bewahrte Methode zum Generieren von HTML mit
Gemeinschaft

Offenlegung: Ich bin der Betreuer von BOB.

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

.

224150cookie-checkGibt es eine bewährte Methode zum Generieren von HTML mit Javascript?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy