11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous,

Je suis en train de faire une petite application html qui référence les livres d'une bibliothèque privée. J'ai une page "référence des livres" qui se compose de champs de saisie texte (titre, auteur, etc...) et de boutons radio pour choisir le genre du livre. Je voudrais vérifier à l'aide de JavaScript si l'utilisateur a bien rempli les champs de saisie et coché l'un des boutons radio avant de valider mon formulaire.
Pour la vérification des champs de saisie, je n'ai pas de problème. Par contre, je n'arrive pas à faire tester mes boutons radio par JavaScript. Cela fait 3 jours entiers que je cherche sur Internet et que j'essaie de faire tous les codes possibles et imaginables, et rien ne fonctionne jamais sur mes boutons radio.
Je vous soumets donc mon code, si quelqu'un pouvait me dire ce qui ne va pas :



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Page enregistrement</title>
<link rel="stylesheet" type="text/css" href="./styles.css">

<!--Teste les champs de saisie texte :-->
<script type="text/javascript" >
  function test()
	{
	  var ok=0;
	  if (document.formulaire1.titre.value=='')
	  {
	    document.formulaire1.titre.value=prompt('Veuillez remplir le champ "Titre" :');
		 ok=1;
	  }
	  if (document.formulaire1.auteur.value=='')
	  {
	    document.formulaire1.auteur.value=prompt('Veuillez remplir le champ "Auteur" :');
		 ok=1;
	  }
	  if (document.formulaire1.editeur.value=='')
	  {
		 document.formulaire1.editeur.value=prompt('Veuillez remplir le champ "Editeur" :');
		 ok=1;
	  }
	  if (document.formulaire1.genre.value=='')
	  {
	    document.formulaire1.genre.value=prompt('Veuillez remplir le champ "Genre" :');
		 ok=1;
	  }
	  if (ok==0)
	  {
		 return true;
	  }
	  else
	  {
		 return false;
	  }
	}	
</script>

<!--Teste les boutons radio :-->
<script type="text/javascript" >
  function verifRadio()
  {
	 document.getElementsByName("genre").!checked;
  }
  alert("Cocher les cases");
</script>
</head>


<body>
  <div>
  <form method="post" action="" name="formulaire1" onsubmit="return test();">
  <table class="table_form" cellpadding="0" cellspacing="0">
  <caption class="gros_titre">Nouveau livre</caption>		
	
    <!--Champs de saisie texte :-->
	 <tr>
	   <td>
		  <fieldset>
		    <legend class="texte_fieldset">Références du livre</legend>
			   <table border="0" cellpadding="0" cellspacing="10">
				  <tr>                   
				    <td class="legende"><label for="titre">Titre&nbsp;:&nbsp;</label></td>
					 <td><input name="titre" id="titre" type="text" size="40" class="champ"></td>
					</tr>
				
					<tr>
					  <td class="legende"><label for="auteur">Auteur&nbsp;:&nbsp;</label></td>
					  <td><input name="auteur" id="auteur" type="text" size="30" class="champ"></td>
					</tr>
								
					<tr>
					  <td class="legende"><label for="editeur">&Eacute;diteur&nbsp;:&nbsp;</label></td>
					  <td><input name="editeur" id="editeur" type="text" size="30" class="champ"></td>
					</tr>
					<tr>
					  <td height="5">&nbsp;</td>								
					</tr>
					<tr>
					  <td><input type="reset" name="reset" value="   Recommencer   " class="bouton_simple"></td>
					</tr>
				</table>		
			</fieldset>
				
			<!--Boutons radio :-->
			<fieldset>
			  <legend class="texte_fieldset">Genre</legend>
			  <table border="0" cellpadding="0" cellspacing="0">
			    <tr>
				   <td>
					  <input type="radio" name="genre" id="roman" value="roman"><label for="roman" class="legende">Roman</label><br>
					  <input type="radio" name="genre" id="informatique" value="informatique"><label for="informatique" class="legende">Informatique</label><br>
					  <input type="radio" name="genre" id="sante" value="sante"><label for="sante" class="legende">Sant&eacute;</label><br>
					  <input type="radio" name="genre" id="spiritualite" value="spiritualite"><label for="spiritualite" class="legende">Spiritualit&eacute;</label><br>
					  <input type="radio" name="genre" id="cuisine" value="cuisine"><label for="cuisine" class="legende">Cuisine</label><br>
					  <input type="radio" name="genre" id="bricolage" value="bricolage"><label for="bricolage" class="bricolage">Bricolage</label><br>
					  <input type="radio" name="genre" id="nature" value="nature"><label for="nature" class="legende">Nature</label><br>
					  <input type="radio" name="genre" id="photo" value="photo"><label for="photo" class="legende">Photo</label><br>
					  <input type="radio" name="genre" id="bd" value="bd"><label for="bd" class="legende">Bande dessin&eacute;e</label><br>
					  <a href="../projet/genre.html" style="text-decoration:none"><input type="radio" name="genre" id="autre" value="autre"><label for="autre" class="legende">Autre...&nbsp;&nbsp;</label></a ><span class="autre">(cliquez sur "Autre..." si le genre de votre livre ne figure pas dans cette liste)</span>
					</td>
				 </tr>
			  </table>
			</fieldset>
		</td>
	</tr>	
				
	<tr>	
	  <td>
	    <input type="reset" name="reset" value="  Tout recommencer  " class="bouton_simple2">
		 <input type="submit" name="submit" value="   Valider   " class="bouton_simple" onclick="verifRadio();">
	  </td>		
	</tr>	
 </table>
 </form>
 </div>
</body>
</html>



Un très grand merci pour votre aide.
Modifié par sam06 (03 Jun 2011 - 10:41)
Bon, après bien des recherches, j'ai fait le script suivant pour tester les boutons radio en remplacement de l'autre script :



<script type="text/javascript" >
	/*Teste les boutons radio :*/
	function verifRadio()
	{
		oui=document.formulaire1.genre[0].checked;
		non=document.formulaire1.genre[1].checked;
		if (oui==false & non==false)
		{
			window.alert("Vous n'avez pas indiqué le genre du livre");
			return false;
		}
		else
		{
			return true;
		}
	}	
</script>



avec :



<form method="post" action="" name="formulaire1" onsubmit="return verifRadio();">




ça marche, mais maintenant je ne peux plus valider mon formulaire, ça m'envoie toujours la boite d'alerte à chaque fois que je clique sur valider (le reste de la page html est dans mon post précédent si besoin).

Merci de m'aider car je n'y arrive vraiment pas.
Bonjour,

Essayes avec le script suivant :

function verifRadio() { 
		var radio = document.formulaire1.genre; 
		var rlength = radio.length;
		var oui = false;
		for(var z = 0; z < rlength; z++) {
			if(radio[z].checked) {
				oui = true;
			}
		}
		if (oui) { 
			return true; 
		} else { 
			window.alert("Vous n'avez pas indiqué le genre du livre"); 
			return false; 
		} 
	} 

Modifié par Natha (02 Jun 2011 - 16:48)
Un grand merci Natha de t'être penché sur mon cas, tu me sauves la vie : CA MARCHE !!! Des jours que je suis dessus, et je n'aurais jamais trouvé seul (je débute en JavaScript).

J'ai un autre souci, si tu pouvais m'aider encore. L'un de mes boutons radio est un lien qui amène à une autre page si le genre du livre n'est pas référencé dans la liste des boutons. Un champ de saisie, et une fonction JS de vérification que le champ soit rempli. Mais lors de l'appui sur le "submit" de cette 2e page, je voudrais qu'au lieu de valider le formulaire comme actuellement, ça renvoie automatiquement vers la page précédente (au formulaire principal). J'ai donc fait une fonction "pageprecedente" :



<script type="text/javascript" >
/*Retour à la page précédente :*/
var champ=0;
function pageprecedente()
{
	if (champ!=0)
	{
		window.location="./enregistrement.html";
	}
}
</script>



mais ça ne fonctionne pas. Pourrais-tu m'aider ? (ou quelqu'un d'autre).
Voici le code complet de la page en question :



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Genre "autre"</title>

<link rel="stylesheet" type="text/css" href="./styles.css">

<script type="text/javascript" >
	/*Teste les champs de saisie texte :*/
	function test()
		{
		var ok=0;
		if (document.formulaire4.genre.value=='')
		{
			document.formulaire4.genre.value=prompt('Veuillez indiquer le genre du livre:');
			ok=1;
		}
		if (ok==0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
</script>

<script type="text/javascript" >
/*Retour à la page précédente :*/
var champ=0;
function pageprecedente()
{
	if (champ!=0)
	{
		window.location="./enregistrement.html";
	}
}
</script>
</head>

<body>
	<table border="0" cellpadding="0" cellspacing="0">
		<tr>
			<td><a href="./contenu.html"><img src="./ressources/bouton-page_daccueil.jpeg" alt="bouton" ></td>
			<td><a href="./enregistrement.html"><img src="./ressources/bouton-page_precedente.jpeg" alt="bouton" ></a></td>
			<td><a href="./consultation.html"><img src="./ressources/bouton-consultation.jpeg" alt="bouton" ></td>
			<td><a href="./suppression.html"><img src="./ressources/bouton-suppression.jpeg" alt="bouton" ></td>		
		</tr>
	</table>
	
	<table style="border:0px; width:90%; height:100%" cellpadding="0" cellspacing="50">
		<tr>
			<td>
				<form method="post" action="" name="formulaire4" onsubmit="return test();">
					<fieldset>
						<legend class="texte_fieldset">Autre</legend>
							<table border="0" cellpadding="0" cellspacing="0">
								<tr>
									<td class="legende"><label for="genre">Entrez le genre de votre livre&nbsp;:&nbsp;</label></td>
									<td><input type="text" name="genre" id="genre" size="30" class="champ"></td>
								</tr>
							</table>
					</fieldset>
					
					<p><input type="reset" name="reset" value="   Recommencer   " class="bouton_simple2"><input type="submit" name="submit" value="   Valider   " class="bouton_simple" onclick="pageprecedente();"></p>
				</form>
			</td>
		</tr>
	</table>	
	
<script type="text/javascript" >
	document.formulaire4.genre.focus();
</script>
</body>
</html>



Un immense merci pour l'aide qui me sera apportée.
De rien Smiley cligne

Le problème c'est qu'actuellement, quand tu cliques sur "Autre" ça ouvre une nouvelle page, hors il me semble que tu veux juste récupérer le genre entré par l'utilisateur dans ta page "principale" d'enregistrement, chose que tu ne pourras pas faire uniquement avec du html et javascript (dans l'absolu si en récupérant l'url mais bon y a plus simple).

Donc pourquoi ne pas rajouter un input text dans le formulaire, qui s'affichera à la place de "(cliquez sur "Autre..." si le genre de votre livre ne figure pas dans cette liste)" quand la case "Autre" est cochée par l'utilisateur? Après au moment de valider le formulaire, tu vérifies si cette case est cochée et si elle est cochée tu vérifies la valeur de l'input text, ce sera plus agréable pour l'utilisateur que d'être redirigé vers une nouvelle page.
Merci encore, Natha. Je pense que tu as raison, je me suis compliqué la vie. D'ailleurs avec une sous-page j'avais des problèmes pour l'enregistrement dans la base de données, mais c'est une autre histoire. Donc j'ai fait ce que tu m'as dit, mais du coup ça recommence comme tout à l'heure. Au 1er clic sur "submit", les tests se lancent, pas de souci. Si je rentre le genre du livre en cochant un radio, le formulaire se valide. Mais si je rentre le genre du livre par le champ de saisie (si genre autre), alors le formulaire ne se valide plus, et ça m'envoie toujours la boite d'alerte à chaque fois que je clique sur valider. Depuis tout à l'heure j'essaie d'adapter le code dans tous les sens, mais sans succès. Pourrais-tu encore m'aider ?

Voici ton code que j'ai essayé d'adapter pour intégrer le nouveau champ, mais sans succès :


<script type="text/javascript" >
	/*Teste les boutons radio :*/
	function verifRadio()
	{
		var radio=document.formulaire1.genre;
		var champ=document.formulaire1.autre_genre;
		var rlength=radio.length;
		var oui=false;
		for (var z=0; z<rlength; z++)
		{
			if (radio[z].checked && champ!='')
			{
				oui=true;
			}
		}
		if (oui)
		{
			return true;
		}
		else
		{
			window.alert("Vous n'avez pas indiqué le genre du livre");
			return false;
		}
	}
</script>



Et la page complète :


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Page enregistrement</title>

<link rel="stylesheet" type="text/css" href="./styles.css">

<script type="text/javascript" >
	/*Teste les champs de saisie texte :*/
	function test()
		{
			var ok=0;
			if (document.formulaire1.titre.value=='')
			{
				document.formulaire1.titre.value=prompt('Veuillez remplir le champ "Titre" :');
				ok=1;
			}
				if (document.formulaire1.auteur.value=='')
			{
				document.formulaire1.auteur.value=prompt('Veuillez remplir le champ "Auteur" :');
				ok=1;
			}
			if (document.formulaire1.editeur.value=='')
			{
				document.formulaire1.editeur.value=prompt('Veuillez remplir le champ "Editeur" :');
				ok=1;
			}
			if (document.formulaire1.genre.value=='')
			{
				document.formulaire1.genre.value=prompt('Veuillez remplir le champ "Genre" :');
				ok=1;
			}
			if (ok==0)
			{
				return true;
			}
			else
			{
				return false;
			}
		}	
</script>


<script type="text/javascript" >
	/*Teste les boutons radio :*/
	function verifRadio()
	{
		var radio=document.formulaire1.genre;
		var champ=document.formulaire1.autre_genre;
		var rlength=radio.length;
		var oui=false;
		for (var z=0; z<rlength; z++)
		{
			if (radio[z].checked && champ!='')
			{
				oui=true;
			}
		}
		if (oui)
		{
			return true;
		}
		else
		{
			window.alert("Vous n'avez pas indiqué le genre du livre");
			return false;
		}
	}
</script>
</head>

<body>
	<div>
	<form method="post" action="" name="formulaire1" onsubmit="return verifRadio();">
	<table class="table_form" cellpadding="0" cellspacing="0">
	<caption class="gros_titre">Nouveau livre</caption>
		<tr>
			<td>
				<fieldset>
					<legend class="texte_fieldset">Références du livre</legend>
						<table border="0" cellpadding="0" cellspacing="10">
								<tr>                
									<td class="legende"><label for="titre">Titre&nbsp;:&nbsp;</label></td>
									<td><input name="titre" id="titre" type="text" size="40" class="champ"></td>
								</tr>
				
								<tr>
									<td class="legende"><label for="auteur">Auteur&nbsp;:&nbsp;</label></td>
									<td><input name="auteur" id="auteur" type="text" size="30" class="champ"></td>
								</tr>
								
								<tr>
									<td class="legende"><label for="editeur">&Eacute;diteur&nbsp;:&nbsp;</label></td>
									<td><input name="editeur" id="editeur" type="text" size="30" class="champ"></td>
								</tr>
								<tr>
									<td height="5">&nbsp;</td>								
								</tr>
								<tr>
									<td><input type="reset" name="reset" value="   Recommencer   " class="bouton_simple"></td>
								</tr>
							</table>		
				</fieldset>
				
				<fieldset>
					<legend class="texte_fieldset">Genre</legend>
						<table border="0" cellpadding="0" cellspacing="0">
							<tr>
								<td>
								<input type="radio" name="genre" id="roman" value="roman"><label for="roman" class="legende">Roman</label><br>
								<input type="radio" name="genre" id="informatique" value="informatique"><label for="informatique" class="legende">Informatique</label><br>
								<input type="radio" name="genre" id="sante" value="sante"><label for="sante" class="legende">Sant&eacute;</label><br>
								<input type="radio" name="genre" id="spiritualite" value="spiritualite"><label for="spiritualite" class="legende">Spiritualit&eacute;</label><br>
								<input type="radio" name="genre" id="cuisine" value="cuisine"><label for="cuisine" class="legende">Cuisine</label><br>
								<input type="radio" name="genre" id="bricolage" value="bricolage"><label for="bricolage" class="bricolage">Bricolage</label><br>
								<input type="radio" name="genre" id="nature" value="nature"><label for="nature" class="legende">Nature</label><br>
								<input type="radio" name="genre" id="photo" value="photo"><label for="photo" class="legende">Photo</label><br>
								<input type="radio" name="genre" id="bd" value="bd"><label for="bd" class="legende">Bande dessin&eacute;e</label><br>
								</td>
							</tr>
							
							<tr>
								<td>&nbsp;</td>							
							</tr>
							
							<tr>
								<td class="legende">
									<label for="autre_genre">Autre genre :&nbsp;</label><input type="text" name="autre_genre" id="autre_genre" size="30" class="champ">
								</td>
							</tr>							
							
						</table>
				</fieldset>
				
				<fieldset>
					<legend class="texte_fieldset">Fiche résumé</legend>
					<textarea name="resume" id="resume" rows="20" cols="110" class="champ">Faites ici un court résumé de votre livre</textarea>				
				</fieldset>	
			</td>
		</tr>	
				
		</tr>	
			<td>
			<input type="reset" name="reset" value="  Tout recommencer  " class="bouton_simple2">
			<input type="submit" name="submit" value="   Valider   " class="bouton_simple" onclick="test();">
			</td>		
		<tr>	
	</table>
	</form>
	</div>
</body>
</html>


Merci encore de bien vouloir m'aider à y voir plus clair (c'est dur de débuter).
Je pense que tu n'as pas bien compris le script que je t'ai donné, donc je vais te l'expliquer :

function verifRadio() 
    { 
        var radio=document.formulaire1.genre; // On récupère tout les éléments avec le nom genre
        var rlength=radio.length; // On compte le nombre d'éléments récupérés
        var oui=false;
        for (var z=0; z<rlength; z++) // Pour chaque élément portant le nom genre trouvé, on va vérifier si il a l'attribut checked
        { 
            if (radio[z].checked && champ!='')
            { 
                oui=true;  // Si il a l'attribut alors on met "vrai" dans la variable oui
            } 
        } 
        if (oui) 
        { 
            return true; // Si oui est vrai, donc si un élément à l'attribut checked on renvoi vrai
        } 
        else
        { 
            window.alert("Vous n'avez pas indiqué le genre du livre"); 
            return false; // Sinon message d'alert et on annule l'envoi du formulaire
        } 
    } 


Donc ce qu'il faut faire par exemple, au moment de vérifier si la variable oui est à "true", si c'est pas le cas ça passe dans le else et là tu vérifies si l'élément "autre_genre" est rempli (document.getElementById('autre_genre').value != "") puis tu renvoies "true" ou "false" + le message d'alert selon qu'il est rempli ou non
Un grand merci Natha pour tes explications très claires. Ça marche enfin comme je veux !

Sinon, j'ai encore un truc, c'est juste un détail pour peaufiner. J'ai un textarea avec un texte par défaut dedans pour dire à l'utilisateur d'écrire un résumé ou un commentaire. Je voudrais que lorsqu'il clique dans le champ textarea, le texte par défaut s'efface (pour l'instant il faut l'effacer à la main). J'ai bien un script pour ça sur les champs text :

<input type="text" value="Entrez votre titre ici" ........ onfocus="if(this.value=='Entrez votre titre ici'){this.value=''}">


mais voilà : la balise textarea ne prend pas l'attribut "value=". Aurais-tu une idée à tout hasard ?

Merci encore pour toute ton aide.
La valeur que tu veux vérifier "if(this.value=='blabla')" ne doit pas être trouvée dans le textarea, donc il s'efface pas, tu as quoi comme texte de base dans le textarea et quoi comme condition pour effacer le textarea?
Voici mon textarea :

<fieldset>
   <legend class="texte_fieldset">Fiche résumé</legend>
   <textarea name="resume" id="resume" rows="20" cols="110" class="champ">Faites ici un court résumé de votre livre</textarea>				
</fieldset>	


J'ai donc bien une valeur par défaut, mais il n'y a pas d'attribut "value=" comme dans les types "text". Donc je ne vois pas trop comment je pourrais adapter

<input type="text" value="Entrez votre titre ici" ........ onfocus="if(this.value=='Entrez votre titre ici'){this.value=''}"> 

à mon textarea ?
Merci pour ton aide précieuse.
Bonjour,
Si tu fais ceci par exemple, ça fonctionne, non?
<textarea rows="5" cols="20" onfocus="if(this.value=='Cliquez pour effacer!')this.value='';return false;">Cliquez pour effacer!</textarea>
Impeccable, ça fonctionne ! Merci beaucoup Iddsoft.

C'est vraiment un grand plaisir de communiquer avec vous tous sur ce forum.
Encore merci à Natha et à toi.

A +.
Bonjour à toutes et à tous,

j'ai repris l'analyse de ton programme Javascript que j'ai normalisé.

function test() 
{
	/*----------------------------*/
	/*     On analyse 'titre'     */
	/*----------------------------*/

	var Titre	= document.getElementById("titre");

	if (Titre.value == '') {
		Titre.value = prompt('Veuillez remplir le champ "Titre" :');
		return false;
	}

	/*-----------------------------*/
	/*     On analyse 'auteur'     */
	/*-----------------------------*/

	var Auteur	= document.getElementById("auteur");

	if (Auteur.value == '') {
		Auteur.value = prompt('Veuillez remplir le champ "Auteur" :');
		return false;
	}

	/*------------------------------*/
	/*     On analyse 'editeur'     */
	/*------------------------------*/

	var Editeur	= document.getElementById("editeur");

	if (Editeur.value == '') {
		Editeur.value = prompt('Veuillez remplir le champ "Editeur" :');
		return false; 
	}

	/*----------------------------*/
	/*     On analyse 'genre'     */
	/*----------------------------*/

	var Genre	= document.getElementsByName("genre");

	for (var z = 0; z < Genre.length; z++) { 
		if (Genre[z].checked)	return true; 
	} 

	/*----------------------------------*/
	/*     On analyse 'autre_genre'     */
	/*----------------------------------*/

	var Autre	= document.getElementById("autre_genre");

	if (Autre.value == '') {
		window.alert("Vous n'avez pas indiqué le genre du livre");  
		return false; 
	}

	return true;  
}     


1) tu n'es plus obligé de nommer ton formulaire (formulaire1).
2) tu n'as plus besoin de verifRadio car désormais test() le fait.
3) tu dois indiquer par un ID ou par un NAME les champs que tu désires analyser.
4) une seule fonction suffit pour analyser le formulaire.
5) il faut être précis et clair lorsque tu développes en JAVASCRIPT.

@+ Smiley smile
Modifié par Artemus24 (05 Jun 2011 - 14:18)
Merci beaucoup Artemus24.
Vu que je débute en JavaScript, j'ai encore plein de choses à apprendre, c'est sûr !
Salut sam06,

je suis plutôt débutant en HTML et CSS. Pour les langages, ça va, car je suis informaticien,mais j'ai quelques difficultés en Javascript car je n'ai pas encore compris toutes ses subtilités.

Sinon pour le code HTML, tu devrais éviter d'utiliser des tables, td, tr ... car cela alourdi considérablement. Essaye plutôt les 'div' pour le découpage et le reste, c'est à dire la présentation fait ça en CSS.

@+
Modifié par Artemus24 (12 Jun 2011 - 11:07)