Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Array.prototype.sort.call对HTMLCollection进行排序_Javascript_Google Chrome - Fatal编程技术网

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);