Ir para conteúdo
joeythai

2 eventos conflitando

Recommended Posts

Boa tarde pessoal,

 

Estou tendo um problema com 2 eventos aqui do javascript, eu tenho essa variável numberInstallments que representa um combo select, nesse combo tem 36 opções que representam  a quantidade de parcelas, e dependendo da quantidade de parcelas que eu escolho eu imprimo um texto, exemplo: (se for menor ou igual a 11 parcelas) "Estou pagando o valor de <signalValueInstallment>" num total de 11 parcelas. 

 

Se eu alterar o valor da parcela e manter a quantidade de parcelas o texto deve permanecer, porém, o <signalValueInstallment> deve ser alterado, esta variável é alterada pelo input que tenho no formulário, nesse input tem outro evento de keyup. Está funcionando mais ou mentos, eu consigo alterar o valor do input e ele altera no texto, o problema é que só está aparecendo o texto 2 que deveria aparecer somente para parcelas superiores a 11 parcelas. Alguem sabe dizer o que está errado aí ?

 

 

 

 

 

 

149396870_WhatsAppImage2022-10-27at17_14_59.thumb.jpeg.e63e4cc07ff9afe038215ac34f2b93e9.jpeg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom você está cometendo um equivoco entre a identificação numberInstallments e o elemento dom html essá variavel presuponho conter apenas um ID ou CLASS sendo assim não contém o mapeamento do valor do input

 

EX:

const numberInstallments = '#numberInstallments';
const signalValueInstallment = '#signalValueInstallment';
const description = '#description';

$(numberInstallments).on('change', function() { // missing event variable
 
  // why is there such a dependency beetween these 2 events 'change' and 'keyup'?
  // I think it's better to uncouple!
  $(signalValueInstallment).on('keyup', function(event) {
    
    // numberInstallments is only a simple string, is not possible to handle the dom element this way.
    // That is the reason  it doesn't not work as expected
    if(numberInstallments.value <= 11){  
      $(description).html('Texto teste 1 R$ ' +signalValueInstallment.value +' .Fim test.');// same here
    }else{
      $(description).html('Texto teste 2 R$ ' +signalValueInstallment.value +' .Fim test.');// same here
    }
  })
})

Outra possibilidade é substituir numberInstallments.value por $(numberInstallments ).val() que é a forma especifica para recuperar valor usando o jquery, mas acredito que você consiga simplemente reutilizando as variaveis de evento assim não precisa processar a busca no dom novamente, já que essa ação já foi realizada.

 

Ex:

const numberInstallments = '#numberInstallments';
const signalValueInstallment = '#signalValueInstallment';
const description = '#description';

$(numberInstallments).on('change', function(e) {// add event parameter
  const selectorValue =  e.target.value; // add variable to get select value
  
  $(signalValueInstallment).on('keyup', function(event) {
    const inputValue =  event.target.value; // add variable to get input value
    
    if(selectorValue <= 11){
      $(description).html('Texto teste 1 R$ ' +inputValue +' .Fim test.');
    }else{
      $(description).html('Texto teste 2 R$ ' +inputValue +' .Fim test.');
    }
  })
})

Jsbin: https://jsbin.com/hayicasoro/1/edit?html,js,output

 

Ex código um pouco desacoplado

const numberInstallments = '#numberInstallments';
const signalValueInstallment = '#signalValueInstallment';
const description = '#description';

$(numberInstallments).on('change', function(event) {
  const selectorValue =  event.target.value;
  const inputValue =  $(signalValueInstallment).val();
  
  handleInstallment(selectorValue, inputValue);
})

$(signalValueInstallment).on('keyup', function(event) {
  const selectorValue =  $(numberInstallments).val();
  const inputValue =  event.target.value;
    
  handleInstallment(selectorValue, inputValue);
})

function handleInstallment(selectorValue, inputValue){  
  if(selectorValue <= 11){
    $(description).html('Texto teste 1 R$ ' +inputValue +' .Fim test.');
  }else{
    $(description).html('Texto teste 2 R$ ' +inputValue +' .Fim test.');
  } 
}

Jsbin: https://jsbin.com/cuwamahafo/1/edit?html,js,output

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 28/10/2022 at 19:22, wanderval disse:

Bom você está cometendo um equivoco entre a identificação numberInstallments e o elemento dom html essá variavel presuponho conter apenas um ID ou CLASS sendo assim não contém o mapeamento do valor do input

 

EX:


const numberInstallments = '#numberInstallments';
const signalValueInstallment = '#signalValueInstallment';
const description = '#description';

$(numberInstallments).on('change', function() { // missing event variable
 
  // why is there such a dependency beetween these 2 events 'change' and 'keyup'?
  // I think it's better to uncouple!
  $(signalValueInstallment).on('keyup', function(event) {
    
    // numberInstallments is only a simple string, is not possible to handle the dom element this way.
    // That is the reason  it doesn't not work as expected
    if(numberInstallments.value <= 11){  
      $(description).html('Texto teste 1 R$ ' +signalValueInstallment.value +' .Fim test.');// same here
    }else{
      $(description).html('Texto teste 2 R$ ' +signalValueInstallment.value +' .Fim test.');// same here
    }
  })
})

Outra possibilidade é substituir numberInstallments.value por $(numberInstallments ).val() que é a forma especifica para recuperar valor usando o jquery, mas acredito que você consiga simplemente reutilizando as variaveis de evento assim não precisa processar a busca no dom novamente, já que essa ação já foi realizada.

 

Ex:


const numberInstallments = '#numberInstallments';
const signalValueInstallment = '#signalValueInstallment';
const description = '#description';

$(numberInstallments).on('change', function(e) {// add event parameter
  const selectorValue =  e.target.value; // add variable to get select value
  
  $(signalValueInstallment).on('keyup', function(event) {
    const inputValue =  event.target.value; // add variable to get input value
    
    if(selectorValue <= 11){
      $(description).html('Texto teste 1 R$ ' +inputValue +' .Fim test.');
    }else{
      $(description).html('Texto teste 2 R$ ' +inputValue +' .Fim test.');
    }
  })
})

Jsbin: https://jsbin.com/hayicasoro/1/edit?html,js,output

 

Ex código um pouco desacoplado


const numberInstallments = '#numberInstallments';
const signalValueInstallment = '#signalValueInstallment';
const description = '#description';

$(numberInstallments).on('change', function(event) {
  const selectorValue =  event.target.value;
  const inputValue =  $(signalValueInstallment).val();
  
  handleInstallment(selectorValue, inputValue);
})

$(signalValueInstallment).on('keyup', function(event) {
  const selectorValue =  $(numberInstallments).val();
  const inputValue =  event.target.value;
    
  handleInstallment(selectorValue, inputValue);
})

function handleInstallment(selectorValue, inputValue){  
  if(selectorValue <= 11){
    $(description).html('Texto teste 1 R$ ' +inputValue +' .Fim test.');
  }else{
    $(description).html('Texto teste 2 R$ ' +inputValue +' .Fim test.');
  } 
}

Jsbin: https://jsbin.com/cuwamahafo/1/edit?html,js,output

 

Muito obrigado, resolveu meu problema, no caso foi a segunda opção. só não estou conseguindo "reagir" para marcar sua resposta como solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom que ajudou, sobre reagir ao post fica tranquilo eu to com esse numero 19 já faz mais de 4 anos, embora esse forum esteja ativo, acho que a equipe de desenvolvimento já não atualiza ou corrigi os bugs!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma pequena dúvida, referente a PEGAR AUTOMATICAMENTE a HORA e alimentar o campo INPUT.
       
      Tenho uma rotina, que estava aparentemente funcionando corretamente, mas agora estou tendo problema.
       
      A rotina, pega a HORA atual e informa automaticamente o INPUT, não estou entendendo porque agora não está mais fazendo.

      Abaixo a rotina.

       
      <div class="col-lg-3"> <label for="cotaHrsinicio">Hora da Abertura<span class="required">*</span></label> <div class="controls"> <input type="time" id="cotaHrsinicio" name="cotaHrsinicio" class="form-control" style="width:100%;" value="" /> <!-- NESSE INPUT A ROTINA INFORMA A DATA ATUAL --> </div> </div>  
       
      function date_time() { var date = new Date(); //var am_pm = "AM"; var hour = date.getHours(); /* if(hour>=12){ am_pm = "PM"; } */ if (hour == 0) { hour = 12; } if(hour<12){ hour = hour - 12; } if(hour>12){ hour + 12; } if(hour<10){ hour = "0"+hour; } var minute = date.getMinutes(); if (minute<10){ minute = "0"+minute; } var sec = date.getSeconds(); if(sec<10){ sec = "0"+sec; } /* *Formato da Hora (h:m:s) * Passar para a Variável: Hora Atual */ var cotaHrsinicio = document.getElementById("cotaHrsinicio").value = hour+":"+minute; }
      Grato,
       
      Cesar

       
    • Por luiz monteiro
      Bom dia.
      Estou precisando formatar um campo de entrada type text somente para numero com a seguinte formatação.
      se menor que 999 mostrar dessa forma mesmo, nesse caso seria para centena.dezena.unidade. Tipo 001 até 009 depois 010 até 099 depois 100 até 999
      de 1.000 até 999.999  mostrar com o ponto, nesse caso seria para milhar.centena.dezena.unidade. Tipo 001.000 até 001.999 e assim por diante.
      de 1.000.000 até 9.999.000, nesse caso seria para milhão.milhar.centena.dezena.unidade. aqui mesma ideia....
      Parecidos com aqueles campos de preço, que ao digitar os zeros ficam a esquerda até o valor atingirem a unidade correspondente.
       
      Tentei adaptar esse que encontrei na net.
      function moeda(a, e, r, t) { let n = "" , h = j = 0 , u = tamanho2 = 0 , l = ajd2 = "" , o = window.Event ? t.which : t.keyCode; if (13 == o || 8 == o) return !0; if (n = String.fromCharCode(o), -1 == "0123456789".indexOf(n)) return !1; for (u = a.value.length, h = 0; h < u && ("0" == a.value.charAt(h) || a.value.charAt(h) == r); h++) ; for (l = ""; h < u; h++) -1 != "0123456789".indexOf(a.value.charAt(h)) && (l += a.value.charAt(h)); if (l += n, 0 == (u = l.length) && (a.value = ""), 1 == u && (a.value = "0" + r + "0" + l), 2 == u && (a.value = "0" + r + l), u > 2) { for (ajd2 = "", j = 0, h = u - 3; h >= 0; h--) 3 == j && (ajd2 += e, j = 0), ajd2 += l.charAt(h), j++; for (a.value = "", tamanho2 = ajd2.length, h = tamanho2 - 1; h >= 0; h--) a.value += ajd2.charAt(h); a.value += r + l.substr(u - 2, u) } return !1 } Mas sem sucesso.
       
      Grato por enquanto.
       
       
       
    • Por Giovanird
      O script abaixo atualiza a página (centro.php) a cada um minuto e dentro desta página terei uma div que não poderá ser atualizada.
      Tentei colocar esta div como pagina com setInterval de 100 minutos porem ao dar o refresh no centro.php  tudo vai junto.  Será que isto é possivel?

      Desde já meu muito obrigado!
      <script> function atualiza(){ var url = 'centro.php'; $.get(url, function(dataReturn) { $('#centro').html(dataReturn); }); } setInterval("atualiza()",60000); </script>  

    • Por luiz monteiro
      Bom dia. Eu estou tentando encontrar uma maneira de evitar que após o usuário selecionar, se selecionar, uma imagem, essa seja substituída apenas por outra selecionada. Porém quando o usuário cancela a seleção, o input file remove o arquivo se já foi selecionado anteriormente.
      Essa é a estrutura que estou usando HTML
      form action="#" method="post" name="formulario" id="formulario" enctype="multipart/form-data"
      input type="file" name="file_name[]" br input type="file" name="file_name[]" br button enviar /button /form
      JS PURO
      Peguei esse script em um post aqui do stackoverflow e adaptei
      script type="text/javascript"
      let formulario = document.querySelector("#formulario"); formulario.addEventListener("change", (e)=>{ e.preventDefault(); var file = e.target.files[0]; if (e.target.files.length === 1 && e.target.files !== undefined && e.target.files !== null && file.type.match('image.*')) { console.log("if okay"); } else { //preciso entender o que devo fazer aqui para verificar se há arquivo no DOM desse target caso, o usuário cancele a seleção, para evitar que se há um arquivo no DOM esse permaneça. console.log(file); //CASO O USUÁRIO CANSELA A SELEÇÃO, RETORNA undefined } }); /script
      O if está correto, porém o que falta é o que fazer no else. Agradeço desde já.
    • Por ILR master
      Fala pessoal, tudo bem?
       
      Tô tentando fazer um pre-loading, mas não consigo de jeito algum.
      Quero mostrar uma animação enquanto a página é carregada e depois de caregada, esconder a animação e mostrar conteúdo.
       
      Aguém pode me ajudar?
       
      Segue código abaixo
       
       
      <!DOCTYPE html>
      <html lang="pt-br">
      <head>
          <meta charset="utf-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0" />  
          <title>PÁGINA LOAD</title>

      <style type="text/css">
      .loadclass {
          border: 2px solid #f3f3f3; /* Light grey */
          border-top: 4px solid #ffc401; /* Blue */
          border-radius: 50%;
          width: 50px;
          height: 50px;
          animation: spin 2s linear infinite;
      }
      @keyframes spin {
          0% { transform: rotate(0deg); }
          100% { transform: rotate(360deg); }
      }
      .conteudo {
          display:none;
      }
      </style>
      <script>
          function loading(){
              document.getElementsByClassName('loadclass')[0].style.display="none";
              document.getElementsByClassName('conteudo').style.display="block";
          }
      </script>
      </head>
      <body onLoad="loading()">
      <div class="loadclass"></div>
      <div class="conteudo">SEU CONTEUDO AQUI DENTRO!!!</div>
      </body>
      </html>
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.