11548 sujets

JavaScript, DOM et API Web HTML5

Bonsoir à tous.

Après plusieurs jours de recherche, je viens enfin poster mon problème ici afin de trouver (je l'espère) un petit coup de pouce...

J'ai réalisé un formulaire simple utilisant un captcha php.

Voici mon code HTML :

<form action="contact.php" id="form_contact" method="post" onsubmit="return verif_all();">
	<p>
		<label for="nom" class="label_left">Nom :</label>
		<input type="text" id="nom" name="nom" class="champ_right" maxlength="20" onblur="verif_nom();" /><span id="verif_nom"></span>
	</p>
	<p>
		 <label for="mail" class="label_left">Mail :</label>
		<input type="text" id="mail" name="mail" class="champ_right" maxlength="30" onblur="verif_mail();" /><span id="verif_mail"></span>
	</p>
	<p>
		<label for="sujet" class="label_left">Sujet :</label>
		<input type="text" id="sujet" name="sujet" class="champ_right" maxlength="50" />
	</p>
	<p>
		<label for="message" class="label_left">Message :</label>
		<textarea id="message" name="message" class="champ_right" rows="4" cols="15" onblur="verif_msg();"></textarea><span id="verif_msg"></span>
	</p>
	<p>
		<label for="captcha" class="label_left">Code :</label>
		<input type="text" id="captcha" name="captcha" class="champ_right_captcha" maxlength="20" onblur="verif_code();" /><span id="verif_code"></span>
		<?php dsp_crypt(0,0); ?>
	</p>
	<p class="bt_submit">
		<input type="submit" id="submit_form" name="submit_form" value="Envoyer" />
	</p>
</form>

Ce formulaire a pour simple objectif d'envoyer un e-mail une fois validé (via la page contact.php)

Voici mon code Javascript :

function verif_nom() {/* vérifications... */}

function verif_mail() {/* vérifications... */}

function verif_msg() {/* vérifications... */}

/*  vérification du champ 'code'  */
function verif_code() {
	var paramAjax = "action=verif&captcha="+$F('captcha');
	var ajax = new Ajax.Updater(
	{success: 'verif_code'},
	'ajax.php',
	{
		method: 'post', 
		parameters: paramAjax, 
		onLoading: $('verif_code').innerHTML = "<span>V&eacute;rification...</span>",
		onComplete: conf_code,
		asynchronous: true
	});
}

function conf_code() {
	if (document.getElementById('verif_code').innerHTML.match(/champ correct/)) {
		return "verif_code_ok";
	} else {
		return false;
	}
}

/*  vérification du formulaire pour chaque champs */
function verif_all(){

	verif_nom();
	verif_mail();
	verif_msg();
        verif_code();
		if((verif_nom()!="verif_nom_ok")||(verif_msg()!="verif_msg_ok")||(verif_mail()!="verif_mail_ok")||(conf_code()!="verif_code_ok")){
			return false;
		}
		if((verif_nom()=="verif_nom_ok")&&(verif_mail()=="verif_mail_ok")&&(verif_msg()=="verif_msg_ok")&&(conf_code()=="verif_code_ok")) {
			  if(confirm("Envoyer ces informations ?")) {
			  	return true;
			  } else {
			  	return false;
			  }
		}

	return false;
}


Et pour terminer mon script php :

<?php
/*  inclusions diverses   */

switch($_POST['action']){

 case "verif":
	if(chk_captcha($_POST['captcha'])) {
		echo "champ correct";
	} else {
		echo "champ incorrect";
	}
	break;
}
?>

Mon problème est que lors de la validation du formulaire la valeur retournée par la fonction conf_code() est obligatoirement false même si la valeur du captcha est correcte. Smiley sweatdrop

Pour le moment cela implique donc que l'utilisateur clic 2 fois sur le bouton submit pour valider correctement le champ captcha.

Mon problème est donc lié à l'exécution intégrale de ma fonction verif_code(), qui renvoi d'abord l'état du chargement Ajax puis termine par le résultat de cet appel Ajax dans une balise <span id="verif_code"></span>.
L'Ajax est traité de façon asynchrone et lors de la vérification de la fonction conf_code() le contenu de cette balise span contient encore la valeur de chargement de la fonction Ajax :
onLoading: $('verif_code').innerHTML = "<span>V&eacute;rification...</span>",
Smiley fache

Je suis donc à la recherche d'une solution miracle pour mon problème...

Merci d'avance à tous, et à bientôt. Smiley cligne
Modifié par Balty (10 Jan 2008 - 17:30)
Salut Balty,
Je ne suis pas un spécialiste du framework prototype.

Néanmoins, une première chose :
onLoading: [b]function() {[/b] $('verif_code').innerHTML = "<span>Vérification...</span>"[b]; }[/b],

Seconde chose:
préfère la méthode indexOf à l'utilisation d'une RegExp - bien moins rapide - dans ta fonction conf_code.

Dernier point:
en terme de conception, ton formulaire sera envoyé à la condition que le captcha soit valide. La première chose à faire est donc de valider ce dernier puis de vérifier les autres champs, ou l'inverse, mais pas tout en même temps.

Par exemple, une des solutions consisterait à pointer l'événement onsubmit du formulaire sur verif_code, et verif_all sur l'événement onComplete de l'Ajax.Updater. Sans oublier de supprimer tous autres appels à verif_code pour éviter les recursions bien sur...

Bon courage.
Bonsoir à tous,
et un grand merci pour cette réponse cher Ze Nenex.

Ton raisonnement me convient parfaitement, et il est beaucoup plus adapté au fonctionnement que j'aimerai obtenir pour mon formulaire.

Hélas quelques modifications, j'ai toujours un souci avec le traitement asynchrone de l'Ajax. J'ai donc suivit ton conseil et désormais l'appel de ma fonction Ajax (verif_code) se fait lors de la validation du formulaire sur l'évènement onsubmit et l'appel de ma fonction verif_all est effectué grâce à l'évènement onComplete.
Sauf que désormais même si mes champs ne sont pas correctement remplis le formulaire est quand même envoyé Smiley bawling

Voici mon nouveau script Js :

function verif_nom() {/* vérifications... */}
function verif_mail() {/* vérifications... */}
function verif_msg() {/* vérifications... */}


/*  vérification du champ 'code'  */
function verif_code() {
	var paramAjax = "action=verif&captcha="+$F('captcha');
	var ajax = new Ajax.Updater(
	{success: 'verif_code'},
	'ajax.php',
	{
		method: 'post', 
		parameters: paramAjax, 
		onLoading: function () {
			$('verif_code').innerHTML = "<span>Vérification...</span>";
		},
		onComplete: function () {
			conf_code();
			verif_all();
		},
		asynchronous: true
	});
}

function conf_code() {
	if (document.getElementById('verif_code').innerHTML.match(/champ correct/)) {
		return "verif_code_ok";
	} else {
		return false;
	}
}


/*  vérification du formulaire pour chaque champs */
function verif_all(){

	verif_nom();
	verif_mail();
	verif_msg();
        verif_code();
		if((verif_nom()!="verif_nom_ok")||(verif_msg()!="verif_msg_ok")||(verif_mail()!="verif_mail_ok")||(conf_code()!="verif_code_ok")){
			return false;
		}
		if((verif_nom()=="verif_nom_ok")&&(verif_mail()=="verif_mail_ok")&&(verif_msg()=="verif_msg_ok")&&(conf_code()=="verif_code_ok")) {
			  if(confirm("Envoyer ces informations ?")) {
			  	return true;
			  } else {
			  	return false;
			  }
		}
	return false;
}


Comment bloquer ou non l'envoi du formulaire en fonction du résultat retourné par l'évènement onComplete ?

Une nouvelle idée sur la question ?
A condition que tu ais quelque chose comme monFormulaire.onsubmit = verif_code; au préalable, alors ceci devrait faire l'affaire :

function verif_code() {
	var paramAjax = "action=verif&captcha="+$F('captcha');
	var ajax = new Ajax.Updater(
	{success: 'verif_code'},
	'ajax.php',
	{
		method: 'post', 
		parameters: paramAjax, 
		onLoading: function () {
			$('verif_code').innerHTML = "<span>Vérification...</span>";
		},
		onComplete: function () {
			conf_code();
			verif_all();
		},
		asynchronous: true
	});
	[b]return false;[/b]
}

A bientôt.
Modifié par Ze Nenex (10 Jan 2008 - 12:18)
Seul petit problème...

Avec un return false sur ma fonction verif_code(), le formulaire n'est plus jamais envoyé.
Tout simplement parce que la fonction verif_code() retourne false avant même de vérifier la valeur de retour de la fonction verif_all() (qui dans le cas d'un formulaire correctement rempli, doit renvoyer true) placé sur l'évènement onComplete.
(encore et toujours un problème de traitement asynchrone des données) Smiley bawling

Je dois donc trouver une solution pour vérifier le résultat de l'évènement onComplete avant de retourner directement false pour le formulaire.
Et bien voilà j'ai enfin trouvé une solution à mon problème. Smiley smile

Il suffisait d'ajouter un évènement qui puisse valider l'envoi du formulaire dans ma fonction verif_all().

Comme ceci :

function verif_all(){

	verif_nom();
	verif_mail();
	verif_msg();

if((verif_nom()!="verif_nom_ok")||(verif_msg()!="verif_msg_ok")||(verif_mail()!="verif_mail_ok")||(conf_code()!="verif_code_ok")){
			return false;
		}

if((verif_nom()=="verif_nom_ok")&&(verif_mail()=="verif_mail_ok")&&(verif_msg()=="verif_msg_ok")&&(conf_code()=="verif_code_ok")) {
			  if(confirm("Envoyer ces informations ?")) {
                                [b]$("form_contact").submit();[/b]
			  	return true;
			  } else {
			  	return false;
			  }
		}
	return false;
}

Encore un grand merci à Ze Nenex pour son aide, je passe donc ce post en résolu.

A bientôt.