Hace algún tiempo necesitaba algo muy similar ... y lo conseguí.
Entonces, lo que pongo aquí es cómo hago los trucos para que un formulario pueda ser enviado por JavaScript sin ninguna validación y ejecutar validación solo cuando el usuario presiona un botón (generalmente un botón de envío).
Para el ejemplo, usaré un formulario mínimo, solo con dos campos y un botón de envío.
Recuerde lo que se desea: desde JavaScript debe poder enviarse sin ninguna comprobación. Sin embargo, si el usuario presiona dicho botón, la validación debe hacerse y el formulario debe enviarse solo si pasa la validación.
Normalmente todo comenzaría desde algo cerca de esto (eliminé todas las cosas adicionales que no son importantes):
<form method="post" id="theFormID" name="theFormID" action="">
<input type="text" id="Field1" name="Field1" />
<input type="text" id="Field2" name="Field2" />
<input type="submit" value="Send" onclick="JavaScript:return Validator();" />
</form>
Vea cómo la etiqueta de formulario no tiene onsubmit="..."
(recuerde que era una condición para no tenerla).
El problema es que el formulario siempre se envía, sin importar si onclick
devuelve true
ofalse
.
Si cambio type="submit"
portype="button"
, parece funcionar pero no funciona. Nunca envía el formulario, pero eso se puede hacer fácilmente.
Así que finalmente usé esto:
<form method="post" id="theFormID" name="theFormID" action="">
<input type="text" id="Field1" name="Field1" />
<input type="text" id="Field2" name="Field2" />
<input type="button" value="Send" onclick="JavaScript:return Validator();" />
</form>
Y function Validator
, donde return True;
está, también agrego una oración de envío de JavaScript, algo similar a esto:
function Validator(){
// ...bla bla bla... the checks
if( ){
document.getElementById('theFormID').submit();
return(true);
}else{
return(false);
}
}
El id=""
es solo para JavaScript getElementById
, elname=""
es sólo para que aparezca en los datos POST.
De esa manera funciona como lo necesito.
Lo pongo solo para las personas que no necesitan ninguna onsubmit
función en el formulario, pero hacen alguna validación cuando el usuario presiona un botón.
¿Por qué no necesito enviar una etiqueta de formulario? Fácil, en otras partes de JavaScript necesito realizar un envío, pero no quiero que haya ninguna validación.
La razón: si el usuario es el que realiza el envío que quiero y necesito que se realice la validación, pero si es JavaScript, a veces necesito realizar el envío mientras que tales validaciones lo evitarían.
Puede sonar extraño, pero no cuando se piensa, por ejemplo: en un inicio de sesión ... con algunas restricciones ... como no permitir que se usen sesiones PHP y ¡no se permiten cookies!
Por lo tanto, cualquier enlace debe convertirse a dicho envío de formulario, para que no se pierdan los datos de inicio de sesión. Cuando todavía no se ha iniciado sesión, también debe funcionar. Por lo tanto, no se debe realizar ninguna validación en los enlaces. Pero quiero presentar un mensaje al usuario si el usuario no ha ingresado ambos campos, usuario y contraseña. Entonces, si falta uno, ¡no se debe enviar el formulario! Ahí está el problema.
Vea el problema: el formulario no debe enviarse cuando un campo está vacío solo si el usuario ha presionado un botón, si es un código JavaScript debe poder enviarse.
Si hago el trabajo en onsubmit
la etiqueta del formulario, necesitaría saber si es el usuario u otro JavaScript. Como no se pueden pasar parámetros, no es posible directamente, por lo que algunas personas agregan una variable para saber si la validación debe hacerse o no. Lo primero en la función de validación es verificar el valor de la variable, etc. Demasiado complicado y el código no dice lo que realmente se desea.
Por lo tanto, la solución es no tener un envío en la etiqueta del formulario. Insead lo puso donde realmente se necesita, en el botón.
Por otro lado, ¿por qué poner el código de envío ya que conceptualmente no quiero la validación de envío? Realmente quiero la validación del botón.
No solo el código es más claro, es donde debe estar. Solo recuerde esto: - No quiero que JavaScript valide el formulario (eso debe ser hecho siempre por PHP en el lado del servidor) - Quiero mostrarle al usuario un mensaje diciendo que todos los campos no deben estar vacíos, que necesita JavaScript (cliente lado)
Entonces, ¿por qué algunas personas (piensan o me dicen) deben hacerlo en una validación integrada? No, conceptualmente no estoy haciendo una validación en el servidor del lado del cliente. Solo estoy haciendo algo en un botón, así que ¿por qué no dejar que se implemente?
Bueno, ese código y estilo funcionan perfectamente. En cualquier JavaScript que necesite para enviar el formulario que acabo de poner:
document.getElementById('theFormID').action='./GoToThisPage.php'; // Where to go
document.getElementById('theFormID').submit(); // Send POST data and go there
Y eso omite la validación cuando no la necesito. Simplemente envía el formulario y carga una página diferente, etc.
Pero si el usuario hace clic en el botón Enviar (también conocido como type="button"
no type="submit"
), la validación se realiza antes de permitir que se envíe el formulario y, si no es válido, no se envía.
Espero que esto ayude a otros a no probar código largo y complicado. Simplemente no lo use onsubmit
si no es necesario, y úselo onclick
. Pero sólo recuerda a cambiar type="submit"
a type="button"
y por favor no se olvide de hacer el submit()
de JavaScript.