Хоча це innerHTML
може бути швидше, я не згоден з тим, що це краще з точки зору читабельності чи обслуговування. Може бути коротше розмістити все в одному рядку, але коротший код не завжди є більш ремонтопридатним.
Конкатенація рядків просто не масштабується, коли потрібно створювати динамічні елементи DOM, оскільки розкриття та закриття пропозицій та закриття пропозицій стає важким для відстеження. Розглянемо ці приклади:
Отриманий елемент являє собою div з двома внутрішніми інтервалами, вміст яких динамічний. Одне з імен класів (воїн) усередині першого прольоту також є динамічним.
<div>
<span class="person warrior">John Doe</span>
<span class="time">30th May, 2010</span>
</div>
Припустимо, що такі змінні вже визначені:
var personClass = 'warrior';
var personName = 'John Doe';
var date = '30th May, 2010';
Використовуючи лише innerHTML і збиваючи все в один рядок, ми отримуємо:
someElement.innerHTML = "<div><span class='person " + personClass + "'>" + personName + "</span><span class='time'>" + date + "</span></div>";
Вищезгаданий безлад можна очистити, використовуючи заміну рядків, щоб уникнути кожного разу відкриття та закриття рядків. Навіть для простих замін тексту я віддаю перевагу використаннюreplace
замість конкатенації рядків.
Це проста функція, яка приймає об'єкт ключів та значень заміни та замінює їх у рядку. Він передбачає, що клавіші мають префікс, $
щоб позначити їх як особливе значення. Він не виконує жодних екрануючих ситуацій та не обробляє випадків краю, коли це $
відображається у значенні заміни тощо.
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;
Це можна поліпшити, відокремлюючи атрибути, текст тощо під час побудови об'єкта, щоб отримати більш програмний контроль над побудовою елемента. Наприклад, за допомогою MooTools ми можемо передавати властивості об'єкта як карту. Це, безумовно, є більш ремонтопридатним, і я б стверджував, що це також читабельніше. jQuery 1.4 використовує подібний синтаксис для передачі карти для ініціалізації об'єктів DOM.
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]);
Я б не назвав чистий підхід DOM нижче більш читабельним, ніж описаний вище, але він, безумовно, більш ремонтопридатний, оскільки нам не потрібно відстежувати відкриття / закриття котирувань та численних знаків плюса.
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);
Найчитабельніша версія, швидше за все, буде результатом використання якогось шаблону JavaScript .
<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
});