28 Stimmen

Gute Praktiken für das Schreiben von HTML in Javascript

Ich habe mich gefragt, ob die Leute starke Meinungen über die beste Art und Weise haben, HTML on the fly zu generieren, insbesondere bei Ajax-basierten Anwendungen.

Erstellen Sie den HTML-Code mit Hilfe von serverseitigem Scripting und senden Sie ihn dann an die Seite, oder geben Sie vielleicht nur einen JSON-String zurück und überlassen Sie Javascript die Arbeit.

Meiner persönlichen Meinung nach bindet der erste Weg die Präsentationsschicht viel zu sehr an die Logik und macht sie schwerer zu ändern und zu einem Alptraum in der Wartung. Der zweite Weg ist zwar meine bevorzugte Methode, wird aber auch zu einem Alptraum, wenn die Komplexität des Projekts wächst.

Ich dachte an die Verwendung eines Javascript-Templating-System als eine weitere Schicht, nur um den Code robuster und weniger starr zu machen. Jemand hat gute Ideen für eine leichte und wirklich gute JS-Templating-System?

16voto

Jaanus Punkte 17458

http://ejohn.org/blog/javascript-micro-templating/ ist ein teuflisch genialer Hack für diesen Zweck. Das Endergebnis ist sehr sauber.

10voto

bobince Punkte 512550

Auch ich bevorzuge eine JSON-Antwort mit clientseitiger HTML-Erstellungslogik.

Leider sind die meisten echten clientseitigen HTML-Schreibskripte fehlerhaft und enthalten viele HTML-Injection-Fehler, die leicht zu Cross-Site-Scripting-Sicherheitslücken werden können. Ich glaube, man glaubt, dass man, weil man mit seinem eigenen Server und nicht direkt mit einem feindlichen Benutzer kommuniziert, irgendwie "sicher" ist und ohne korrekte Zeichenketten auskommt, wenn man sie in HTML interpoliert. Das ist natürlich Blödsinn.

Ich sehe immer Sachen wie:

$('#mydiv').append('<em>Deleted '+response.title+'!</em>');

oder:

mydiv.innerHTML= '<p>Renamed to '+response.name+'</p>;

oder auch Resigs Microtemplating-Hack, bei dem standardmäßig kein HTML-Escaping vorgenommen wird. Kommen Sie auf , Leute! Wir haben gerade erst damit begonnen, die Hinterlassenschaften kaputter PHP-Skripte zu beseitigen, die serverseitige XSS ausnutzen, und jetzt wollen Sie eine ganz neue, massive Reihe von clientseitigen XSS-Exploits einführen?

Seufz. Das ist die Verlockung der Streicher. Wir glauben, sie zu verstehen, und können sie beliebig aneinander reihen. Aber Strings sind tückisch, mit versteckten Kontexten und Escaping-Anforderungen. Wenn Sie HTML auf der Client-Seite generieren müssen, benötigen Sie eine Funktion wie diese:

function h(s) {
    return s.split('&').join('&amp;').split('<').join('&lt;').split('"').join('&quot;');
}

mydiv.innerHTML= '<p>Renamed to '+h(response.name)+'</p>;

Ich persönlich bevorzuge jedoch DOM-Methoden. Wie bei der Parametrisierung von SQL wird bei der Verwendung von DOM-Methoden das Schleudern von Zeichenketten vermieden, indem rohe Zeichenketten direkt an die Komponenten übergeben werden, die sie verbrauchen sollen. OK, das Problem mit dem DOM ist, dass es ziemlich langatmig ist:

var p= document.createElement('p');
p.appendChild(document.createTextNode('Renamed to '+response.name))
mydiv.appendChild(p);

Aber Sie können immer Hilfsfunktionen definieren, um das zu reduzieren, z. B.:

mydiv.appendChild(makeElement('p', {}, 'Renamed to'+response.name));

(Die neue Elementerstellung in jQuery 1.4 verwendet einen ähnlichen Stil).

3voto

Mic Punkte 24128

+Vor einem Jahr starteten wir eine neue Webanwendung und benötigten eine Möglichkeit, HTML aus JSON-Daten im Browser zu rendern.
Wir wollten es so schnell wie eine XML/XSLT-Transformation.

Unsere Antwort darauf war die JS Template Engine PURE .

Im Gegensatz zu den meisten JS-Templating-Libs um, hält es die HTML unberührt (keine seltsamen Tags überhaupt) und außer ein paar Notationen, bringt es nicht eine neue Sprache zu lernen, nur JS und HTML.

So verwende ich es:

  • Erstellen Sie das statische HTML direkt auf der Seite
  • Dann fügen Sie die JS-Logik Schritt für Schritt hinzu, und das HTML wird nach und nach lebendig
  • Sobald man sich daran gewöhnt hat, können sowohl HTML als auch JS ein sicheres, separates Entwicklungsleben haben und zwischen einem Designer und einem JS-Entwickler aufgeteilt werden.

1voto

Punit Vora Punkte 4884

Wir hatten ein System, in dem eine Menge Daten als JSON vom Server übergeben und dann durch eine Javascript-Templating-Engine auf der Client-Seite behandelt wurde. In .Net 4.0 (vielleicht sogar 3.5 sp1, ich bin nicht sicher), kann dies getan werden, mit Client-Vorlagen .

Ich würde die Übergabe von JSON der Übermittlung von HTML vorziehen. Es ist immer gut, Daten und Ansicht getrennt zu halten.

0voto

davidosomething Punkte 3279

Wenn Sie das MVC-Framework beibehalten wollen, sollten Sie Ihr Template-Framework das Templating übernehmen lassen. Die AJAX sollte nur die Serveranforderung ausführen, die alle DB- und Geschäftslogik ausführt und dann die URL zur Vorlage zurückgibt, die geladen werden soll.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X