6

假设你有一个 html 表:

<table id="data">
    <thead>
        <tr>
            <td>ID</td>
            <td>Username</td>
            <td>First Name</td>
            <td>Last Name</td>
        </tr>
    </thead>
    <tbody>
        <?php foreach($arrData as $arrRecord) { ?>
        <tr id="tr_<?php echo $arrRecord["id"]; ?>">
            <td><?php echo $arrRecord["username"]; ?></td>
            <td><?php echo $arrRecord["fname"]; ?></td>
            <td><?php echo $arrRecord["lname"]; ?></td>
        </tr>
        <?php }?>
    </tbody>
</table>

你有一个 JSON 对象:

objUser = {"id":12,"username":"j.smith","fname":"john","lname":"smith"};

并且您想在相应的表行中更改该记录(假设该表已经有一行 id="tr_12"):

$('#tr_' + objUser.id).find("td").eq(1).html(objUser.id);
$('#tr_' + objUser.id).find("td").eq(2).html(objUser.username);
$('#tr_' + objUser.id).find("td").eq(3).html(objUser.fname);
$('#tr_' + objUser.id).find("td").eq(4).html(objUser.lname);

有没有比最后显示的代码块更快/更干净的方式使用 jQuery 更新表行?

4

5 回答 5

8

我认为你可以做几件事

$('#tr_' + objUser.id).find("td").eq(1).html(objUser.id);
$('#tr_' + objUser.id).find("td").eq(2).html(objUser.username);
$('#tr_' + objUser.id).find("td").eq(3).html(objUser.fname);
$('#tr_' + objUser.id).find("td").eq(4).html(objUser.lname);

可能变成:

$this = $('#tr_' + objUser.id).find("td");
$this.eq(1).html(objUser.id);
// And so on

如果它已经存在,你可以做一个彻底的替换

if ($('#tr_' + objUser.id).length) {
    var newHtml = '<td>' + .objUser.username + '</td>'
            + '<td>' + objUser.fname + '</td>'
            + '<td>' + objUser.lname + '</td>';
    $('#tr_' + objUser.id).html(newHtml);
}
于 2013-06-11T13:09:20.750 回答
3
$(function() {
    var objUser = {"id":2,"username":"j.smith","fname":"john","lname":"smith"};
    var objKeys = ["username", "fname", "lname"];

    $('#tr_' + objUser.id + ' td').each(function(i) {
        $(this).text(objUser[objKeys[i]]);
    });
});

jsFiddle 代码

于 2013-06-11T13:17:18.970 回答
0

这不是一个好的解决方案,但有点短

 for(var i = 0; i < objUser.length; i++)
 {
    $('#tr_' + objUser.id).find("td").eq(i + 1).html(Object.keys(objUser)[i]);
 }
于 2013-06-11T13:02:06.647 回答
0

你可以在 Jquery 中使用 $.each

var i=1;var row=$('#tr_' + objUser.id);
$.each(objUser, function(key, element) {
  row.find("td").eq(i + 1).html(element);i+=1;
});

也许它更长,但你可以忘记 attr 名称。@jQuery00 给出的答案更短,但我无法运行它......

于 2013-06-11T13:17:57.440 回答
0

顺便说一句,您的起始 HTML 有 3 个<TD>单元格,其中 id 放置在 中<TR>,而您的 Javascript 创建了 4 个<TD>单元格,其中 id 放置在其中一个中。

如果您可以id向单元格添加属性(可能像"td_12_username"),那么在循环中匹配它们以确保放置正确的数据会更容易:

$.each(objUser, function(key, v){
  // Forces to skip the "id" key, otherwise sets value into the matching <TD>
  key !== "id" && $("#td_"+ objUser.id+ "_"+ key).html(val);
});

否则,如果您假设 JSON 对象的顺序和单元格的顺序将保持一致,您可以按照@jQuery00 的建议进行操作。如果您不希望将 id 作为单元格,则从 1 开始计数器除外。我建议children()find()这种情况下,因为它只查看 的直接子代,而<TR>不是所有可能的后代。

于 2013-06-11T13:23:20.987 回答