Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

428
Views
Jquery: la variable no se actualiza en otra variable

En primer lugar, no soy programador de ningún tipo, así que necesito que solucione mi problema.

Tengo un formulario de contacto que tiene dentro un lugar donde puedo agregar más campos de entrada hasta un máximo de 10. Cada campo que agrego tiene dentro del código una clase que llamé "pers", y quiero que esta clase pers tenga un número incremental cercano a él, como pers1, 2, 3 y así sucesivamente.

Obtener el valor incremental fue fácil, pero el problema es que la clase "pers" no actualizará la variable manteniendo el primer número en la carga del documento.

Aquí está el código

 <script type="text/javascript"> window.s = 1; </script> <script type="text/javascript"> $(document).ready(function() { var addButton = $('.add_button'); var wrapper = $('.field_wrapper'); var maxField = 10; var fieldHTML = '<div style="margin-top:5px;"><input type="text3" name="pers' + window.s + '" placeholder="Nome e Cognome"/><input type="time" style=margin-left:3.5px; autocomplete="off"><input type="time" style=margin-left:3.5px; autocomplete="off"><a href="javascript:void(0);"class="remove_button" title="Rimuovi"><img src="IMG/less_icon.png"></a></div>'; $(addButton).click(function() { if (window.s < maxField) { window.s++; //Increment field counter $(wrapper).append(fieldHTML); //Add field html } }); $(wrapper).on('click', '.remove_button', function(e) { e.preventDefault(); $(this).parent('div').remove(); //Remove field html s--; //Decrement field counter }); }); </script>

Hay una variable global "window.s" porque fue mi último intento de actualizar la var.

Los campos suman correctamente hasta 10 como debe ser, pero la "ventana.s" o cuando era solo "s" todavía mantiene su primer valor de 1, por lo que "pers" es siempre "pers1". Pensé que exponiendo una variable global habría solucionado el problema, pero nada.

¿Qué estoy haciendo mal?

Muchas gracias por su ayuda chicos.

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

El problema con su código es que solo configura fieldHTML una vez, cuando se carga la página. En este punto, window.s es 1 , por lo que este es el valor que se usa cada vez que hace referencia a fieldHTML . La solución rápida a esto sería colocar la definición de fieldHTML dentro del controlador de eventos click() .

Sin embargo, es mejor abordarlo para eliminar por completo la necesidad de la variable incremental. Utilice el mismo name en todos los campos que genere dinámicamente. De esta manera, no necesita mantener el conteo (por ejemplo, si se agregaron 5 y alguien elimina el tercero, actualmente terminará con 2 por per5 elementos). Debido a esto, también simplifica la lógica JS. Además, debe colocar el HTML para clonar en un elemento <template> , no el JS, para que no haya contaminación cruzada del código base.

Aquí hay un ejemplo práctico de los cambios que menciono:

 jQuery($ => { var $addButton = $('.add_button'); var $wrapper = $('.field_wrapper'); var maxFields = 10; var fieldHTML = $('#field_template').html(); $addButton.click(() => { if ($('.field_wrapper > div').length < maxFields) { $wrapper.append(fieldHTML); } }); $wrapper.on('click', '.remove_button', e => { e.preventDefault(); $(e.target).closest('div').remove(); }); });
 .field_wrapper>div { margin-top: 5px; } .field_wrapper input.time { margin-left: 3.5px; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <button class="add_button">Add</button> <div class="field_wrapper"></div> <template id="field_template"> <div> <input type="text3" name="pers[]" placeholder="Nome e Cognome" /> <input type="time" name="time1[]" class="time" autocomplete="off" /> <input type="time" name="time2[]" class="time" autocomplete="off" /> <a href="#" class="remove_button" title="Rimuovi"> <img src="IMG/less_icon.png"> </a> </div> </template>

Luego puede recibir todos los valores de input como una matriz en su código PHP, como este .

about 4 years ago · Juan Pablo Isaza Report

0

Es porque no ha usado el valor actualizado allí.

Primero, asigna un valor a window.s , y luego crea una variable que usa el valor de window.s desde el estado inicial, y en cada adición, simplemente agrega el mismo fieldHtml . Por lo tanto, está obteniendo el mismo valor.

Aquí está la respuesta, usted está buscando:

 <div><button class="add_button">click me</button></div> <div class="field_wrapper"></div> <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script> <script type="text/javascript"> window.s = 1; </script> <script type="text/javascript"> $(document).ready(function() { var addButton = $('.add_button'); var wrapper = $('.field_wrapper'); var maxField = 10; $(addButton).click(function() { if (window.s < maxField) { window.s++; //Increment field counter let fieldHTML = generateLine(window.s); $(wrapper).append(fieldHTML); //Add field html } }); $(wrapper).on('click', '.remove_button', function(e) { e.preventDefault(); $(this).parent('div').remove(); //Remove field html s--; //Decrement field counter }); }); function generateLine(lineNumber){ return '<div style="margin-top:5px;"><input type="text3" name="pers' + lineNumber + '" placeholder="Nome e Cognome"/><input type="time" style=margin-left:3.5px; autocomplete="off"><input type="time" style=margin-left:3.5px; autocomplete="off"><a href="javascript:void(0);"class="remove_button" title="Rimuovi"><img src="IMG/less_icon.png"></a></div>'; } </script>

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!