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

Dúvida Eventos

porque a seguinte abordagem executa a funçao antes do clique

var botao = document.getElementById("calcula-imcs");
botao.onclick = calculaTodosImcs();

na video aula foi feito botao.onclick = calculaTodosImcs;

colocando um parametro na funcao, ela também executa antes da acao do click

2 respostas

Olá amigo, coloque todo o seu código do arquivo calcula-imc.js pra eu conseguir analisar, precisava ver como está feita a função calculaTodosImcs().

Veja como está a minha:

function calculaTodosImcs() {
    var trsPacientes = document.getElementsByClassName("paciente");

    percorreArray(trsPacientes, function(pacienteTr){

    var tdNome = pacienteTr.getElementsByClassName("info-nome")[0];
    var tdPeso = pacienteTr.getElementsByClassName("info-peso")[0];
    var tdAltura = pacienteTr.getElementsByClassName("info-altura")[0];

    var pacienteAtual = {nome : tdNome.textContent,
                         peso : tdPeso.textContent,
                         altura : tdAltura.textContent,
                         pegaImc : function(){
                                if (this.altura != 0){

                                var imc = this.peso / (this.altura * this.altura);
                                return imc;

                                } else {
                                    console("Não posso executar uma divisão por 0!");
                                }
                            }
                        };

    var imc = pacienteAtual.pegaImc();

    var tdImc = pacienteTr.getElementsByClassName("info-imc")[0];
    tdImc.textContent = imc;

    console.log(imc);

    });

var botao = document.getElementById("calcula-imcs");

botao.addEventListener("click", calculaTodosImcs);

E assim também funciona, colocando a função como função de primeira classe:

var botao = document.getElementById("calcula-imcs");

botao.addEventListener("click", function() {
    var trsPacientes = document.getElementsByClassName("paciente");

    percorreArray(trsPacientes, function(pacienteTr){

    var tdNome = pacienteTr.getElementsByClassName("info-nome")[0];
    var tdPeso = pacienteTr.getElementsByClassName("info-peso")[0];
    var tdAltura = pacienteTr.getElementsByClassName("info-altura")[0];

    var pacienteAtual = {nome : tdNome.textContent,
                         peso : tdPeso.textContent,
                         altura : tdAltura.textContent,
                         pegaImc : function(){
                                if (this.altura != 0){

                                var imc = this.peso / (this.altura * this.altura);
                                return imc;

                                } else {
                                    console("Não posso executar uma divisão por 0!");
                                }
                            }
                        };

    var imc = pacienteAtual.pegaImc();

    var tdImc = pacienteTr.getElementsByClassName("info-imc")[0];
    tdImc.textContent = imc;

    console.log(imc);

    });
});

Os dois funcionam!!

Espero ter ajudado.

solução!

@rafael ocorre pq quando você estiver trabalhando com eventos você deve sempre passar uma referência da função a ser executada. No seu código, veja que a função calculaTodosImcs que você está tentando atribuir ao evento onclick do botão está com parênteses na frente. Isso significa que o Javascript vai executar essa ação antes mesmo de atribui-lá ao evento, e é por isso que o código está sendo executado automaticamente. Quando não tem parênteses, a função é apenas atribuída e fica aguardando um gatilho para executar (no caso, quando o usuário clicar sobre o botão).