Obwohl innerHTML
es schneller sein kann, stimme ich nicht zu, dass es in Bezug auf Lesbarkeit oder Wartung besser ist. Es kann kürzer sein, alles in eine Zeichenfolge zu setzen, aber kürzerer Code ist nicht immer notwendigerweise wartbarer.
Die Verkettung von Zeichenfolgen lässt sich einfach nicht skalieren, wenn dynamische DOM-Elemente als Pluszeichen erstellt werden müssen und das Öffnen und Schließen von Anführungszeichen schwierig zu verfolgen ist. Betrachten Sie diese Beispiele:
Das resultierende Element ist ein Div mit zwei inneren Bereichen, deren Inhalt dynamisch ist. Einer der Klassennamen (Krieger) innerhalb der ersten Spanne ist ebenfalls dynamisch.
<div>
<span class="person warrior">John Doe</span>
<span class="time">30th May, 2010</span>
</div>
Angenommen, die folgenden Variablen sind bereits definiert:
var personClass = 'warrior';
var personName = 'John Doe';
var date = '30th May, 2010';
Wenn wir nur innerHTML verwenden und alles zu einer einzigen Zeichenfolge zusammenfügen, erhalten wir:
someElement.innerHTML = "<div><span class='person " + personClass + "'>" + personName + "</span><span class='time'>" + date + "</span></div>";
Das obige Durcheinander kann durch Ersetzen von Saiten behoben werden, um zu vermeiden, dass Saiten jedes Mal geöffnet und geschlossen werden. Selbst für einfache Textersetzungen bevorzuge ich die Verwendung replace
anstelle der Verkettung von Zeichenfolgen.
Dies ist eine einfache Funktion, die ein Objekt aus Schlüsseln und Ersetzungswerten nimmt und diese in der Zeichenfolge ersetzt. Es wird davon ausgegangen, dass den Schlüsseln ein Präfix vorangestellt ist, $
um anzuzeigen, dass es sich um einen speziellen Wert handelt. Es werden keine Flucht- oder Kantenfälle ausgeführt, $
die im Wiederbeschaffungswert usw. angegeben sind.
function replaceAll(string, map) {
for(key in map) {
string = string.replace("$" + key, map[key]);
}
return string;
}
var string = '<div><span class="person $type">$name</span><span class="time">$date</span></div>';
var html = replaceAll(string, {
type: personClass,
name: personName,
date: date
});
someElement.innerHTML = html;
Dies kann verbessert werden, indem die Attribute, der Text usw. beim Erstellen des Objekts getrennt werden, um eine programmgesteuerte Kontrolle über die Elementkonstruktion zu erhalten. Mit MooTools können wir beispielsweise Objekteigenschaften als Karte übergeben. Dies ist sicherlich besser zu warten, und ich würde auch besser lesbar argumentieren. jQuery 1.4 verwendet eine ähnliche Syntax, um eine Zuordnung zum Initialisieren von DOM-Objekten zu übergeben.
var div = new Element('div');
var person = new Element('span', {
'class': 'person ' + personClass,
'text': personName
});
var when = new Element('span', {
'class': 'time',
'text': date
});
div.adopt([person, when]);
Ich würde den reinen DOM-Ansatz unten nicht als besser lesbar bezeichnen als den oben genannten, aber er ist sicherlich besser zu warten, da wir das Öffnen / Schließen von Anführungszeichen und zahlreiche Pluszeichen nicht im Auge behalten müssen.
var div = document.createElement('div');
var person = document.createElement('span');
person.className = 'person ' + personClass;
person.appendChild(document.createTextNode(personName));
var when = document.createElement('span');
when.className = 'date';
when.appendChild(document.createTextNode(date));
div.appendChild(person);
div.appendChild(when);
Die am besten lesbare Version würde sich höchstwahrscheinlich aus der Verwendung einer Art JavaScript-Vorlage ergeben .
<div id="personTemplate">
<span class="person <%= type %>"><%= name %></span>
<span class="time"><%= date %></span>
</div>
var div = $("#personTemplate").create({
name: personName,
type: personClass,
date: date
});