Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    100

    Come evitare che una form mi venga sottomessa più volte

    Ciao a tutti,

    vi porgo subito il mio problema, ho realizzato un plugin per JQuery, che mi permette di validare i campi di una form e nel momento in cui risultano corretti, allora lo stesso plugin mi invia la mail grazie al comando $.ajax() di JQuery.

    Il tutto sembra funzionare, dico sembra perché mi sono accorto che se non compilo tutti i campi obbligatori la form non viene sottomessa, e nel momento in cui riempio tutti i campi e spedisco, la richiesta viene mandata tante volte quante sono le volte che mi sono dimenticato qualche campo ma ho fatto l'invio della Form

    Mi spiego meglio, i campi obbligatori sono: nome, cognome, telefono ed email, supponendo riempirne 3/4 e cliccando sul type submit, il plugin mi riconosce che c'è un errore, allora lo sistemo e ri sottometto la form; i dati sono corretti ma la form mi viene spedita 2 volte....

    Ho provato a sistemare il tutto, cancellando la cache
    codice:
    $.ajax({
    cache : false,
    ...
    Ma sembra non funzionare, è per caso salvato tutto in una qualche coda???

    Grazie a tutti per l'aiuto

  2. #2
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    vediamo tutto lo script

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    100
    Scusate indentazione ...
    codice:
    (function($){  
      $.fn.formValidate = function() {  
        var config = {
          'shaker'            : true,
          'shakers'           : 5,
          'showMessage'       : false,
          'errorClass'        : 'error',
          'requiredClass'     : 'required',
          'requiredMail'      : 'mail',
          'requiredNumber'    : 'numeric',
    			'url'               : 'include/ajax/sendEmail.php',
    			'type' 							: 'post',
    			'cache'							: false,
    			'btnSend'						: 'send',
    			'dataType' 					: 'json',
    			'global' 						: false,
          messages : {
            'blank'           : 'Campo Richiesto',
            'check'           : 'Devi accettare',
            'email'           : 'Indirizzo e-amil non valido',
            'numbe'           : 'Il campo deve essere numerico',
    				'conf'						: 'Acconsenti all\'utilizzo dei propri dati personali per l\'invio di informazioni relativamente agli argomenti trattati da questo sito. KickBoxing team tratterà le informazioni fornite nel rispetto della normativa sulla privacy, ai sensi dell\'art. 13 del decreto legislativo del 30/06/2003 n. 196, che abroga e sostituisce la legge del 31/12/1996 n. 675 (tutela della privacy). '
          }
    		}
    	  var options = $.extend(config, options);  
    	  
    		return this.each(function() {  
    			var error=false;
    			
    			$(this).find('#'+config.btnSend+'').click(function(){
    				if(!confirm(config.messages.conf) ) return false
    				else {
    					var espressione = /^[_a-z0-9+-]+(\.[_a-z0-9+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+$/;
    					var form = $(this).parent();
    					form.submit(function(){
    				  var validMe = {'errors':false}
    				  //cicliamo tutti gli input trovati
    			    $(this).find('.'+config.requiredClass+'').each(function() {
    						var $input 		= $(this);
    						var type			= $input.attr('type');
    						var groupName 	= $input.attr('name');
    						//controlliamo che il contenuto dell'input non sia vuoto
    						if(!$input.val()){
    							error						= true;
    							errorType				= 'blank';
    							validMe.errors 	= true;
    						//se si tratta di una checkbox che non è stata selezionata
    						} else if( (type == 'checkbox') && ( !$input.is(':checked') ) ){
    							error						= true;
    							errorType				= 'check';
    							validMe.errors  = true;
    						//se si tratta di una email controlliamo che ci sia il simbolo "@" e "."
    						//} else if( $input.hasClass(config.requiredMail) && ( ($input.val().indexOf('@') == -1) || ($input.val().indexOf('.') == -1) ) || !espressione.test($input.val()) ){
    						} else if($input.hasClass(config.requiredMail) ){
    							if(!espressione.test($input.val()) || ($input.val().indexOf('@') == -1) || ($input.val().indexOf('.') == -1) ) {
    								error						= true;
    								errorType				= 'email';
    								validMe.errors	= true;
    							}
    						//se si tratta di un input numerico controlliamo che il valore inserito sia di questo tipo
    						} else if( ($input.hasClass(config.requiredNumber)) && isNaN($input.val()) ){
    							error						= true;
    							errorType				= 'numbe';
    							validMe.errors	= true;
    						//se non è nessuno di questi casi resettiamo l'errore
    						} else {
    							error 					= false;
    							errorType				= null;
    						}
    						// notifichiamo l'utente dell'errore di validazione
    						if(error){
    							// assegnamo la classe di errore all'input
    							$input.addClass(config.errorClass);
    							// se è abilitata l'opzione shaker, shakeriamo un po' l'input !!!!
    							if(config.shaker){
    								for (i=0; i<config.shakers; i++) {
    									$input.animate({ marginLeft: "5px"}, 100 );
    									$input.animate({ marginLeft: "-5px"}, 100 );
    								}
    								$input.animate({ marginLeft: "0"}, 100 );
    							}
    							// se è abilitata l'opzione showMessage mostriamo anche un messaggio
    							if(config.showMessage){
    								// il messaggio viene mostrato solo se non è già stato mostrato
    								if($input.next('label').length == 0){
    									$input.after('<label class="'+config.errorClass+'">'+config.messages[errorType]+'</label>');
    								} else{
    									$input.next('label').html(config.messages[errorType]);
    								}
    							}
    						}
    
    						// se è abilitata l'opzione showMessage e non ci sono errori togliamo il messaggio
    					if(!error && $input.next('label').length != 0) $input.next('label').remove();
    					// se l'input che stiamo controllando non contiene errori ed ha la classe error, la togliamo
    			   	if(!error && $input.hasClass(config.errorClass)){
    			   	  $input.removeClass(config.errorClass);
    			   		if(config.removeCustom) config.removeCustom($input);			
    					}
    			    });
    					// se non ci sono errori procedo con il submit del formulario
    			    if(error) return false;
    			    else {
    						
    						$.ajax({
    							cache 		: config.cache,
    							url				: config.url,
    							data 			: $(this).serialize(),
    							dataType  : config.dataType,
    							type			: config.type,
    							global		: config.global,
    							beforeSend: function(){},
    							error			:	function(){},
    							success		: function(data){
    								switch(data.succ){
    								  case 0: 
    									  //incorenza del codice captcha
    										alert('Il codice di controllo non coincide');
    										$(form).find('.code').val('');
    										$(this).dequeue();
    										break;
    									case 1: 
    									  //mail inviata
    										$(form).find('.required').val("");
    										alert('eMail inviata correttamente');
    										$(this).dequeue();
    										break;
    									default:
    									  //errore nell'invio
    										$(form).find('.code').val('');
    										alert('eMail non inviata a causa di un errore tecnico');
    										$(this).dequeue();
    										break;
    								}
    							}
    						});
    						return false;
    					}	
    				});
    				}
    			});	
    		});
    	}
    })(jQuery);

  4. #4
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    come sospettavo ci sono errori di logica
    il primo e' settare ad ogni chiamata un nuovo gestore evento per il form: ad ogni tentativo, comunque vada a termine, setti che si proceda al submit ad inviare via ajax

    chiaramente la prima volta che passa la validazione lo fa, una volta di piu' per ogni tentativo precedente non andato a buon fine

    se proprio vuoi mantenere questa logica (che non e' certamente la piu' immediata) fai un bind con namespace del submit del form e preoccupati di rimuoverlo prima di settarlo nuovamente
    http://api.jquery.com/unbind/

    eviterei comunque di far partire i controlli al click sull' elemento di tipo submit: ritorni false in caso non debba procedere ma non e' certo che ritornare falso al click blocchi l' invio,
    mentre ritornare false al submit del form sicuramente lo fa
    (oltre a coprirti da varie situazioni: submit da pressione di invio in campo testo, piu' di un tasto per il submit nel form, etc)

    ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    100
    Xinod è stato il mio primo plugin quindi qualunque suggerimento è ben accetto anzi attendo tue idee per poter modificare la meglio....

    Da quello che ho capito dalla tua spiegazione devo togliere l'evento click dal type submit, ok ma se poi dal click gestisco l'evento submit???

    Per quanto riguarda l'unbind nn ho apito come devo usarlo....

    Pensavo che l'evento si istanziasse solo una volta al caricamento della pagina... Mi puoi spiegare meglio questa cosa

    Grazie e disponibile come sempre

  6. #6
    Utente di HTML.it L'avatar di Xinod
    Registrato dal
    Sep 2000
    Messaggi
    13,649
    Originariamente inviato da [ks]furlo
    Per quanto riguarda l'unbind nn ho apito come devo usarlo....
    leggi le pagine riguardanti bind e unbind dell' api di jquery,
    spiega tutto
    Pensavo che l'evento si istanziasse solo una volta al caricamento della pagina... Mi puoi spiegare meglio questa cosa
    qui hai
    codice:
    $(this).find('#'+config.btnSend+'').click(function(){
      ...che contiene
      form.submit(function(){
      ...
      })
      ...
    })
    cioe' ad ogni click setti un nuovo gestore evento onsubmit per il form, no?
    questo determina il problema che riporti

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.