首先将Tr移动到thead并使用jquery

时间:2016-08-31 13:38:24

标签: javascript jquery html

我有一个像这样的

的ajax调用返回的字符串
<table>
<tbody>
<tr>
<td>Name</td>
<td>Age</td>
</tr>
<tr>
<td>Ron</td>
<td>28</td>
</tr>
</tbody>
</table>

现在我想将其重组为

<table>
<thead>
<tr>
<th>Name</th>
<th>Age</th>
</tr></thead>
<tbody>
<tr>
<td>Ron</td>
<td>28</td>
</tr>
</tbody>
</table>

我如何在jQuery中执行此操作?

下面的一行插入了一个thead并将第一个tr复制到其中

$(data.d).prepend("<thead></thead>").find("thead").html($(data.d).find("tr:eq(0)"))

我试图通过使用此行

删除上一行之后的tbody中的第一行
$(data.d).find("tbody tr:eq(0)").remove()

如何追加thead,先将tr移至tbody,将其中的所有td替换为th,最后删除第一个tr来自tbody

的{1}}

5 个答案:

答案 0 :(得分:3)

我的建议是:

  • 获取第一行,并为每个单元格创建相应的th单元格
  • 在表格主体前面添加表头,附加创建的标题单元格
  • 删除第一个表格主体行

$(function () {
  var th = $('table tbody tr:first td').map(function(i, e) {
    return $('<th>').append(e.textContent).get(0);
  });
  $('table tbody').prepend($('<thead>').append(th)).find('tr:first').remove();
  console.log($('table').html());
});
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>

<table>
    <tbody>
    <tr>
        <td>Name</td>
        <td>Age</td>
    </tr>
    <tr>
        <td>Ron</td>
        <td>28</td>
    </tr>
    </tbody>
</table>

答案 1 :(得分:2)

一个更简单的解决方案:

t = $('table#tbl2')
firstTr = t.find('tr:first').remove()
firstTr.find('td').contents().unwrap().wrap('<th>')

t.prepend($('<thead></thead>').append(firstTr))
table thead tr th {
  background: green;
}
table tbody tr td {
  background: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="tbl1"><tbody><tr><td>Name</td><td>Age</td></tr><tr><td>Ron</td><td>28</td></tr></tbody></table>
<br /><br />
<table id="tbl2"><tbody><tr><td>Name</td><td>Age</td></tr><tr><td>Ron</td><td>28</td></tr></tbody></table>

以下是代码的解释:

  1. tr
  2. 中删除第一个dom元素
  3. 找到td元素,获取contents()并打开td
  4. contents()标记包裹td的每个th
  5. <thead>标记添加到表格,并将我们处理的tr追加到thead

答案 2 :(得分:2)

一步一步的解决方案,

&#13;
&#13;
var jsonString = "<table><tbody><tr><td>Name</td><td>Age</td></tr><tr><td>Ron</td><td>28</td></tr></tbody></table>";
var t =$(jsonString); //jquery Table Object
var firstTR = $('tr:first',t); //geting firstTR
$('<thead></thead>')
  .prependTo(t)
  .append(
    $('td',firstTR).map(
       function(i,e){
         return $("<th>").html(e.textContent).get(0);
       }
    )
);

firstTR.remove();//removing First TR

$("#div").html(t);

//Output
console.log(t.html());
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="div">
 
</div>
&#13;
&#13;
&#13;

答案 3 :(得分:1)

你可以:

$('table').prepend('<thead></thead>'); // Add thead
$('table tr:eq(0)').prependTo('table thead'); // move first tr to thead
$('table thead').html(function(id, html) {  // you might use callback to set html in jquery
    return html.replace(/td>/g, 'th>'); // replace td by th
                       // use regExp to replace all
});

当你使用.prependTo时,这会将元素移到另一个顶部,你可以在jquery中的.html函数中使用回调。

参考:

http://api.jquery.com/prependto/

http://api.jquery.com/appendto/

答案 4 :(得分:1)

几年过去了(所以不再有jQuery),我想这样做并解决了这个问题。这个想法是1)获取第一行(<tr>),2)将第一行中的每个<td>标签替换为<th>

const txt = `<table>
<tbody>
<tr>
<td>Name</td>
<td>Age</td>
</tr>
<tr>
<td>Ron</td>
<td>28</td>
</tr>
</tbody>
</table>`;

const el = document.createElement('table');
el.innerHTML = txt;

[...el.querySelector('tr').querySelectorAll('td')].forEach(td => 
  td.outerHTML = td.outerHTML
  .replace(/<td([^>]*)>/, '<th$1>')
  .replace(/<\/td>/, '</th>')
);

console.log(el.outerHTML);
/*
<table>
<tbody>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
<tr>
<td>Ron</td>
<td>28</td>
</tr>
</tbody>
</table>
*/