在JQuery中如何保持我的JavaScript的HTML OUT?

时间:2012-01-21 05:40:48

标签: javascript jquery code-separation

我认为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读取模板时,它会尝试重新解释表格代码并将其搞砸。

2 个答案:

答案 0 :(得分:2)

jQuery提供了一种语法,您可以在元素创建时指定属性。这应该提供你想要的干净的外观。

$('<tr />', {
    id: 'foo',
    class: 'row'        
});

您可能还想查看将数据板x / y属性存储在数据对象中,而不是嵌入在id中。

$('<tr />').data('x', xval); //set data property
var xval = $(element).data('x');

以下是基于您的代码的示例:

http://jsfiddle.net/YAHDK/

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在概念方面将很简单,在理解方面没有太大变化和语法。