В JQuery, как я могу сохранить HTML вне моего JavaScript?
Я думаю, что JQuery великолепен, но мне также нравится идея сохранить HTML-код в HTML-документе и практически ни одного из них в javascript. Что я имею в виду? Вы знаете, как, скажем, вы создаете динамическую таблицу, которая имеет много строк или переменное количество строк. Это именно то, что я не хочу делать:
function initBoard(symbol) {
for (var i=0;i<30;i++) {
myBoard += "<tr>";
enemyBoard += "<tr>";
for (var j=0;j<60;j++) {
myBoard += '<td bgcolor="#0000ff" id="my_sqr_'+i+'_'+j+'">'+symbol+</td>';
enemyBoard += '<td bgcolor="#ff0000" id="enemy_sqr_'+i+'_'+j+'">'+symbol+'</td>';
}
myBoard += "</tr>";
enemyBoard += "</tr>"
}
$("#my-board").html(myBoard);
$("#enemy-board").html(enemyBoard);
}
Несколько лет назад я придумал решение, которое почти хорошо работает, и я часто им пользуюсь, но я все еще хотел бы увидеть что-то лучшее, и в этом мой вопрос. Моя текущая стратегия состоит в том, чтобы создать скрытый div в нижней части основного файла HTML. Например:
<div class="hidden-templates" style="visibility:hidden;">
<div id="board-line-tpl">
<td bgcolor="--bg-color--" id="--side--_sqr_--index1--_--index2--">--symbol--</td>
</div>
</div>
а затем javascript изменяется на что-то вроде этого:
function initBoard(symbol) {
for (var i=0;i<30;i++) {
myBoard += "<tr>";
enemyBoard += "<tr>";
for (var j=0;j<60;j++) {
// Get the template
myBoardLine = $("#board-line-tpl").html();
// substitue the template's"variables" with unique data
myBoardLine.replace(/--side--/, "my");
myBoardLine.replace(/--bg-color--/, "#0000ff");
myBoardLine.replace(/--index1--/, i);
myBoardLine.replace(/--index2--/, j);
myBoardLine.replace(/--symbol--/, symbol);
myBoard += myBoardLine;
// You get the idea. I'll leave this line as is.
enemyBoard += '<td bgcolor="#ff0000" id="enemy_sqr_'+i+'_'+j+'"></td>';
}
myBoard += "</tr>";
enemyBoard += "</tr>"
}
$("#my-board").html(myBoard);
$("#enemy-board").html(enemyBoard);
}
Хорошо, одна вещь, которую вы замечаете, что отстой в моем решении, является немного более многословной, но, честно говоря, она выглядит блестящей, если ваш шаблон имеет какую-либо сложность. Хорошим кандидатом на шаблон является HTML с 5 или более строками. Еще одна вещь в его пользу - он делает работу по извлечению HTML из Javascript. Теперь я могу позволить своему HTML-дизайнеру редактировать HTML-код в div скрытого шаблона, а также изменять его внешний вид и помещать классы по своему усмотрению (его легко научить шаблонам и тому, что они делают), и теперь он этого не делает. не нужно трогать Javascript. Однако в последнее время у меня возникли проблемы с определением целых таблиц в качестве шаблона. Когда JQuery читает шаблон, он пытается переосмыслить код таблицы и испортит его.
2 ответа
jQuery предоставляет синтаксис, в котором вы можете указать атрибуты во время создания элемента. Это должно обеспечить чистый внешний вид, который вы хотите.
$('<tr />', {
id: 'foo',
class: 'row'
});
Возможно, вы также захотите сохранить атрибуты платы x / y в объекте данных, а не встраивать их в идентификатор.
$('<tr />').data('x', xval); //set data property
var xval = $(element).data('x');
Вот пример, основанный на вашем коде:
var $table = $('<table />');
for (var i = 0; i < 30; i++) {
var $row = $('<tr />');
for (var j=0;j<60;j++) {
var $td =($('<td />', {
id: i + '_' + j,
bgcolor: '#0000ff',
text: i
}));
$row.append($td);
}
$table.append($row);
}
$('body').append($table);
Попробуйте шаблоны jsRender, jsViews или jQuery
Это шаблонные решения, которые хорошо разделяют JavaScript и HTML. Я сам использую шаблоны jQuery и считаю, что это значительно экономит время, так как мне не нужно беспокоиться о HTML внутри JavaScript, а мой код буквально на 80% меньше из-за отсутствия HTML. Код также намного проще. Просто потратьте несколько минут, чтобы проверить шаблоны. Это того стоит.
Обратите внимание, что шаблоны jQuery оставлены для jsRender и jsViews, но шаблоны jQuery на данный момент работают очень хорошо для того, что вам нужно сделать, и переход к jsRender или jsViews будет простым с точки зрения концепций, а не с точки зрения понимания и синтаксиса.