Javascript document.getElementsByClassName Kompatibilität mit IE
Was ist die beste Methode, um ein array von Elementen mit einer bestimmten Klasse?
Ich würde Dokuments verwenden.getElementsByClassName, aber IE nicht unterstützt.
Also versuchte ich Jonathan Snook ist die Lösung:
function getElementsByClassName(node, classname) {
var a = [];
var re = new RegExp('(^| )'+classname+'( |$)');
var els = node.getElementsByTagName("*");
for(var i=0,j=els.length; i<j; i++)
if(re.test(els[i].className))a.push(els[i]);
return a;
}
var tabs = document.getElementsByClassName(document.body,'tab');
...aber IE sagt immer noch:
Objekt unterstützt diese Eigenschaft oder Methode
Irgendwelche Ideen, bessere Methoden, bug-fixes?
Würde ich lieber nicht verwenden, um irgendwelche Lösungen mit jQuery oder anderen "sperrigen javascript".
Update:
Ich es geschafft habe!
Als @joe erwähnt die Funktion ist keine Methode von document
.
Also den funktionierenden code würde wie folgt Aussehen:
function getElementsByClassName(node, classname) {
var a = [];
var re = new RegExp('(^| )'+classname+'( |$)');
var els = node.getElementsByTagName("*");
for(var i=0,j=els.length; i<j; i++)
if(re.test(els[i].className))a.push(els[i]);
return a;
}
var tabs = getElementsByClassName(document.body,'tab');
...Auch wenn Sie nur IE8+ Unterstützung dann funktioniert:
if(!document.getElementsByClassName) {
document.getElementsByClassName = function(className) {
return this.querySelectorAll("." + className);
};
Element.prototype.getElementsByClassName = document.getElementsByClassName;
}
Verwenden Sie es, wie normal:
var tabs = document.getElementsByClassName('tab');
Kommentar zu dem Problem
Sind Sie sicher, dass Ihr update-Recht? Sollte es nicht var tabs = getElementsByClassName(document.Körper,'tab'); **beachten Sie, dass ich entfernt Dokument.getEle... **
Danke @Anthony. Ich nahm Joes Antwort.
Sind deine letzten Beispiele richtig? Sie passieren '.Registerkarte' aber sollte es nicht ohne die Zeit, da Ihre inneren Methode fügt die Zeit und wenn es mit dem IE9+, dann ist es nicht die Zeit, oder? Sollte es nicht var tabs = document.getElementsByClassName('tab');? Und warum hast du ein "oder", wenn die letzten beiden Beispiele sind die gleichen? Ich muss etwas fehlen.
@BoBoCoding behoben.
InformationsquelleAutor der Frage Web_Designer | 2011-09-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht eine Methode des Dokuments:
InformationsquelleAutor der Antwort Joe
können Sie die Funktion erstellen, die für ältere Browser
InformationsquelleAutor der Antwort gdarcan
Ziemlich sicher, dass dies ist das gleiche wie Leonid Funktion, aber dies nutzt
document.getElementsByClassName
wenn man es kann.InformationsquelleAutor der Antwort Mike_OBrien
Kann man nicht wirklich replizieren, getElementsByClassName, denn es gibt eine nodeList,
und damit Ihr Wert ist Leben, und updates mit dem Dokument.
Können Sie die Rückgabe einem statischen Array von Elementen, die denselben Klassennamen-
aber es wird nicht 'wissen' wenn das Dokument geändert wird.
(Es wird nicht zu viele von diese Art von Dingen zu machen, eine Bibliothek Aussehen, schlank...)
//Beispiel
var A= getArrayByClassNames('sideBar-local')
InformationsquelleAutor der Antwort kennebec
IE8:
InformationsquelleAutor der Antwort Leonid
InformationsquelleAutor der Antwort Mohd Afique
Ich nur zu verbessern
querySelectorAll
- fallback für IE8.Wie andere antwortete, die einfache Möglichkeit ist das hinzufügen der Funktion, um
Element.prototype
mitAber es gibt einige Probleme:
/
,$
,*
usw.)Das bedeutet, es sollte eine gewisse "Fixierung", zum Beispiel:
Code:
InformationsquelleAutor der Antwort Oriol