„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 = "";
    };


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.


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

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




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 ...


-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

-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'>


-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.


Odpowiedź udzielono już 8 lat temu, możesz sprawdzić istniejące odpowiedzi, aby nie odpowiedzieć na to samo
Mickael B.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.