87,993
社区成员
发帖
与我相关
我的任务
分享
for(var i=0;i<arr.length;i++)//遍历数组,重新排列
{
//console.log(i,arr[i]);
//oTable.tBodies[0].rows[i].innerHTML=arr[i].innerHTML;//这里出现问题,如果没有这段代码,console出来的arr是按ID大小从1~6按顺序排列。加入这段代码后,console出来的arr会发生变化。但是这段代码似乎没有对arr数组进行赋值修改,为什么arr会变?并且出现重复的内容?
console.log(i,arr[i]);
}
arr[0].innerHTML = '';
你设置 arr[0].innerHTML = '';你看看效果,我想你就能明白了。因为arr里面存的是真实的节点,你oTable.tBodies[0].rows[i].innerHTML=arr[i].innerHTML;/这句话已经改变了原来位置的真实节点了。等于是真实节点上继续替换一个真实节点,所以出现了重复的现象。建议,你想要排序的话,不要在数组里放dom,而是放html代码,比如innerHTML里的内容。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta charset="utf-8" />
</head>
<body>
<script>
window.onload=function ()
{
var oBtn=document.getElementById('btn1');
var oTable=document.getElementById('tab1');
var arr=[];
oBtn.onclick=function()//需求是点击按钮后,按照ID大小顺序,对单元格进行重新排列
{
for(var i=0;i<oTable.tBodies[0].rows.length;i++){//遍历表格的行数,把tr添加到数组里
arr[i]=oTable.tBodies[0].rows[i];
}
arr.sort(function(tr1,tr2){//对数组里的内容按照ID顺序排列
return parseInt(tr1.cells[0].innerHTML)-parseInt(tr2.cells[0].innerHTML)
});
for(var i=0;i<arr.length;i++)//遍历数组,重新排列
{
// oTable.tBodies[0].rows[i].innerHTML=arr[i].innerHTML;//这里出现问题,如果没有这段代码,console出来的arr是按ID大小从1~6按顺序排列。加入这段代码后,console出来的arr会发生变化。但是这段代码似乎没有对arr数组进行赋值修改,为什么arr会变?并且出现重复的内容?
oTable.appendChild(arr[i]);
console.log(arr[i].innerHTML);
}
}
}
</script>
<input id="btn1" type="button" value="排序" />
<table id="tab1" border="1" width="500">
<thead>
<td>ID</td>
<td>姓名</td>
<td>年龄</td>
<td>操作</td>
</thead>
<tbody>
<tr>
<td>2</td>
<td>张三</td>
<td>23</td>
<td></td>
</tr>
<tr>
<td>6</td>
<td>王四</td>
<td>24</td>
<td></td>
</tr>
<tr>
<td>1</td>
<td>王五</td>
<td>27</td>
<td></td>
</tr>
<tr>
<td>5</td>
<td>张四</td>
<td>24</td>
<td></td>
</tr>
<tr>
<td>3</td>
<td>李四</td>
<td>28</td>
<td></td>
</tr>
<tr>
<td>4</td>
<td>王八</td>
<td>25</td>
<td></td>
</tr>
</tbody>
</table>
</body>
</html>
你操作是已经是dom里 就是sort后对应的dom已经按顺序排好序了 没必要在innerHTML了