Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    validazione form con controllo di tipo checkbox

    Ciao,
    Avevo un form con normali controlli di tipo input governati da un JS per la sua convalida.
    Il JS è semplice:
    codice:
    function check_valid(theForm) {
    	for (i=0; i < theForm.elements.length; i++) {
    		if (theForm.elements[i].value == "" && theForm.elements[i].className == "si") {
    			alert (theForm.elements[i].name + ": campo vuoto non accettabile");
    			theForm.elements[i].value = "";
    			theForm.elements[i].focus();
    			return false;
    		}
    	}
    }
    Finora erano semplici controlli di tipo "text", "textarea" o "select".
    Di questi alcuni sono obbligatori ed altri no.
    A quelli obbligatori, per permetterne la validazione dal JS ho aggiunto una classe in questo modo:
    codice:
    <form name="prenotazione" action="form_processa.php" method="post" onsubmit="return check_valid(this);">
    <input type="text" name="nome" size="20" value="" class="si" />
    <input type="text" name="azienda" size="20" value="" />
    <input type="text" name="telefono" size="20" value="" class="si" />
    <select name="giorno" class="si"> 
           ...................
    </select>
           ...........................
    </form>
    A questo form ho dovuto aggiungere un controllo di tipo checkbox
    codice:
    <input type="checkbox" name="privacy" class="si" />
    Ma non riesco a farlo validare dal JS, nonostante la classe.
    Dove sbaglio? Come dovrei modificare il JS per controllare che il controllo "checkbox" sia stato flaggato?

    Grazie per l'aiuto che mi vorreste dare

  2. #2
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    Prova cosi:
    codice:
    function check_valid(theForm) {
    	for (i=0; i < theForm.elements.length; i++) {
    		if (theForm.elements[i].value == "" && theForm.elements[i].className == "si") {
    			alert (theForm.elements[i].name + ": campo vuoto non accettabile");
    			theForm.elements[i].value = "";
    			theForm.elements[i].focus();
    			return false;
    		}else if (theForm.elements[i].type=="checkbox" && theForm.elements[i].checked && theForm.elements[i].className == "si") {
    			alert (theForm.elements[i].name + ": campo non spuntato");
    			theForm.elements[i].focus();
    			return false;
    		}
    	}
    }
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  3. #3
    cavicchiandrea
    ti ringrazio per la tua risposta
    Stamane ho sperimentato la nuova funzione aggiornata come mi hai suggerito.
    Tuttavia rimaneva un problema nella "if".
    codice:
    if (theForm.elements[i].value == "" && theForm.elements[i].className == "si") {
    .................
    }else if (theForm.elements[i].type=="checkbox" && theForm.elements[i].checked && theForm.elements[i].className == "si") {
    ................
    }
    In questo modo viene testato prima la proprietà value del controllo, poi viene valutato se il controllo in oggetto è una checkbox e, di conseguenza il form non viene mai accettato.

    Ho pensato di invertire le condizioni nella "if" e di cambiare leggermente il codice ed ho parzialmente ovviato al problema.
    codice:
    if (theForm.elements[i].name == "privacy") {      // questo è il nome della checkbox
    ...............
    } else if (theForm.elements[i].value == "" && theForm.elements[i].className == "si") {
    ...................
    }
    A sto punto c'è un altro problema: non posso bloccare il FORM se theForm.elements[i].checked ma se non è checked .
    per cui la mia, temporanea e provvisoria soluzione sarebbe la seguente:

    codice:
    function check_valid(theForm) {
    	for (i=0; i < theForm.elements.length; i++) {
    		if (theForm.elements[i].name == "privacy") {
    			if (theForm.elements[i].checked) {
    				var errato="";
    			} else {
    				errato = theForm.elements[i].name + ": campo non spuntato";
    			}
    			if (errato != ""){
    				alert(errato);
    				theForm.elements[i].value = "";
    				theForm.elements[i].focus();
    				return false;
    			}
    		} else if (theForm.elements[i].value == "" && theForm.elements[i].className == "si") {
    			alert (theForm.elements[i].name + ": campo vuoto non accettabile");
    			theForm.elements[i].value = "";
    			theForm.elements[i].focus();
    			return false;
    		}
            }
    }
    Quel che in questa routine mi disturba un poco è quel if (theForm.elements[i].checked) {
    Non potrei dire da subito di controllare se il controllo non è checked?
    come si potrebbe dirlo?
    In questo modo accorcerei la routine ed eviterei del codice inutile in questo modo:
    invece di dire:

    codice:
    if (theForm.elements[i].checked) {
    	var errato="";
    } else {
    	errato = theForm.elements[i].name + ": campo non spuntato";
    }
    if (errato != ""){
    	alert(errato);
    	theForm.elements[i].value = "";
    	theForm.elements[i].focus();
    	return false;
    }
    potrei scrivere semplicemente:
    codice:
    if (theForm.elements[i].non-checked) {    // non so come indicare lo stato non-checked 
    	alert("devi flaggare il controllo");
    	theForm.elements[i].focus();
    	return false;
    }
    Grazie ancora

  4. #4
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    Dovrebbe funzionare, comunque la logica del controlli per l'elemento "globale" form
    if type=='text' && value=="" x input text
    if type=='select' && selectedIndex x le select
    if type == 'checkbox' o 'radio' && checked == true/false x radio e spunta
    se devi validare tutti gli elementi del form altrimenti fai i controlli specifici
    if document.nomeform.nomecampo.value/checked/selectedIndex per dettaglio clicca qui
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  5. #5
    Grazie cavicchiandrea e ottima la sintesi dei controlli che mi hai fornito.

    Grazie ai tuoi suggerimento ho ridotto il codice in questo modo e funziona egregiamente
    codice:
    function check_valid(theForm) {
    	for (i=0; i < theForm.elements.length; i++) {
    		if (theForm.elements[i].name == "privacy") {
    			if (theForm.elements[i].checked == false) {
    				alert(theForm.elements[i].name + ": campo non spuntato");
    				theForm.elements[i].value = "";
    				theForm.elements[i].focus();
    				return false;
    			}
    		} else if (theForm.elements[i].value == "" && theForm.elements[i].className == "si") {
    			alert (theForm.elements[i].name + ": campo vuoto non accettabile");
    			theForm.elements[i].value = "";
    			theForm.elements[i].focus();
    			return false;
    		}
    }
    Per il checkbox uso il name anzichè il type perchè, almeno in questo momento, non ho intenzione di controllare altri eventuali checkbox.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.