Jquery .on () enviar evento


98

Tengo un problema con .on(). Tengo múltiples elementos de formulario (formularios con class="remember"), también agrego otro form.rememberusando AJAX. Entonces, quiero que maneje el evento de envío de algo como:

$('form.remember').on('submit',function(){...}) 

pero el formulario agregado con AJAX no funciona con él.

¿Dónde está el problema? ¿Es un error?


9
Prueba$(document).on('submit','form.remember',function(){...})
Sergio

1
@Sergio reemplace documentcon el padre estático más cercano.
Mark Baijens

Respuestas:


217

Necesitas delegar el evento al nivel del documento.

$(document).on('submit','form.remember',function(){
   // code
});

$('form.remember').on('submit'funciona igual que, $('form.remember').submit(pero cuando lo use $(document).on('submit','form.remember', también funcionará para el DOM agregado más adelante.


24
También hay que tener en cuenta que $(document).ontiene un rendimiento mucho menor que $('form.remember').on('submit'. Ahora tiene que escuchar todos los eventos de envío en el documento. Es mucho mejor restringir un poco el alcance que escuchar on document, si es posible
Liam

7
$ ('cuerpo'). on ('enviar', 'formulario.recuerdo', función () {// código}); resolvió mi problema
Olotin Temitope

Aunque @Liam es correcto, $ (document) .on sigue siendo útil para operaciones CRUD en elementos renderizados ajax.
Norielle Cruz

38

Tuve un problema con los mismos síntomas. En mi caso, resultó que a mi función de envío le faltaba la declaración "return".

Por ejemplo:

 $("#id_form").on("submit", function(){
   //Code: Action (like ajax...)
   return false;
 })

2
Tenga en cuenta que return false;no enviará el formulario. Para enviar el formulario utilice return true;.
Kai Noack

0

El problema aquí es que el "on" se aplica a todos los elementos que existen EN EL MOMENTO. Cuando crea un elemento dinámicamente, debe ejecutar de nuevo:

$('form').on('submit',doFormStuff);

createNewForm();

// re-attach to all forms
$('form').off('submit').on('submit',doFormStuff);

Dado que los formularios suelen tener nombres o ID, también puede adjuntarlos al nuevo formulario. Si estoy creando muchas cosas dinámicas, incluiré una función de configuración o vinculación:

function bindItems(){
    $('form').off('submit').on('submit',doFormStuff); 
    $('button').off('click').on('click',doButtonStuff);
}   

Entonces, cada vez que crea algo (botones generalmente en mi caso), simplemente llamo a bindItems para actualizar todo en la página.

createNewButton();
bindItems();

No me gusta usar 'cuerpo' o elementos de documento porque con pestañas y modales tienden a quedarse y hacer cosas que no esperas. Siempre trato de ser lo más específico posible a menos que sea un proyecto simple de 1 página.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.