jQuery动态创建table / tr / td或etc并追加属性

时间:2010-03-02 12:18:13

标签: javascript jquery html-table refactoring

在一个例子中我有这个结构(小例子):

<table id=example>
<tr class="blah test example"><td>Test1</td><td><a href="url">LINK</a>Test11</td></tr>
<tr class="blah test example"><td>Test2</td><td><a href="url">LINK</a>Test22</td></tr>
<tr class="blah test example"><td>Test3</td><td><a href="url">LINK</a>Test33</td></tr>
</table>

在jQuery中,我会动态创建它:

var test = "<table id=" + someIDVar + ">"
           + "<tr class=" + classOneVar 
+ classTwoVar + classThreeVar + ">"....

等等...(很多其他的东西要写)。在我追加它之后:

$(".somePlaceInHtml").append(test);

有没有其他方法用jQuery动态编写这样的结构?这对我来说是个问题,因为我的结构很大,不像我在示例中所示的那么小。主要原因是我想为自己和维护此代码的其他开发人员提供更好的可读性。

5 个答案:

答案 0 :(得分:22)

这是一个简化的例子:

  $(function() {
    var tbl = $('<table></table>').attr({ id: "bob" });
    var row = $('<tr></tr>').attr({ class: ["class1", "class2", "class3"].join(' ') }).appendTo(tbl);
    $('<td></td>').text("text1").appendTo(row);
    $('<td></td>').text("Test22").prepend($('<a></a>').attr({ href: "#" }).text("LINK")).appendTo(row);        
    tbl.appendTo($(".somePlaceInHtml"));        
  });

将行部分包裹在一个循环中,替换为变量,在我看来它至少更容易维护/读取,但我习惯了jQuery,所以你的里程可能会有所不同,只是一个选项。

附注,因为它在任何地方使用.text(),它也有助于防止输出中的跨站点脚本攻击。

答案 1 :(得分:17)

你能用字符串制作一个“模板”吗?如果是,则将其存储在“常量”变量中(例如,在全局范围中定义),包含实际变量的占位符,如{0}{1}等,就像在C#中使用它{{1方法。

所以,你会得到这样的代码:

string.format()

然后,您将根据以下答案使用string.format实现:Equivalent of String.format in jQuery

答案 2 :(得分:1)

你可以创建一个StringBuilder,就像C#中的一样。这是从Telerik Extensions for ASP.NET MVC获取的代码段:

$.stringBuilder = function() {
    this.buffer = [];
};

$.stringBuilder.prototype = {

    cat: function(what) {
        this.buffer.push(what);
        return this;
    },

    string: function() {
        return this.buffer.join('');
    }
};

这样,您可以拥有以下代码:

var html = new $.stringBuilder();
for (var i in data)
    html.cat("<tr><td>").cat(i).cat("</td><td></tr>");

$('#element').append(html.string());

这种方法的好处是你可以快速连接(数组连接在IE6下表现更好),你可以用其他有用的函数扩展对象(比如,catIf采用布尔表达式,或者rep多次重复给定的字符串。)

答案 3 :(得分:1)

或者您可以代替将字符串连接在一起,以便使用array.join函数。

    for(var i=0;i<arr.length;i++)
    {
      arr[i] = "<tr>" + sth + "</tr>";       
    }

node.innerHTML = arr.join(''); 

答案 4 :(得分:-2)

window.onload = function(){
    var btn = document.createElement("button");
    btn.setAttribute("id", "submit_bttn");
    btn.style.width = 125 + "px";
    btn.style.height = 50 + "px";
    btn.innerHTML = "Submit";
    document.body.appendChild(btn);

    var x = document.getElementById("submit_bttn");
    x.onclick = function(){
        alert("hi");
    }
}