1174 sujets

Accessibilité du Web

Bonjour à tous

Aujourd'hui, je viens vous voir pour une petite question qui me taraude.
Je me suis basée sur ce tutoriel pour faire un formulaire de contact. J'ai amélioré un peu le tout à ma sauce, avec une regex pour vérifier l'email.

Dans le tutoriel en question, l'auteur met les messages de champ non rempli directement dans le html ce qui donne :


<label for="email" id="email_label">Return Email</label>
<input type="text" name="email" id="email" size="30" value="" class="text-input" />
<label class="error" for="email" id="email_error">This field is required.</label>


Puis les cache en javascript (jquery mais c'est pareil dans l'absolu), pour les ré-afficher si le champ n'est pas rempli, une fois que l'utilisateur a cliqué sur submit (à l'aide d'ajax).

Dans mon formulaire, pour l'email par exemple j'ai ma regex qui va vérifier tout ça, du coup j'ai deux cas. Mon idée a été de laisser le label pour l'erreur vide, et d'afficher le message d'erreur avec javascript, ce qui nous donne :
<label for="user_email">E-mail<span class="redstar">*</span> :</label> 
<input class="" type="text" name="user_email" id="user_email" value="" /> 
<label class="error" for="user_email" id="user_email_error"> </label>


Et le jquery qui va avec :


//validate email
		function emailValidator(emailAddress) {
		var pattern = new RegExp(/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i);
		return pattern.test(emailAddress);
		}

		var user_email = $("input#user_email").val();
  		if (user_email == "") {
		$("label#user_email_error").html('This field is required.');
        $("label#user_email_error").show();
        $("input#user_email").focus();
        return false;
		}
		else{  		
			if (!emailValidator(user_email))
			{	
			$("label#user_email_error").html('Please enter a valid email');
			$("label#user_email_error").show();
			$("input#user_email").focus();
			return false;				
			}
		}


Du coup, ma question : d'un point de vue de l'accessibilité, vaut-il mieux laisser le message d'erreur dans le html, comme fait dans le formulaire, ou le mettre dans le javascript et laisser un label vide (sémantiquement pas génial)? De plus, pour les screenreaders, je me demande un peu ce que mon label vide va donner.

Enfin, autre petit "souci", le formulaire utilise de l'ajax pour être envoyé, ce qui veut dire que si le javascript est désactivé, plus de formulaire. Est- ce que vous avez des "techniques" ou des conseils pour parer à ça ? Mon idée était, de mettre dans une balise noscript une autre balise form, qui renvoie le formulaire à un traitement 100% php coté serveur, du style :


<form action="" id="formAddResult" class="form_64" method="post"> 
<noscript> <form action="traitementsansajax.php" id="formAddResult" class="form_64" method="post">  </noscript>


Mais celà ne semble pas fonctionner Smiley sweatdrop

Merci d'avance Smiley smile
Modifié par InpIxelItrust (18 Oct 2010 - 17:27)
a écrit :
point de vue de l'accessibilité, vaut-il mieux laisser le message d'erreur dans le html, comme fait dans le formulaire, ou
le mettre dans le javascript et laisser un label vide (sémantiquement pas génial)? De plus, pour les screenreaders, je me demande un peu ce que mon label
vide va donner.

Est-ce qu'il y a quelque part une page de démo où on pourrait tester soit le script du tutoriel, soit ton script revisité ?
Parce que je ne suis pas certain que deux labels se référant au même champ soit une bonne idée. Je voudrais tester pour voir précisément ce qui se passe avant de juger.

a écrit :
Enfin, autre petit "souci", le formulaire utilise de l'ajax pour être envoyé, ce qui veut dire que si le javascript est désactivé, plus de formulaire.
Est- ce que vous avez des "techniques" ou des conseils pour parer à ça ? Mon idée était, de mettre dans une balise noscript une autre balise form, qui
renvoie le formulaire à un traitement 100% php coté serveur

Ton approche a un gros problème: tu vas devoir maintenir deux formulaires parralèles qui font fondamentalement la même chose. Un jour ou l'autre, tu mettras à jour un des deux formulaires et tu oublieras l'autre. C'est pas pratique, et c'est aussi très chiant de faire deux fois le même boulot.

Idéalement, il faut resservir le même formulaire et le fait d'utiliser AJAX ou non doit être complètement transparent pour l'utilisateur.
Si c'est facile à dire, ce n'est pas toujours facile à faire malheureusement, et le plus souvent par solution de simplicité on oblige javascript. Si dans le cadre d'une application complexe web 2.0 ça peut à mon avis très bien se justifier, je pense que ça ne se justifie par contre pas dans ton cas. Donc la meilleure réponse, c'est, à mon avis, on n'utilise pas AJAX pour une chose aussi simple qu'un formulaire de contact.

AJAX quand c'est fait correctement c'est très très bien, par contre ce qui m'énerve c'est que de plus en plus on l'utilise alors que ce n'est vraiment pas indispensable. Mème pour une petite recherche google à la con il y a de l'AJAX inutile maintenant.
Modifié par QuentinC (11 Oct 2010 - 20:03)
Bonjour QuentinC et merci pour les réponses
Pour la page de test voici
Je tiens à préciser qu'elle a subit quelques modifications depuis le premier post, le champ "name" se valide désormais "en temps réel" sur un "focusout()".
Le formulaire est destiné à cette page (attention allemand ^^), mais celui qui s'y trouve actuellement est encore l'ancienne version ( avec les messages d'erreur dans les labels comme sur le tuto)

Pour le coté ajax du formulaire, outre le fait que ce soit très populaire en ce moment et qu'on trouve pleins de tutoriels là dessus (ne serait-ce que sur la page d'accueil alsacreations il y a une pub pour un bouquin "Apprendre Ajax / JQuery"), ce qui m’intéressait, c'est le fait de pouvoir afficher un message à l'utilisateur quant à la validité de ses champs, sans pour autant devoir recharger une page et surtout l'informer que le formulaire a bien été envoyé, sans lui afficher une page en plus "votre formulaire a bien été envoyé, vous allez être redirigé blablaa".
En fait, le formulaire se trouve sur un site multilingue, avec un cms propriétaire derrière avec lequel je peux faire TRES peu de choses, du coup, afficher le message grâce à ajax directement dans la page où se trouve le formulaire est la solution la plus simple que j'ai trouvé. Si cela avait été un site statique, ça aurait été une autre histoire, j'aurais facilement pu faire une validation uniquement coté serveur, puis renvoyer les informations vers une page avec le formulaire, les champs et le même design. Mais ici, je n'ai que peu de contrôle sur le tout, hélas. J'ai du créer le formulaire en html et l'insérer dans l'article, pour faire le traitement derrière coté serveur moi-même, car le formulaire de base proposé par le cms avait de gros souci de sécurité : 11 000 spams en 3 semaines, et pas de module antispam de disponible : arggh.

a écrit :
Ton approche a un gros problème: tu vas devoir maintenir deux formulaires parralèles qui font fondamentalement la même chose. Un jour ou l'autre, tu mettras à jour un des deux formulaires et tu oublieras l'autre. C'est pas pratique, et c'est aussi très chiant de faire deux fois le même boulot.

En fait j'ai du mal m'exprimer, ce que je pensais faire, n'est pas faire 2 formulaires mais un seul, et ne changer que la première ligne. En fait "action" qui dans le cas où le javascript serait activé utilise l'ajax pour la validation et l'envoie, et dans le cas où il est désactivé, renvoie vers mon script php sur le serveur directement (de toute façon les contrôles et tests des champs sont déjà présents dans le script). Du coup, si je modifie le formulaire, il sera modifié qu'une fois, il faudra juste, si je rajoute des champs par exemple, modifier les scripts php. Effectivement ça fait double travail, mais bon, copier coller une liste pour ajouter un test de champ, je devrais m'en sortir ^^

a écrit :
Idéalement, il faut resservir le même formulaire et le fait d'utiliser AJAX ou non doit être complètement transparent pour l'utilisateur.

Effectivement je suis assez d'accord là dessus, mais je vois difficilement comment faire. En fait, si je fais sans l'ajax, je vois un peu mal comment je vais pouvoir renvoyer l'information à l'utilisateur selon laquelle son formulaire a bien été renvoyé (ou pas), tout en l'affichant dans la même page, et gardant le layout, les liens etc ( remarque c'est peut-être super basique et moi qui suis pas douée hein ^^)

a écrit :
Si c'est facile à dire, ce n'est pas toujours facile à faire malheureusement, et le plus souvent par solution de simplicité on oblige javascript.

Effectivement, ce qui m'ennuie un peu c'est que dans tous ces jolis tutoriels sur des "super formulaires en ajax qui rox avec des jolis effets fade etc youpiii tralalavoilà", c'est que peu voir aucun ne donnent la démarche à suivre si le javascript est désactivé. C'est un peu pour ça que je me retourne vers le forum ^^. J'ai cru lire quelque part que en 2007, 98% des utilisateurs naviguaient avec le javascript activé, vous me direz, pour 2% ... Certes, mais bon, ça m'ennuie quand même.

a écrit :
AJAX quand c'est fait correctement c'est très très bien, par contre ce qui m'énerve c'est que de plus en plus on l'utilise alors que ce n'est vraiment pas indispensable

Effectivement, l'ajax sur mon site n'est pas indispensable, mais me facilite grandement la vie à moi, coté codage, vu que je n'ai accès à presque rien à part quelques templates du cms qui me servent pas à grande chose, et à l'utilisateur, coté validation en temps réel et feedback du style "votre message a bien été envoyé merci".

a écrit :
Donc la meilleure réponse, c'est, à mon avis, on n'utilise pas AJAX pour une chose aussi simple qu'un formulaire de contact.

Bah voui, mais bon, du coup, au risque de me répéter, je ne vois pas trop comment faire en sorte d'afficher le message à l'utilisateur si le champ est mal rempli (j'ai déjà toute la validation coté serveur de faite en php en plus, y a plus qu'à ^^), tout en gardant le design de la page, le multilinguisme du site, et sans lui afficher une page du style "merci de bien vouloir remplir le champ "name" avec un petit "lien retour au formulaire" juste en dessous Smiley decu
Modifié par InpIxelItrust (12 Oct 2010 - 00:12)
Bonjour

Ayant été confronté au problème (formulaire en php où je voulais aussi faire les vérifications en ajax), j'ai trouvé cet exemple qui me semble bien fonctionner
a écrit :
En fait j'ai du mal m'exprimer, ce que je pensais faire, n'est pas faire 2 formulaires mais un seul, et ne changer que la première ligne. En fait "action"
qui dans le cas où le javascript serait activé utilise l'ajax pour la validation et l'envoie, et dans le cas où il est désactivé, renvoie vers mon script
php sur le serveur directement (de toute façon les contrôles et tests des champs sont déjà présents dans le script). Du coup, si je modifie le formulaire,
il sera modifié qu'une fois, il faudra juste, si je rajoute des champs par exemple, modifier les scripts php. Effectivement ça fait double travail, mais
bon, copier coller une liste pour ajouter un test de champ, je devrais m'en sortir ^^

Ah... dans ce cas c'est tout bon alors. Action doit toujours pointer un script existant au cas où javascript est désactivé, et s'il est activé il prend le dessus et n'exécute jamais cette action-là.

a écrit :
Effectivement je suis assez d'accord là dessus, mais je vois difficilement comment faire. En fait, si je fais sans l'ajax, je vois un peu mal comment je
vais pouvoir renvoyer l'information à l'utilisateur selon laquelle son formulaire a bien été renvoyé (ou pas), tout en l'affichant dans la même page, et gardant le layout, les liens etc ( remarque c'est peut-être super basique et moi qui suis pas douée hein ^^)

Normal, on ne peut pas sans, c'est fait pour justement


a écrit :

Effectivement, ce qui m'ennuie un peu c'est que dans tous ces jolis tutoriels sur des "super formulaires en ajax qui rox avec des jolis effets fade etc
youpiii tralalavoilà", c'est que peu voir aucun ne donnent la démarche à suivre si le javascript est désactivé. C'est un peu pour ça que je me retourne
vers le forum ^^. J'ai cru lire quelque part que en 2007, 98% des utilisateurs naviguaient avec le javascript activé, vous me direz, pour 2% ... Certes,
mais bon, ça m'ennuie quand même.

ON ne peut évidemment pas faire tout ça sans javascript, mais si personne ne précise rien en général c'est surtout parce que la plupart des tutoriels n'ont absolument aucune considération pour l'accessibilité.

a écrit :
Effectivement, l'ajax sur mon site n'est pas indispensable, mais me facilite grandement la vie à moi, coté codage, vu que je n'ai accès à presque rien à
part quelques templates du cms qui me servent pas à grande chose, et à l'utilisateur, coté validation en temps réel et feedback du style "votre message
a bien été envoyé merci".

Si tu n'as accès à rien, c'est soit que le CMS est pourri, soit que l'admin est parano. l'AJAX ne doit pas être un fallback à cause d'un gestion merdique côté serveur.

La règle primaire à ne pas oublier c'est que ton formulaire doit d'abord marcher correctement sans AJAX et sans javascript, puis ensuite seulement on les ajoute. ET c'est seulement si on n'a pas le choix qu'on oblige js en prévenant l'utilisateur.
Bonjour à tous Smiley smile

@cilou Merci pour le lien, j'ai testé l'exemple, effectivement le formulaire est très sympa, en désactivant le javascript, il m'envoie le formulaire même avec les champs vides et renvoie une page "sent", du coup je ne sais pas trop si l'action a réussie ou pas, je pense que oui ^^. Par contre j'aime beaucoup le fait que les champs restent remplis quand on rafraîchi la page, je vais me pencher là dessus Smiley smile

QuentinC a écrit :
Action doit toujours pointer un script existant au cas où javascript est désactivé, et s'il est activé il prend le dessus et n'exécute jamais cette action-là.


Effectivement, je ne le savais pas, merci beaucoup !! Du coup même pas besoin de balise noscript en fait, il suffit que je fasse pointer action vers mon formulaire de traitement coté serveur 100% php et le tour est joué.
Je pense que pour les 2% ou 3% d'utilisateurs sans javascript, je vais laisser tomber le perfectionnisme, et hélas leur renvoyer les informations "ceci est un champ obligatoire", "votre formulaire a bien été envoyé" dans une page "statique" dont le design sera proche de celui du site, sans être le site pour autant, avec un lien "retour vers le formulaire" / "retour au site" (ou retour en arrière, mais sans javascript, je doute que ça soit possible). Obliger l'utilisateur à activer .JS est contre mes principes, et de toute façon, dans le cas de navigateurs "exotiques" ou appareils mobiles anciens, ce n'est parfois même pas possible.
Je test ça et je vous tiens au courant.

Pour le CMS c'est assez compliqué, en fait c'est un truc mutualisé qui sert à pleins de sites, donc le "coeur" est à la racine du serveur, partie à laquelle je n'ai pas accès (heureusement en fait), du coup, pour implanter un truc, il faudrait modifier le coeur, ce qui modifierait pour tous les sites. Mode débrouille = on ^^

Merci en tout cas pour vos réponses !!
Bon bah voilà, du coup j'ai :
- mon script php qui va traiter tout ça et renvoyer une page avec un design proche et un message, si .JS est désactivé
- mon javascript avec un peu de ajax qui va traiter mes champs coté utilisateur quand .JS est activé
Youhouu on est y est arrivé !! Enfin.. presque ^^


Par contre, ce qui m'embête (oui toujours), c'est d'avoir deux scripts du coup : sendmail.php qui traite tout ça quand .JS est activé et sendmail_no_script.php pour le 2em cas. J'ai essayé de fusionner les deux, mais je me heurte à un petit problème avec le json à cause d'un exit.

J'ai mon sendmail.php qui renvoie un objet json (qui va afficher mon message de retour à l'utilisateur défini dans le javascript) :
// Test to send the email
if (($Error != true)&& ($spambot == false)){	
	// Submition ok, mail sent
	if (mail($emailTo, $subject, $body, $headers)){ 
		$mailSent['mailSubmit'] = 'success';
		print json_encode($mailSent);
        exit;
	}
	//problem server, mail not sent
	else{
		$mailSent['mailSubmit'] = 'errorSubmition';
		print json_encode($mailSent);
		exit;
	}
}


L'équivalent dans sendmail_no_script.php qui renvoie une page avec un design, et le message :

// Test to send the email
if (($Error != true)&& ($spambot == false)&&($Error_user_email== false)){
// seeend !!
mail($emailTo, $subject, $body, $headers);
$emailSent = true; 
$message_back= '<h3>Das Kontaktformular wurde gesendet, vielen Dank !! </h3>
<p>Sie erhalten von uns sehr bald eine Antwort.</p>';
}

Avec plus bas, du html (la page de retour avec un design proche) :

<div id="message_back">
<?php echo $message_back; ?>
</div>


J'avais essayé de mixer les deux dans un seul fichier sendmail.php :

if (($Error != true)&& ($spambot == false)&&($Error_user_email== false)){
	
	// Submition ok, mail sent
	if (mail($emailTo, $subject, $body, $headers)){ 
		
		$emailSent = true; 
		$message_back= '<h3>Das Kontaktformular wurde gesendet, vielen Dank !! </h3>
<p>Sie erhalten von uns sehr bald eine Antwort.</p>';
		$mailSent['mailSubmit'] = 'success';
		print json_encode($mailSent);
                exit;
	}
	
}

Ça fonctionne nickel quand le javascript est activé, mais une fois non activé, ma page de retour pour l'utilisateur m'affiche une page blanche avec juste {"mailSubmit":"success"}, au lieu de mon message de retour dans une page html. Vous me direz, c'est normal, avec le print et le exit qui suit.
J'ai essayé d'enlever le exit; . Du coup il envoie le mail, m'envoie bien le message retour au complet dans la page html quand le javascript est desactivé, mais plus de message de retour pour l'utilisateur (donc d'objet json) pourtant le mail est bien envoyé.
J'avoue que là c'est un vrai casse tête, j'ai testé pas mal de trucs, mais rien n'y fait. Du coup je garde pour le moment deux scripts sur le site en production pour le moment, mais ça m'embête deux scripts à maintenir. Si quelqu'un a une idée pour les fusionner et que ça marche je suis preneuse

(si mon post est HS au forum accessibilité, il peut être déplacé du coté du forum php ^^)
Modifié par InpIxelItrust (15 Oct 2010 - 16:09)
Tu pourrais ajouter un champ caché, et envoyer une réponse appropriée selon la valeur de ce champ.

S'il n'y a pas de javascript, alors la valeur du champ cachée est envoyée telle qu'elle a été définie en HTML.
Si javascript est activé, tu prends soin de changer la valeur de ce champ caché juste avant d'envoyer le formulaire, comme ça tu reçois une autre valeur s'il a été envoyé avec AJAX.
Pas bête effectivement j'ai vu un formulaire qui détectait plus ou moins l'activation du javascript comme ça.
En plus j'ai déjà un champ caché qui me sert à la détection de bot, je pourrais peut-être le reconvertir Smiley smile

Je test ça et je te dis

merciii Smiley smile
Bon bah finalement j'ai pris le problème dans l'autre sens :
- si javascript est activé, j'envoie via mon validation.js une variable ajax=1
- dans le php je test, si la variable existe, c'est que le javascript est activé, donc je renvoie le test json
- si la variable n'existe pas, pas de javascript, donc un traitement du coté du serveur des variable.


Nous y sommes arrivés ! Un grand merci à vous deux Smiley smile