Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

função remove() no Javascript

Boa tarde, referente ao curso de javascript, me surgiu a seguinte duvida com a seguinte função para remover um elemento do HTML com o Javascript. no seguinte bloco poderiamos substituir a function dendtro de paciente.addEventListener("dblclick", function() { this.remove(); }); pela função this.remove() diretamente?

O exemplo do exercício esta assim:

var pacientes = document.querySelectorAll(".paciente");

pacientes.forEach(function(paciente) {
    paciente.addEventListener("dblclick", function() {
        this.remove();
    });
});
1 resposta
solução!

Olá Jose Carlos,

Então, pelo o que eu entendi você queria fazer algo assim né:

var pacientes = document.querySelectorAll(".paciente");

pacientes.forEach(function(paciente) {
    paciente.addEventListener("dblclick",  this.remove());
});

O código acima não funcionaria, por alguns motivos. O primeiro é que o this ali naquele contexto é a window, e não o paciente. Você pode verificar isto fazendo assim:

var pacientes = document.querySelectorAll(".paciente");

pacientes.forEach(function(paciente) {
    paciente.addEventListener("dblclick",  console.log(this));
});

Resultado no console:

Window {speechSynthesis: SpeechSynthesis, caches: CacheStorage, localStorage: Storage, sessionStorage: Storage, webkitStorageInfo: DeprecatedStorageInfo…}

Window {speechSynthesis: SpeechSynthesis, caches: CacheStorage, localStorage: Storage, sessionStorage: Storage, webkitStorageInfo: DeprecatedStorageInfo…}
....

Logo, fazer window.remove() não faria muito sentido. E repare que se você testar o código acima, o console.log será executado imediatamente no console. sem esperar o doubleclick. Comentarei isso mais abaixo.

Você pode pensar em contornar o problema do this naquele contexto ser a window trocando o this direto por uma refêrencia ao paciente, fazendo assim:

var pacientes = document.querySelectorAll(".paciente");

pacientes.forEach(function(paciente) {
    paciente.addEventListener("dblclick",  paciente.remove());
});

Este código acima até funciona de certo modo, mas ele remove todos os pacientes da página sem aguardar pelo duplo clique em cada paciente. Isto acontece por que o segundo parâmetro da função addEventListener deve ser uma função e não uma chamada para a função.

Quando o seu javascript passar pelo código e ler a parte paciente.remove(), ele irá executar a função remove imediatamente, afinal é isto que você disse para ele colocando os parênteses após o remove, que aquela função deve ser chamada ali.

Se quisermos fazer o código funcionar , temos que dizer a addEventListener qual função deve ser chamada , e não executá-la passando com os parênteses.

Então, um código que funcionaria seria o seguinte:

var pacientes = document.querySelectorAll(".paciente");

pacientes.forEach(function(paciente) {
    paciente.addEventListener("dblclick",  paciente.remove);
});

Repare, não passsei os () depois do remove, não quero executar a função agora, apenas indicar ao addEventListener qual função deve ser chamada quando o usuário der um doubleclick no paciente.

Vale notar também, que neste caso específico é possível fazer tudo em uma única linha, afinal temos acesso a variável paciente pois estamos dentro de um forEach(), mas em geral é muito comum vermos por ai ser utilizado uma função anônima como segundo parâmetro do addEventListener, até mesmo quando temos apenas uma instrução.

Espero que tenha ficado claro, se não foi esta a sua dúvida ou ainda precisar de esclarecimentos, é só comentar.