Javascript 使用Array.prototype.sort.call对HTMLCollection进行排序
为什么不从第一次排序调用中获取警报?首先将Javascript 使用Array.prototype.sort.call对HTMLCollection进行排序,javascript,google-chrome,Javascript,Google Chrome,为什么不从第一次排序调用中获取警报?首先将节点列表转换为数组: var down=function(a,b){alert(a)} Array.prototype.sort.call(table.tBodies[0].childNodes,down) Array.prototype.sort.call([0,1,2,3],down) 然后正常调用sort: var elements = [].slice.call(table.tBodies[0].childNodes); 似乎sort无法处理
节点列表转换为数组:
var down=function(a,b){alert(a)}
Array.prototype.sort.call(table.tBodies[0].childNodes,down)
Array.prototype.sort.call([0,1,2,3],down)
然后正常调用sort
:
var elements = [].slice.call(table.tBodies[0].childNodes);
似乎sort
无法处理类似数组的对象。这可能是因为NodeList
没有提供任何方法来更改列表,但是sort
将数组排序到位
更新:有关更多信息,请访问:
对obj的[[Get]]、[[Put]]和[[Delete]]内部方法执行依赖于实现的调用序列
我假设NodeList
s没有这些内部方法。但这实际上只是一个假设。也可能是这取决于实现
我还建议您使用而不是.childNodes
来仅获取元素节点更新:或按照@patrick的建议。我对HTMLCollection排序的建议是:
window.onload=function(){
var parentNode=document.getElementById('test-list');
var e=document.getElementById('test-list')。children;
[].slice.call(e).sort(函数(a,b){
返回a.textContent.localeCompare(b.textContent);
}).forEach(函数(val,索引){
parentNode.appendChild(val);
});
}
方案
JavaScript
Python
红宝石
哈斯克尔
我更正了gaetanoM的代码,此代码与IE一起使用:
window.onload=function(){
var parentNode=document.getElementById('test-list');
var e=document.getElementById('test-list')。children;
[].slice.call(e).sort(函数(a,b){
如果(a.textContent>b.textContent)返回1;
如果(a.textContent
方案
JavaScript
Python
红宝石
哈斯克尔
塔塔
aaaaaaa
德鲁伊
可能childNodes
是空的吗?不,对不起,在tBodies[0]test=table.tBodies[0]。childNodes[2]。childNodes[0]。innerHtml中有很多childNodes可用。这有什么帮助?ECMA-262将slice
和sort
定义为通用函数,可应用于具有适当属性的任何对象。它确实警告说它可能不适用于主机对象,但是有没有什么特别的原因说明切片在DOM列表上比排序更有效?@Felix:或者可能使用行而不是子项,以获得更好的兼容性。我想知道什么是.sort()
不允许像.slice()
那样使用类似数组的对象。编辑:关于你的更新,这是有意义的+1@Henning:查看我的最新更新:“对obj
的[[Get]]、[[Put]]和[[Delete]]内部方法执行依赖于实现的调用序列。”我假设NodeList
没有这些内部方法。。。但我可能错了。无论如何,它肯定是这样工作的。@Felix:嗯,你说得对。根据DOM Core,节点列表不一定是可变的,因此尝试对其进行排序是没有权利的。如果像我这样的人想知道的话,没有必要调用val.remove()
,因为appendChild()
会自动执行。一行HTMLCollection排序,受您的答案启发:[…document.getElementsByClassName(“lang”)].sort((a,b)=>a.textContent.localeCompare(b.textContent)).forEach((val)=>val.parentNode.appendChild(val));
elements.sort(down);