1

在您的源代码中,您可以在 tbody 之前定义 tfoot 但在浏览器中 tfoot 仍将显示在最后:

<table>
   <thead><tr><th>i get displayed first</th></tr></thead>
   <tfoot><tr><td>i get displayed last</td></tr></tfoot>
   <tbody><tr><td>i get displayed second</td></tr></tbody>
</table>

现在,我想按视觉顺序获取该表的 tr 元素,而不是它们在 html 中的顺序。所以这当然不能解决问题:

var rows = $('table tr');

jQuery 遍历表格并按照它们在源代码中出现的顺序添加 tr 元素。

我想我可以制作单独的块并将它们连接起来以获得正确的顺序:

var header = $('table>thead>tr');
var body = $('table>tbody>tr');
var footer = $('table>tfoot>tr');

var rows = $().add(header).add(body).add(footer);

奇怪的是,订单仍然和我一样$('table tr')!怎么会这样?

我还在 jsFiddle 中说明了这个问题:http: //jsfiddle.net/nerdess/sKewX/2/

4

5 回答 5

0

如果您想让元素按您想要的确切顺序排列,您需要手动构建结果。我在小提琴中修改了你的代码:http: //jsfiddle.net/lechlukasz/sKewX/3/

var header = $('table>thead>tr');
var body = $('table>tbody>tr');
var footer = $('table>tfoot>tr');

var apppend = function(arr, items) {
    for (var i=0;i<items.lenght;i++)
        arr.push(items[i])
}
var rows = []
append(rows, header)
append(rows, body)
append(rows, footer)

console.log(rows); 
于 2013-07-16T16:42:39.543 回答
0

insertion sort这是使用该算法的示例( http://en.wikipedia.org/wiki/Insertion_sort)。按照设计,add()按 DOM 顺序收集元素。
这个想法是根据视觉上的元素对元素进行排序(使用它们的offset)。JsFiddle:http: //jsfiddle.net/Pv4tj/

于 2013-07-16T16:58:25.923 回答
0

元素选择器查看 DOM,因此它们只会按照元素在 DOM 中出现的顺序返回元素。

如果您希望它们按视觉顺序排列,您必须自己确定每个项目的位置。

请参阅:确定元素在文档上的绝对位置

于 2013-07-16T16:37:07.187 回答
0

来自 add() 方法的文档:

不要假设此方法按照元素传递给 .add() 方法的顺序将元素附加到现有集合中。当所有元素都是同一个文档的成员时,来自 .add() 的结果集合将按文档顺序排序;也就是说,按照每个元素在文档中出现的顺序。如果集合由来自不同文档或不在任何文档中的元素组成,则排序顺序未定义。要创建具有明确定义顺序的元素的 jQuery 对象,请使用 $(array_of_DOM_elements) 签名。

所以是的,它看起来和$('table tr');

于 2013-07-16T16:38:25.410 回答
0

因为$('table tr')只会查找代码(与控制台无关)。

现在因为您在添加body之前var rows添加footer,所以显示与代码不同是合乎逻辑的。

这就像出版一本书然后告诉读者之前阅读page 3一样page 2

现在读者(“控制台”)知道正确的顺序,但是这本书仍然保留了错误的页码顺序。

所以为了让生活更轻松:尽量让代码和显示保持平行。因此,尽量保持两者的顺序相同,以避免不必要的复杂性。

于 2013-07-16T16:40:35.803 回答