A veces, cuando la respuesta es lenta, se puede hacer clic en el botón enviar varias veces.
¿Cómo evitar que esto suceda?
javascript
submit
Dios mio
fuente
fuente
Respuestas:
Use javascript discreto para deshabilitar el evento de envío en el formulario después de que ya se haya enviado. Aquí hay un ejemplo usando jQuery.
EDITAR: Se solucionó el problema al enviar un formulario sin hacer clic en el botón Enviar. Gracias, ichiban.
fuente
return true
? Creo que el envío inicial debería funcionar sin eso.return true
está implícito si se omite.$(this).find("input[type='submit']").attr('disabled', 'disabled').val('submiting'); return true; });
Lo intenté la solución de vanstee junto con ASP MVC 3 de validación discreto, y si falla la validación del cliente, el código es todavía corro, y formulario de envío está desactivada para siempre. No puedo volver a enviar después de corregir los campos. (ver el comentario de bjan)
Así que modifiqué el guión de vanstee de esta manera:
fuente
El control de envío de formularios del lado del cliente se puede lograr con bastante elegancia haciendo que el controlador onsubmit oculte el botón de envío y lo reemplace con una animación de carga. De esa manera, el usuario obtiene retroalimentación visual inmediata en el mismo lugar donde ocurrió su acción (el clic). Al mismo tiempo, evita que el formulario se envíe en otro momento.
Si envía el formulario a través de XHR, tenga en cuenta que también debe manejar los errores de envío, por ejemplo, un tiempo de espera. Debería volver a mostrar el botón de envío porque el usuario debe volver enviar el formulario.
En otra nota, llimllib trae un punto muy válido. Toda la validación del formulario debe ocurrir en el servidor. Esto incluye múltiples comprobaciones de envío. ¡Nunca confíes en el cliente! Este no es solo un caso si JavaScript está desactivado. Debe tener en cuenta que todo el código del lado del cliente se puede modificar. Es algo difícil de imaginar, pero el html / javascript que habla con su servidor no es necesariamente el html / javascript que ha escrito.
Como sugiere llimllib, genere el formulario con un identificador que sea único para ese formulario y colóquelo en un campo de entrada oculto. Almacene ese identificador. Al recibir datos del formulario, solo procese cuando el identificador coincida. (También vincular el identificador a la sesión del usuario y hacer coincidir eso, también, para mayor seguridad). Después del procesamiento de datos, elimine el identificador.
Por supuesto, de vez en cuando, necesitaría limpiar los identificadores para los que nunca se envió ningún dato de formulario. Pero lo más probable es que su sitio web ya emplee algún tipo de mecanismo de "recolección de basura".
fuente
fuente
<form onsubmit="return (typeof submitted == 'undefined') ? (submitted = true) : !submitted">
, o escribirvar submitted = false;
en el punto correcto de la secuencia de comandos, para evitar el error siguiente:Uncaught ReferenceError: submitted is not defined
.Esta es una forma sencilla de hacerlo:
fuente
Desactive el botón enviar poco después de hacer clic. Asegúrese de manejar las validaciones correctamente. También mantenga una página intermedia para todo el procesamiento o las operaciones de la base de datos y luego redirija a la página siguiente. Esto asegura que la actualización de la segunda página no realice otro procesamiento.
fuente
form page ---submits to---> form_submission_script.php ---after saving, redirects to---> form_thankyou.html
Hash la hora actual, conviértela en una entrada oculta en el formulario. En el lado del servidor, verifique el hash de cada envío de formulario; si ya recibió ese hash, entonces tiene un envío repetido.
editar: confiar en javascript no es una buena idea, por lo que todos pueden seguir votando esas ideas, pero algunos usuarios no lo tendrán habilitado. La respuesta correcta es no confiar en la entrada del usuario en el lado del servidor.
fuente
También puede mostrar una barra de progreso o una ruleta para indicar que el formulario se está procesando.
fuente
Usando JQuery puedes hacer:
Y
fuente
Sé que etiquetó su pregunta con 'javascript', pero aquí hay una solución que no depende en absoluto de javascript:
Es un patrón de aplicación web llamado PRG , y aquí hay un buen artículo que lo describe
fuente
Puede evitar el envío múltiple simplemente con:
fuente
Workin =true;
. Aún es posible realizar envíos dobles, pero es probable que haya menos.La respuesta más simple a esta pregunta es: "A veces, cuando la respuesta es lenta, uno puede hacer clic en el botón enviar varias veces. ¿Cómo evitar que esto suceda?"
Simplemente desactive el botón de envío del formulario, como el siguiente código.
Deshabilitará el botón enviar, en el primer clic para enviar. Además, si tiene algunas reglas de validación, funcionará bien. Espero que te ayude.
fuente
En el lado del cliente , debe deshabilitar el botón de envío una vez que el formulario se envía con código javascript como el método proporcionado por @vanstee y @chaos.
Pero existe un problema de retraso en la red o situación de inhabilitación de JavaScript en la que no debe confiar en JS para evitar que esto suceda.
Entonces, en el lado del servidor , debe verificar el envío repetido de los mismos clientes y omitir el repetido que parece un intento falso del usuario.
fuente
Puede probar el complemento jquery de safeform .
fuente
La solución más simple y elegante para mí:
Enlace para más ...
fuente
Use este código en su formulario. Manejará múltiples clics.
seguro que funcionará.
fuente
Esto permite enviar cada 2 segundos. En caso de validación frontal.
fuente
la mejor manera de evitar el envío de varios es simplemente pasar la identificación del botón en el método.
fuente
Hacer esto usando javascript es un poco fácil. A continuación se muestra el código que proporcionará la funcionalidad deseada:
fuente
Las soluciones más simples son deshabilitar el botón al hacer clic y habilitarlo después de que se complete la operación. Para verificar una solución similar en jsfiddle:
Y puede encontrar otra solución en esta respuesta .
fuente
Esto funciona muy bien para mí. Envía la granja y hace que el botón se desactive y después de 2 segundos active el botón.
En ECMA6 Syntex
fuente
Solo para agregar a las posibles respuestas sin omitir la validación de entrada del navegador
fuente
Una alternativa a lo propuesto anteriormente es:
fuente