我认为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);
}
几年前,我想出了一个几乎运作良好的解决方案,我经常使用它,但我仍然希望看到更好的东西,这就是我的问题所在。我目前的策略是在主HTML文件的底部创建一个隐藏的div。例如:
<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);
}
好的,有一件事你注意到我的解决方案很糟糕,但是公平地说,如果你的模板有任何复杂性,它似乎会闪耀。模板的一个很好的候选者是具有5行或更多行的HTML。另一件有利的事情是它确实可以从HTML中获取HTML。现在我可以让我的HTML设计师在隐藏模板div中编辑HTML,并根据需要更改它的外观并放入类(很容易教他模板和他们做的事情)所以现在他没有'必须触摸Javascript。但是,最近我在将整个表定义为模板时遇到了一些问题。当JQuery读取模板时,它会尝试重新解释表格代码并将其搞砸。
答案 0 :(得分:2)
jQuery提供了一种语法,您可以在元素创建时指定属性。这应该提供你想要的干净的外观。
$('<tr />', {
id: 'foo',
class: 'row'
});
您可能还想查看将数据板x / y属性存储在数据对象中,而不是嵌入在id中。
$('<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);
答案 1 :(得分:1)
尝试jsRender,jsViews或jQuery templates
这些是模板化解决方案,可以很好地分离JavaScript和HTML。我自己使用jQuery模板,我发现它节省了大量时间,因为我不必担心JavaScript中的HTML,而且我的代码在没有HTML的情况下减少了80%。代码也更容易。花一点时间来检查模板。非常值得。
请注意,jQuery模板正在被放弃用于jsRender和jsViews,但jQuery模板目前非常适用于您需要做的事情,并且移动到jsRender或jsViews在概念方面将很简单,在理解方面没有太大变化和语法。