Ich habe ein Array, das ich durchlaufe. Jedes Mal, wenn eine Bedingung erfüllt ist, möchte ich eine Kopie des folgenden HTML
Codes an ein Containerelement mit einigen Werten anhängen .
Wo kann ich diesen HTML-Code auf intelligente Weise wiederverwenden?
<a href="#" class="list-group-item">
<div class="image">
<img src="" />
</div>
<p class="list-group-item-text"></p>
</a>
JQuery
$('.search').keyup(function() {
$('.list-items').html(null);
$.each(items, function(index) {
// APPENDING CODE HERE
});
});
javascript
jquery
json
Patrick Reck
quelle
quelle
Antworten:
Sie können sich dafür entscheiden, in Ihrem Projekt eine Vorlagen-Engine zu verwenden, z. B.:
Wenn Sie keine weitere Bibliothek einbinden möchten, bietet John Resig eine jQuery-Lösung an , die der folgenden ähnelt.
Browser und Screenreader ignorieren nicht erkannte Skripttypen:
Wenn Sie mit jQuery Zeilen basierend auf der Vorlage hinzufügen, ähnelt dies:
quelle
Alte Frage, aber da die Frage "using jQuery" lautet, dachte ich, ich würde eine Option bereitstellen, mit der Sie dies tun können, ohne eine Herstellerabhängigkeit einzuführen.
Zwar gibt es eine Vielzahl von Template-Engines, doch viele ihrer Funktionen haben sich in letzter Zeit als ungünstig erwiesen , wobei Iteration (
<% for
), Bedingungen (<% if
) und Transformationen (<%= myString | uppercase %>
) bestenfalls als Mikrosprache und im schlimmsten Fall als Anti-Patterns angesehen werden. Moderne Vorlagenpraktiken empfehlen, ein Objekt einfach seiner DOM-Darstellung (oder einer anderen Darstellung) zuzuordnen, z. B. dem, was wir mit Eigenschaften sehen, die Komponenten in ReactJS zugeordnet sind (insbesondere zustandslose Komponenten).Vorlagen in HTML
Eine Eigenschaft, auf die Sie sich verlassen können, um den HTML-Code für Ihre Vorlage neben dem Rest Ihres HTML-Codes zu halten, ist die Verwendung eines nicht ausgeführten
<script>
type
, z<script type="text/template">
. Für Ihren Fall:Lesen Sie beim Laden des Dokuments Ihre Vorlage und markieren Sie sie mit einem einfachen Token
String#split
Beachten Sie, dass Sie unser Token im alternierenden
[text, property, text, property]
Format erhalten. Auf diese Weise können wir esArray#map
mit einer Mapping-Funktion gut abbilden:Wo
props
könnte so aussehen{ url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.Alles zusammen, vorausgesetzt, Sie haben Ihre Daten
itemTpl
wie oben beschrieben analysiert und geladen und haben einitems
Array im Gültigkeitsbereich:Dieser Ansatz ist auch nur knapp jQuery - Sie sollten in der Lage sein, den gleichen Ansatz mit Vanille-Javascript mit
document.querySelector
und zu verfolgen.innerHTML
.jsfiddle
Vorlagen in JS
Eine Frage, die Sie sich stellen sollten, lautet: Möchten / müssen Sie Vorlagen wirklich als HTML-Dateien definieren? Sie können eine Vorlage jederzeit so komponieren und wiederverwenden, wie Sie die meisten Dinge, die Sie wiederholen möchten, wiederverwenden würden: mit einer Funktion.
In es7-land können Sie mithilfe von Destrukturierung, Vorlagenzeichenfolgen und Pfeilfunktionen geradezu hübsch aussehende Komponentenfunktionen schreiben, die mit der
$.fn.html
obigen Methode einfach geladen werden können .Dann können Sie es einfach rendern, sogar aus einem Array, wie folgt:
Oh und letzter Hinweis: Vergessen Sie nicht, Ihre an eine Vorlage übergebenen Eigenschaften zu bereinigen, wenn sie aus einer Datenbank gelesen wurden oder jemand HTML von Ihrer Seite übergeben (und dann Skripte usw. ausführen) könnte.
quelle
Verwenden Sie stattdessen eine HTML-Vorlage!
Da die akzeptierte Antwort eine Überladungsskriptmethode darstellen würde, möchte ich eine andere vorschlagen, die meiner Meinung nach aufgrund der XSS-Risiken, die mit dem Überladen von Skripten einhergehen, viel sauberer und sicherer ist.
Ich habe eine Demo erstellt , um Ihnen zu zeigen, wie Sie sie in einer Aktion verwenden und wie Sie eine Vorlage in eine andere einfügen, bearbeiten und dann zum Dokument-DOM hinzufügen.
Beispiel HTML
Beispiel js
HTML <Vorlage>
+ Sein Inhalt ist bis zur Aktivierung effektiv inert. Im Wesentlichen ist Ihr Markup DOM versteckt und wird nicht gerendert.
+ Inhalte in einer Vorlage haben keine Nebenwirkungen. Skripte werden nicht ausgeführt, Bilder werden nicht geladen, Audio wird nicht abgespielt ... bis die Vorlage verwendet wird.
+ Inhalt wird als nicht im Dokument enthalten angesehen. Wenn Sie
document.getElementById()
oderquerySelector()
auf der Hauptseite verwenden, werden keine untergeordneten Knoten einer Vorlage zurückgegeben.+ Vorlagen können überall innerhalb des platziert werden
<head>
,<body>
oder ,<frameset>
und jede Art von Inhalt enthalten können , die in diesen Elementen erlaubt. Beachten Sie, dass "überall" bedeutet, dass<template>
es sicher an Orten verwendet werden kann, die der HTML-Parser nicht zulässt.Zurückfallen
Browser-Unterstützung sollte kein Problem sein, aber wenn Sie alle Möglichkeiten abdecken möchten, können Sie eine einfache Überprüfung durchführen:
Einige Einblicke in das Überladen von Skriptmethoden
<script>
Tagdisplay:none
standardmäßig vorhanden ist."text/javascript"
..innerHTML
. Das Parsen von vom Benutzer bereitgestellten Daten zur Laufzeit von Zeichenfolgen kann leicht zu XSS-Schwachstellen führen.Vollständiger Artikel: https://www.html5rocks.com/de/tutorials/webcomponents/template/#toc-old
Nützliche Referenz: https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode http://caniuse.com/#feat=queryselector
ERSTELLEN VON WEBKOMPONENTEN Erstellen eines Tutorials für benutzerdefinierte Webkomponenten mithilfe von HTML-Vorlagen von Trawersy Media: https://youtu.be/PCWaFLy3VUo
quelle
template
Element wird von Internet Explorer nicht unterstützt (Stand 2018, IE11). Getestet mit Beispiel 580 von w3c.github.io/html/single-page.html .<template>
, obwohl ich empfehlen würde, Klassen großzügig zu verwenden, damit klar ist, welche Requisiten auf was eingestellt werden. Es sind noch einige Kenntnisse erforderlich, um Ihre Daten ordnungsgemäß in die Vorlage abzubilden, insbesondere mithilfe eines komponentenartigen Ansatzes für die Zuordnung in großen Datenmengen. Persönlich mag ich es immer noch, nur den HTML-Code in Funktionen zu erstellen oder im Idealfall das DOM direkt mit JS selbst zu erstellen und ganz auf HTML zu verzichten (z. B. wie React es macht).Fügen Sie irgendwo im Körper hinzu
dann erstellen Sie CSS
und füge zu deinem js hinzu
quelle
.children().clone()
als.html()
. Die Geschwindigkeit beträgt ungefähr 3: 1 für einen Zufall, den<tr/>
ich mit diesem Code auf einer Seite hattei=10000; time=performance.now(); while (--i) {$a.clone().append(0 ? $b.html() : $b.children().clone())} performance.now()-time
. Das Verhältnis ist tatsächlich etwas übertrieben, weil ich $ a.clone () verwende, aber der Versuch, es bei jeder Iteration zu leeren, ist eher ein Leistungseinbruch als das Klonen, daher bin ich mir nicht sicher, wie ich es genauer machen soll, weil Timing-Funktionen haben ihre eigenen Kosten.Andere Alternative: Rein
Ich benutze es und es hat mir sehr geholfen. Ein Beispiel auf ihrer Website gezeigt:
HTML
JSON
Ergebnis
quelle
Um dieses Problem zu lösen, erkenne ich zwei Lösungen:
Der erste geht mit AJAX, mit dem Sie die Vorlage aus einer anderen Datei laden und jedes Mal hinzufügen müssen, wenn Sie möchten
.clone()
.Berücksichtigen Sie, dass das Ereignis nach Abschluss des Ajax hinzugefügt werden sollte, um sicherzustellen, dass die Daten verfügbar sind!
Die zweite Möglichkeit wäre, es direkt an einer beliebigen Stelle im ursprünglichen HTML-Code hinzuzufügen, auszuwählen und in jQuery auszublenden:
Sie können nach dem Hinzufügen einer neuen Instanz der Vorlage mit
Wie die vorherige, aber wenn Sie nicht möchten, dass die Vorlage dort bleibt, sondern nur im Javascript, können Sie sie verwenden (haben sie nicht getestet!),
.detach()
Anstatt sie auszublenden..detach()
Entfernt Elemente aus dem DOM, während die Daten und Ereignisse am Leben bleiben (.remove () nicht!).quelle
Sehr gute Antwort von DevWL zur Verwendung des nativen HTML5- Vorlagenelements . Um zu dieser guten Frage aus dem OP beizutragen, möchte ich hinzufügen, wie dieses
template
Element mit jQuery verwendet wird, zum Beispiel:Der Inhalt von
template
ist nicht HTML, sondern wird nur als Daten behandelt. Sie müssen den Inhalt also in ein jQuery-Objekt einschließen, um dann auf die Methoden von jQuery zugreifen zu können.quelle