„Document.getElementByClass nie jest funkcją”

142

Próbuję uruchomić funkcję onclickdowolnego przycisku za pomocą class="stopMusic". Otrzymuję błąd w Firebug

document.getElementByClass nie jest funkcją

Oto mój kod:

var stopMusicExt = document.getElementByClass("stopButton");
    stopButton.onclick = function() {
        var ta = document.getElementByClass("stopButton");
        document['player'].stopMusicExt(ta.value);
        ta.value = "";
    };
user547794
źródło
W nazwie funkcji brakuje litery „s”. W przyjętej odpowiedzi kwestia wokół brakującego „s” nie jest tak oczywista. Dlatego komentuję to tutaj.
Anurag Priyadarshi

Odpowiedzi:

249

Prawdopodobnie miałeś na myśli document.getElementsByClassName()(a następnie zabranie pierwszego elementu z wynikowej listy węzłów):

var stopMusicExt = document.getElementsByClassName("stopButton")[0];

stopButton.onclick = function() {
    var ta = document.getElementsByClassName("stopButton")[0];
    document['player'].stopMusicExt(ta.value);
    ta.value = "";
};

Nadal możesz otrzymać błąd

document.getElementsByClassName nie jest funkcją

w starszych przeglądarkach, w takim przypadku możesz zapewnić implementację rezerwową, jeśli potrzebujesz obsługiwać te starsze przeglądarki.

BoltClock
źródło
Dzięki, to ma sens. Czy funkcja wyboru wszystkich nazw klas jest bardziej zgodna z przeglądarkami? A może można wybrać zakres dla węzłów tablicy? (tj. 0-100)?
user547794
Nie jako implementacja wbudowana. Może być konieczne użycie biblioteki, takiej jak Mootools lub jQuery (co sprawia, że ​​jest to bardzo łatwe).
BoltClock
aby lżejsza niż jQuery biblioteka po prostu dokonywała selekcji, możesz użyć Sizzle , na którym bazują selektory jQuery.
zzzzBov
3
Z caniuse.com/#feat=getelementsbyclassname wygląda na to, że tylko IE8 nie obsługuje tej metody.
oznacza
1
@tmeans: Tak, chociaż to była całkiem poważna sprawa w czasie, gdy to zostało opublikowane.
BoltClock
14

Jak powiedzieli inni, nie używasz właściwej nazwy funkcji i nie istnieje ona uniwersalnie we wszystkich przeglądarkach.

Jeśli chcesz document.getElementById()pobrać z różnych przeglądarek coś innego niż element z identyfikatorem z , to zdecydowanie sugeruję, abyś uzyskał bibliotekę obsługującą selektory CSS3 we wszystkich przeglądarkach. Zaoszczędzi ci to ogromną ilość czasu na programowanie, testowanie i naprawianie błędów. Najłatwiej jest po prostu użyć jQuery, ponieważ jest on tak szeroko dostępny, ma doskonałą dokumentację, ma bezpłatny dostęp do CDN i ma za sobą doskonałą społeczność ludzi, którzy odpowiadają na pytania. Jeśli wydaje ci się, że więcej, niż potrzebujesz, możesz zdobyć Sizzle który jest tylko biblioteką selektorów (w rzeczywistości jest to silnik selektora wewnątrz jQuery i innych). Używałem go samodzielnie w innych projektach i jest łatwy, produktywny i mały.

Jeśli chcesz wybrać wiele węzłów jednocześnie, możesz to zrobić na wiele różnych sposobów. Jeśli dasz im wszystkim tę samą klasę, możesz to zrobić za pomocą:

var list = document.getElementsByClassName("myButton");
for (var i = 0; i < list.length; i++) {
    // list[i] is a node with the desired class name
}

i zwróci listę węzłów, które mają tę nazwę klasy.

W Sizzle wyglądałoby to tak:

var list = Sizzle(".myButton");
for (var i = 0; i < list.length; i++) {
    // list[i] is a node with the desired class name
}

W jQuery wyglądałoby to tak:

$(".myButton").each(function(index, element) {
    // element is a node with the desired class name
});

Zarówno w Sizzle, jak i jQuery możesz umieścić wiele nazw klas w selektorze w ten sposób i używać znacznie bardziej skomplikowanych i potężnych selektorów:

$(".myButton, .myInput, .homepage.gallery, #submitButton").each(function(index, element) {
    // element is a node that matches the selector
});
jfriend00
źródło
2
Wydaje się, że istnieje obecnie szerokie (uniwersalne?) Wsparcie dla document.getElementsByClassName caniuse.com/#feat=getelementsbyclassname
Matt Evans
@MatthewEvans - Tak, to jest odpowiedź z 2011 roku.
jfriend00
12

Przed przejściem do dalszego sprawdzania błędów, najpierw sprawdź, czy jest to plik

document.getElement s ByClassName ().

sprawdź dokładnie jego getElement s, a nie getElement

neo
źródło
0

źle napisałeś, powinno to być "getElementsByClassName",

var objs = document.getElementsByClassName("stopButton");
var stopMusicExt = objs[0]; //retrieve the first node in the stack

//your remaining function goes down here.. 
document['player'].stopMusicExt(ta.value);
ta.value = "";

document.getElementsByClassName - zwraca stos węzłów z więcej niż jednym elementem, ponieważ atrybuty CLASS są używane do przypisywania do wielu obiektów ...

Ande Caleb
źródło
-1
    enter code here
var stopMusicExt = document.getElementByClass("stopButton").value;
    stopButton.onclick = function() {
        var ta = document.getElementByClass("stopButton");
        document['player'].stopMusicExt(ta.value);
        ta.value = "";
    };


// .value will hold all data from class stopButton
Gajender Singh
źródło
-1

getElementByClassNie istnieje, prawdopodobnie chcesz użyć getElementsByClassName. Możesz jednak użyć alternatywnego podejścia (używanego w szablonach angular / vue /ago ...)

function stop(ta) {
  console.log(ta.value) // document['player'].stopMusicExt(ta.value);
  ta.value='';
}
<input type="button" onclick="stop(this)" class="stopMusic" value='Stop 1'>
<input type="button" onclick="stop(this)" class="stopMusic" value='Stop 2'>

Kamil Kiełczewski
źródło
-1

Jeśli napisałeś to „getElementByClassName”, napotkasz ten błąd „document.getElementByClass nie jest funkcją”, więc aby obejść ten błąd, po prostu napisz „getElementsByClassName”. Ponieważ powinien to być element, a nie element.

Sanket Jagtap
źródło
Odpowiedź udzielono już 8 lat temu, możesz sprawdzić istniejące odpowiedzi, aby nie odpowiedzieć na to samo
Mickael B.