2016-04-17 11 views
1

Ich möchte Array.prototype.sort() verwenden, um DOM.Element zu sortieren.JavaScript Array.prototype.sort() kann nicht auf DOM.HTMLLIElements aufrufen

Ich versuche wie folgt aus:

var e = document.getElementById('test-list').children; 
 
    
 
    [].forEach.call(e,function(ee){ 
 
     console.log(ee); 
 
    }); 
 
    // print each child in e 
 
    
 
    [].sort.call([3,4,1],function(a,b){ 
 
     console.log(a+","+b); 
 
    }); 
 
    // 3,4; 4,1; [3, 4, 1]; compares every two elements 
 
    
 
    
 
    [].sort.call(e,function(a,b){ 
 
     console.log(a+","+b); 
 
    }); 
 
    // CAN NOT work! don't print anything.
<ol id="test-list"> 
 
     <li class="lang">Scheme</li> 
 
     <li class="lang">JavaScript</li> 
 
     <li class="lang">Python</li> 
 
     <li class="lang">Ruby</li> 
 
     <li class="lang">Haskell</li> 
 
    </ol>

Base auf API von Array.prototype.sort() kann sort() auf normale Objekte verwendet werden, mehr als Grundtyp.

Und ich fand

e[0].innerText = 232; // <li class="lang">232</li> ;works 
e[0] = "123"; //<li class="lang">232</li> ;not work 

So nahm ich aufgrund der Tatsache, dass Elemente in Array von HTMLLIElements können nicht direkt geändert werden, sort() es irgendwie herausgefunden. So springen sort() und zurück.

Ist das richtig? Und was ist die Institution hilft sort() entscheiden, ob Deal mit dem Array?

+0

Versuchen Sie, ein Array wie dieses zu konvertieren 'Array.prototype.slice.call (document.getElementById ('test-list'). Children)'. – destoryer

+0

'Array.prototype.slice.call' entspricht' [] .slice.call' aus [Der effizienteste Weg, eine HTMLCollection in ein Array zu konvertieren] (http://stackoverflow.com/questions/222841/most-efficient-way) - Eine HTML-Sammlung in ein Array konvertieren. Und es hat wirklich genauso funktioniert. – d4rkb1ue

+1

http://stackoverflow.com/questions/7059090/array-prototype-sort-call –

Antwort

1

Interessante Frage! Im Gegensatz zu Chrome, die lautlos stirbt, ist die neueste Firefox hilfreicher:

TypeError: HTMLCollection doesn't have an indexed property setter for '0'

, die das Problem deutlich macht: Sie nicht sort auf ein Objekt anwenden können, die nicht numerische Eigenschaft Setter hat (weil sort Versuche an Ort und Stelle zu sortieren und scheitert).

+0

... was bedeutet, dass Sie es zuerst in ein Array konvertieren müssen, bevor Sie es sortieren können – Fuzzyma

+0

Weil ich die Elemente innerhalb des DOM effektiv neu anordnen möchten. Ich schreibe einfach eine neue sort(), die 'dom [i] .innerText <--> dom [j] .innerText;' verwendet, um an Ort und Stelle zu sortieren. – d4rkb1ue