我有一个简单的HTML表,我想用JQuery向表中插入新行。
每一行都有一个自定义val
属性,其中包含UNIX时间戳,例如:
<tr data-val="1356998400"><!-- Some row content --></tr>
我想用JQuery插入新行,我希望它们在插入后按val
属性排序。
obviuos解决方案是将id
- s设置为行并在每次插入之前手动扫描行数组(执行时间值比较)以找到要插入的正确位置,但可能还有更多JQuery-像解决方案?我想这种情况应该存在一种单线解决方案。
答案 0 :(得分:4)
最初,您可以使用基本sort
函数对表进行排序(如果行尚未排序):
(注意:添加了自定义val
属性作为数据属性)
<table>
<tbody>
<tr data-val="1"><td>1st</td></tr>
<tr data-val="4"><td>3rd</td></tr>
<tr data-val="7"><td>4th</td></tr>
<tr data-val="2"><td>2nd</td></tr>
</tbody>
</table>
$('table').html(function() {
return $(this).find('tr').sort(function(a, b) {
return $(a).data('val') > $(b).data('val');
});
});
对行进行排序后,您可以通过抓住其data-val
大于或等于data-val
newRow
的第一行来轻松找到插入新行的位置}:
var $newRow = $('<tr data-val="3"><td>Between 2nd and 3rd!</td></tr>');
var elementToInsertBefore = $('tr').filter(function() {
return $(this).data('val') >= $newRow.data('val');
}).get(0);
if (typeof elementToInsertBefore === 'undefined') {
$('table').append($newRow);
} else {
$newRow.insertBefore(elementToInsertBefore);
}
因此,如果过滤器未返回elementToInsertBefore
(即没有data-val
的现有行更大或等于$newRow's
data-val
,将其附加到表的末尾,否则将其插入elementToInsertBefore
。
旁注:使用for
循环来获取elementToInsertBefore
可能更有效率。这样,只要找到符合条件的行,就可以break
输出,这可以防止进一步的不必要的迭代(在处理大量数据时,可以获得不错的性能提升行)。
如果您想要更精细的内容,请查看提到的jQuery插件。
答案 1 :(得分:0)
另一个解决方案:使用http://api.jquery.com/children/获取所有tr元素(无需Ids)检查值并重新排列它们。如果它们的顺序正确,请删除表格内容并重新插入行。
(甚至不需要清除表并重新插入所有行。http://api.jquery.com/insertAfter/使您能够在正确的两个值之间插入一行(如果您编写正确的循环逻辑)
从dom节点中获取所有类型的属性答案 2 :(得分:0)
我有一个tablesorter的分支,允许您从表格单元格中编写一个可以extract data attributes的解析器,并分配特定的textExtraction for each column。
代码:
$(function(){
$.tablesorter.addParser({
// set a unique id
id: 'myParser',
is: function(s) {
// return false so this parser is not auto detected
return false;
},
format: function(s, table, cell, cellIndex) {
// get data attributes from $(cell).attr('data-something');
// check specific column using cellIndex
return $(cell).attr('data-something');
},
// set type, either numeric or text
type: 'text'
});
$('table').tablesorter({
headers : {
0 : { sorter: 'myParser' }
}
});
});
答案 3 :(得分:0)
答案 4 :(得分:0)
如果您想根据每个val
上的<tr>
属性值进行排序,可以使用以下代码。
HTML代码
<table>
</table>
CSS代码
table td {
border : 1px solid #ccc;
}
JavaScript代码
$(function() {
//To add a new row after every 3 seconds.
setInterval(function() {
//I am generating a random number to demo table sorting properly.
var val = parseInt(Math.random() * 10000);
$('table').append('<tr val="' + val + '"><td>' + val + '</td></tr>');
sortTable();
}, 3000);
});
function compareRows (tr1, tr2) {
var val1 = parseInt($(tr1).attr('val'));
var val2 = parseInt($(tr2).attr('val'));
return ((val1 > val2) ? 1 : ((val1 < val2) ? -1 : 0));
};
function sortTable() {
$('table tr').sort(compareRows).appendTo('table');
}
我做了很多假设。需要根据您的要求进行更新。
如果你想要其他人建议的高级排序,最好依赖一些可用的jQuery插件。
答案 5 :(得分:0)
根据您可能使用以下代码的val
元素中的tr
属性对整个表进行排序:
orig =
$.map (
$("tr[val]")
, function( e, idx ) {
return "<tr val='"+$(e).attr('val')+"'>" + $(e).html() + "</tr>";
}
);
sorted = orig.sort();
$("tbody").replaceWith(sorted);
如果您的插入是批量操作,则此方法是可行的。如果在插入单个元素后需要立即排序表,则需要在tr
元素数组上进行一些二分搜索。
查看sample page。