Qualche tempo fa avevo bisogno di qualcosa di molto simile ... e l'ho capito.
Quindi quello che ho messo qui è come faccio i trucchi per avere un modulo che può essere inviato da JavaScript senza alcuna convalida ed eseguo la convalida solo quando l'utente preme un pulsante (in genere un pulsante di invio).
Per l'esempio userò un modulo minimo, solo con due campi e un pulsante di invio.
Ricorda ciò che si desidera: da JavaScript deve poter essere inviato senza alcun controllo. Tuttavia, se l'utente preme tale pulsante, la convalida deve essere eseguita e il modulo deve essere inviato solo se supera la convalida.
Normalmente tutto dovrebbe iniziare da qualcosa vicino a questo (ho rimosso tutte le cose extra non importanti):
<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>
Guarda come il tag del modulo non ha onsubmit="..."
(ricorda che era una condizione per non averlo).
Il problema è che il modulo viene sempre inviato, non importa se onclick
restituisce true
o false
.
Se cambio type="submit"
per type="button"
, sembra funzionare ma non funziona. Non invia mai il modulo, ma può essere fatto facilmente.
Quindi finalmente ho usato questo:
<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>
E su function Validator
, dov'è return True;
, aggiungo anche una frase di invio JavaScript, qualcosa di simile a questo:
function Validator(){
// ...bla bla bla... the checks
if( ){
document.getElementById('theFormID').submit();
return(true);
}else{
return(false);
}
}
Il id=""
è solo per JavaScript getElementById
, la name=""
è solo che appaia sui dati POST.
In questo modo funziona come ho bisogno.
Lo metto solo per le persone che non hanno bisogno di onsubmit
funzione nel modulo, ma eseguo una convalida quando un pulsante viene premuto dall'utente.
Perché non ho bisogno di onsubmit sul tag del modulo? Facile, su altre parti JavaScript devo effettuare un invio ma non voglio che ci sia alcuna convalida.
Il motivo: se l'utente è quello che esegue l'invio che desidero e necessita che venga effettuata la convalida, ma se è JavaScript a volte devo eseguire l'invio mentre tali convalide lo eviterebbero.
Può sembrare strano, ma non quando si pensa ad esempio: su un Login ... con alcune restrizioni ... come non consentire l'utilizzo di sessioni PHP e nessuno dei cookie è consentito!
Pertanto, qualsiasi collegamento deve essere convertito in tale modulo, quindi i dati di accesso non vanno persi. Quando non è ancora stato effettuato l'accesso, deve funzionare anche. Pertanto, non è necessario eseguire alcuna convalida sui collegamenti. Ma voglio presentare un messaggio all'utente se l'utente non ha inserito entrambi i campi, utente e pass. Quindi se ne manca uno, il modulo non deve essere inviato! c'è il problema.
Vedi il problema: il modulo non deve essere inviato quando un campo è vuoto solo se l'utente ha premuto un pulsante, se è un codice JavaScript deve poter essere inviato.
Se lavoro sul onsubmit
tag del modulo, dovrei sapere se è l'utente o altro JavaScript. Poiché non è possibile passare parametri, non è possibile direttamente, quindi alcune persone aggiungono una variabile per dire se la convalida deve essere eseguita o meno. La prima cosa sulla funzione di validazione è quella di verificare quel valore variabile, ecc ... Troppo complicato e il codice non dice ciò che è veramente desiderato.
Quindi la soluzione non è avere onsubmit sul tag del modulo. Insead mettilo dove è veramente necessario, sul pulsante.
Per l'altro lato, perché mettere il codice onsubmit poiché concettualmente non voglio la validazione onsubmit. Voglio davvero la convalida dei pulsanti.
Non solo il codice è più chiaro, è dove deve essere. Ricorda questo: - Non voglio che JavaScript convalidi il modulo (che deve essere sempre eseguito da PHP sul lato server) - Voglio mostrare all'utente un messaggio che dice che tutti i campi non devono essere vuoti, che ha bisogno di JavaScript (client lato)
Quindi, perché alcune persone (pensa o dimmelo) deve essere fatto su una validazione onsumbit? No, concettualmente non sto facendo una convalida onsumbit sul lato client. Sto solo facendo qualcosa su un pulsante, quindi perché non lasciarlo implementare?
Bene, quel codice e lo stile fanno perfettamente il trucco. Su qualsiasi JavaScript che devo inviare il modulo che ho appena inserito:
document.getElementById('theFormID').action='./GoToThisPage.php'; // Where to go
document.getElementById('theFormID').submit(); // Send POST data and go there
E questo salta la convalida quando non ne ho bisogno. Invia semplicemente il modulo e carica una pagina diversa, ecc.
Ma se l'utente fa clic sul pulsante di invio (ovvero type="button"
non type="submit"
), la convalida viene eseguita prima di consentire l'invio del modulo e, se non valido, non inviato.
Spero che questo aiuti gli altri a non provare un codice lungo e complicato. Basta non usare onsubmit
se non necessario, e usare onclick
. Ma ricordati di passare type="submit"
a type="button"
e, per favore, non dimenticare di farlo submit()
con JavaScript.