"Document.getElementByClass não é uma função"

142

Estou tentando executar uma função onclickde qualquer botão com class="stopMusic". Estou recebendo um erro no Firebug

document.getElementByClass não é uma função

Aqui está o meu código:

var stopMusicExt = document.getElementByClass("stopButton");
    stopButton.onclick = function() {
        var ta = document.getElementByClass("stopButton");
        document['player'].stopMusicExt(ta.value);
        ta.value = "";
    };
user547794
fonte
Seu nome da função está faltando um 's'. Na resposta aceita, o ponto em torno dos desaparecidos não é tão óbvio. Daí comentar aqui.
Anurag Priyadarshi

Respostas:

249

Você provavelmente quis dizer document.getElementsByClassName()(e, em seguida, extrair o primeiro item da lista de nós resultante):

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

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

Você ainda pode receber o erro

document.getElementsByClassName não é uma função

em navegadores mais antigos, no entanto, nesse caso, você pode fornecer uma implementação de fallback se precisar oferecer suporte a esses navegadores mais antigos.

BoltClock
fonte
Obrigado, isso faz sentido. A função é para selecionar todos os nomes de classe que sejam mais compatíveis com o navegador? Ou é possível selecionar um intervalo para os nós da matriz? (ou seja, 0-100)?
user547794
Não como uma implementação interna. Pode ser necessário usar uma biblioteca como o Mootools ou o jQuery (o que torna super fácil).
BoltClock
para que uma biblioteca mais leve que o jQuery faça apenas seleções, você pode usar o Sizzle , que é baseado nos seletores do jQuery.
zzzzBov
3
Em caniuse.com/#feat=getelementsbyclassname , parece que apenas o IE8 não tem suporte para esse método.
tmeans
1
@tmeans: Sim, embora isso tenha sido um grande negócio no momento em que foi publicado.
BoltClock
14

Como já foi dito, você não está usando o nome da função correto e ele não existe universalmente em todos os navegadores.

Se você precisar buscar em outro navegador, além de um elemento com um ID document.getElementById(), sugiro fortemente que você obtenha uma biblioteca que ofereça suporte a seletores CSS3 em todos os navegadores. Isso economizará uma quantidade enorme de tempo de desenvolvimento, testes e correção de erros. A coisa mais fácil a se fazer é usar o jQuery, porque é tão amplamente disponível, possui excelente documentação, acesso gratuito à CDN e tem uma excelente comunidade de pessoas por trás dele para responder a perguntas. Se isso parecer mais do que você precisa, você pode obter o Sizzle, que é apenas uma biblioteca de seletores (na verdade, é o mecanismo de seletores no jQuery e outros). Eu o usei sozinho em outros projetos e é fácil, produtivo e pequeno.

Se você deseja selecionar vários nós de uma só vez, pode fazer isso de várias maneiras diferentes. Se você der a todos a mesma classe, poderá fazer isso com:

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

e retornará uma lista de nós que possuem esse nome de classe.

No Sizzle, seria o seguinte:

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

No jQuery, seria o seguinte:

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

No Sizzle e no jQuery, você pode colocar vários nomes de classe no seletor como este e usar seletores muito mais complicados e poderosos:

$(".myButton, .myInput, .homepage.gallery, #submitButton").each(function(index, element) {
    // element is a node that matches the selector
});
jfriend00
fonte
2
Parece haver um amplo suporte (universal?) Agora para document.getElementsByClassName caniuse.com/#feat=getelementsbyclassname
Matt Evans
@MatthewEvans - Sim, esta é uma resposta de 2011.
precisa saber é
12

Antes de iniciar qualquer verificação de erro adicional, verifique primeiro se

O próprio ByClassName () do document.getElement .

verifique a sua GetElement s e não GetElement

neo
fonte
0

você digitou errado, deve ser "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 - retorna uma pilha de nós com mais de um item, pois os atributos CLASS são usados ​​para atribuir a vários objetos ...

Ande Caleb
fonte
-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
fonte
-1

O getElementByClassnão existe, provavelmente você deseja usar getElementsByClassName. No entanto, você pode usar uma abordagem alternativa (usada nos modelos angular / vue / react ...)

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
fonte
-1

Se você escreveu este "getElementByClassName", encontrará o erro "document.getElementByClass não é uma função". Para superar esse erro, basta escrever "getElementsByClassName". Porque deve ser elementos e não elemento.

Sanket Jagtap
fonte
Ele já foi respondido há 8 anos, talvez você queira verificar as respostas existentes para evitar responder a mesma coisa
Mickael B.