Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Qual a diferença entre querySelector e getElement?

Bom dia!

Fiz um dos exercícios do curso de javascript usando o document.getElementsByClassName e depois usando o document.querySelectorAll e o resultado foi diferente para cada um dos casos.

O exercício só funcionou quando usei o document.querySelectorAll.

Porque isso acontece já que mandei imprimir a busca pelo console.log usando esses recursos nos 2 casos ele me retorna um array com os dados?

Qual a diferença e quando devo usar cada um desses recursos?

Deu certo:

var linhaPaciente = document.querySelectorAll(".paciente");
console.log(linhaPaciente);

linhaPaciente.forEach(function(paciente){
    console.log(paciente);
    paciente.addEventListener("click", function(){
        alert();
    })
});

Deu Errado:

var linhaPaciente = document.getElementsByClassName("paciente");
console.log(linhaPaciente);

linhaPaciente.forEach(function(paciente){
    console.log(paciente);
    paciente.addEventListener("click", function(){
        alert();
    })
});
2 respostas
solução!

OI UNIVALLE, tudo bem? A diferença mais básica é o retorno das duas listagens. A primeira forma retorna uma NodeList a qual parece ser um array, mas não é, contudo é possível utilizar o foreach nessa coleção (dependendo da versão do navegador).

O segundo caso, retorna uma HTML Collection, que embora represente uma coleção de elementos, ela também não é um array e diferente do primeiro caso, não têm o método foreach, porém, você pode chamar esse método através do prototype do Array.

Existe também a diferença entre as coleções serem live ou non-live, mas neste caso, acredito que seu problema já tenha sido explicado nos paragrafos acima. Espero ter ajudado! =)

Olá,

Complementando a resposta do Wanderson. O querySelectorAll é uma função mais completa pois permite que você faça diferentes combinações de seletores complexos, seja usando ids, classname, type, etc. Já o getElementsByClassName só permite a seleção de elementos pela classname, o que pode ser sua intenção, ou não.

Veja exemplos

  • Utilizando classname para setar os links para outra cor.

HTML

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>exemplo alura</title>
  <style>
    #clicks, #links {
      float: left;
      margin: 0 5px;
    }

    #links {
      border-left: #cacaca 1px solid;
      padding-left: 10px;
    }
  </style>
</head>
<body>
  <a href="/external-link/01" class="external-link">Link 01</a>
  <br>
  <a href="/external-link/02" class="external-link">Link 02</a>
  <br>
  <a href="/external-link/03" class="external-link">Link 03</a>
  <br>
  <a href="/external-link/04" class="external-link">Link 04</a>
  <br>
  <a href="/external-link/05" class="external-link">Link 05</a>
  <br>
  <a href="/external-link/06" class="external-link">Link 06</a>
  <br>
  <a href="/external-link/07" class="external-link">Link 07</a>
  <br>
  <a href="/external-link/08" class="external-link">Link 08</a>
  <br>
  <a href="/external-link/09" class="external-link">Link 09</a>
  <br>
  <a href="/external-link/10" class="external-link">Link 10</a>
  <br>
</body>
</html>

Javascript

var $links = document.getElementsByClassName('external-link');

[].slice.call( $links ).forEach(function( element, index ) {
  element.onclick = function( event ) {
    event.preventDefault();
    this.style.backgroundColor = "chartreuse";
  };
});

Agora vamos imaginar que você queira pegar apenas o link "/external-link/08" com getElementsByClassName não seria possível.

Já com querySelectorAll é

var $links = document.querySelectorAll('.external-link[href="/external-link/08"]');

[].slice.call( $links ).forEach(function( element, index ) {
  element.onclick = function( event ) {
    event.preventDefault();
    this.style.backgroundColor = "chartreuse";
  };
});

Um último adendo é que o getElementsByClassName é mais rápido já que não faz uma busca tão completa como o querySelectorAll https://jsperf.com/getelementsbyclassname-vs-queryselectorall

Att.