11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je voulais savoir comment faire appraître un champs lorsqu'on choisit une option dans la balise select.

Sujet :<select name="objet" size="1" id="objet">
<option>demande d'informations</option>
<option>demande de partenariat</option>
<option>demande d'emploi</option>
<option>(autre)</option>
</select>


Dans mon cas j'aimerais qu'en choisissant "demande d'emploi" un champs <file> apparaisse.
Merci beaucoup par avance pour votre aide
chicadede
Je déplace dans le salon Javascript, vu que c'est ce langage qu'il faudra utiliser pour ce genre d'effet dynamique.
Salut chicadede,

Je pense que tu peux faire un truc dans ce style :
- créer déjà ton champ <file> dans le code HTML mais le masquer avec un {display:none} via Javascript <edit>(et non pas via CSS comme dit précédemment)</edit>
- changer ce display en inline (par exemple) lorsque "demande d'emploi" est selectionné
Concrètement, cela ressemblerait à ça :

HTML/CSS
<select name="objet" size="1" id="objet">
    <option value="info">demande d'informations</option>
    <option value="partner">demande de partenariat</option>
    <option value="job">demande d'emploi</option>
    <option value="other">(autre)</option>
</select>

<label for="inputFile" id="inputFileLabel">Label</label>
<input name="inputFile" id="inputFile" type="file" size="40">
<edit>Supprimé la balise style</edit>

JS
/*(une fois que le DOM est prêt)*/
document.getElementById("inputFile").style.display = "none";
document.getElementById("inputFileLabel").style.display = "none";
document.getElementById("objet").onchange = function(){
    document.getElementById("inputFileLabel").style.display =
        this.value == "job" ? "inline" : "none";
    document.getElementById("inputFile").style.display =
        this.value == "job" ? "inline" : "none";
};
<edit>Ajout : masquer l'input file et son label</edit>

A+
Modifié par marcv (13 Jun 2007 - 08:34)
Ah, toi tu débutes Smiley biggrin
Le javascript, ça se met en général dans une balise <script type="text/javascript">. Cette balise (tout comme les styles CSS) va dans le <head> de ton code HTML.
Ce dernier ressemblerait donc à ça avec l'exemple que je t'ai donné :
<head>
    <meta http-equiv="Content-Type" ....>
    <title>......</title>
    <style type="text/css">
        #inputFileLabel, #inputFile {display:none;}
    </style>
    <script type="text/javascript">
        window.onload = function() {
        document.getElementById("inputFile").style.display = "none";
        document.getElementById("inputFileLabel").style.display = "none";
            document.getElementById("objet").onchange = function() {
                document.getElementById("inputFileLabel").style.display =
                    this.value == "job" ? "inline" : "none";
                document.getElementById("inputFile").style.display =
                    this.value == "job" ? "inline" : "none";
            };
        }
    </script>
</head>
<edit>Ajout : masquer l'input file et son label</edit>

Je t'ai rajouté un window.onload dans le script. Ça évitera peut-être que tu nous dises demain que ça marche pas Smiley lol Je ne l'avais pas mis à l'origine ne sachant pas (1) si ton window.onload était déjà occupé (2) si tu utilisais plus un truc style onDOMReady, mais bon, tu nous diras si c'est le cas.

Bon courage Smiley smile
Modifié par marcv (07 Jun 2007 - 09:52)
D'accord ok pas besoin de le dire ça se voit que je débute. Disons que le CSS et le XHTML ça va mais le javascript j'y connais rien du tout.
J'ai juste mis du javascript dans mon formulaire pour la vérification mais je savais pas si ça se placer toujours au même endroit autrement dit dans le <head> en tout cas c'est très gentil pour ton aide je dirais ça demain si ça fonctionne ou pas.
Hum, en me relisant, je vois que j'ai dit une petite bêtise dans mon premier post :
marcv a écrit :
créer déjà ton champ <file> dans le code HTML mais le masquer en CSS (display:none)
Non, il faut le masquer en JS. Si ton utilisateur a JS désactivé, le champ ne sera jamais visible (pas idéal). Donc oublie la balise <style> et ce qu'elle contient (j'ai modifié mes posts prédédents).

Toujours en me relisant, je me rends compte que si tu débutes totalement en JS, le code que je t'ai proposé n'est peut-être pas très compréhensible. Le but étant quand même de comprendre un peu ce qu'on fait Smiley smile , je l'ai modifié et commenté :
/* On crée un bout de code (une "fonction") auquel */
/* on donne un nom, pour pouvoir y faire référence */
/* plus tard. Cette fonction là vise à rendre ton  */
/* <select> sensible aux changements d'état        */
function rendSelectSensible() {
    /* On indique au script comment trouver le select */
    /* dans le document (par son attribut id puisque  */
    /* tu lui en as donné un), et on lui dit qu'en cas*/
    /* d'évènement "change", il doit exécuter le bout */
    /* de code (la fonction) nommé afficheCacheInput  */
    /* Puis on masque l'input file et son label       */
    document.getElementById("objet").onchange = afficheCacheInput;
    document.getElementById("inputFile").style.display = "none";
    document.getElementById("inputFileLabel").style.display = "none";
}

/* Cette fonction là a pour objet d'afficher ou de    */
/* cacher le <input type="file"> si le select est sur */
/* "demande d'emploi"                                 */
function afficheCacheInput() {
    /* Si l'<option> sélectionnée, dans le select, est "job" */
    if ( document.getElementById("objet").value == "job" ) {
        /* trouve les éléments "inputFile" et "inputFileLabel" */
        /* (le champ file ainsi que son label) et applique leur*/
        /* le style {display:inline} */
        document.getElementById("inputFile").style.display = "inline";
	document.getElementById("inputFileLabel").style.display = "inline";
    } else { /* Sinon (si l'<option> sélectionnée n'est pas "job") */
        /* applique leur le style {display:none} */
        document.getElementById("inputFile").style.display = "none";
	document.getElementById("inputFileLabel").style.display = "none";
    }
}
		
/* Lorsque le navigateur va lire la page web et arriver ici,   */
/* il n'aura pas encore créé le select et l'input file. (on est*/
/* encore dans le <head> de la page web). Il faut donc lui dire*/
/* d'éxécuter ton script seulement une fois que la page est    */
/* chargée (évenement "load").            */
window.onload = rendSelectSensible;

Ça paraît un gros paquet comme ça mais si tu vires les commentaires (tout ce qui est entre "/*" et "*/"), c'est tout petit :
function rendSelectSensible() {
    document.getElementById("objet").onchange = afficheCacheInput;
    document.getElementById("inputFile").style.display = "none";
    document.getElementById("inputFileLabel").style.display = "none";
}
function afficheCacheInput() {
    if ( document.getElementById("objet").value == "job" ) {
        document.getElementById("inputFile").style.display = "inline";
	document.getElementById("inputFileLabel").style.display = "inline";
    } else {
        document.getElementById("inputFile").style.display = "none";
	document.getElementById("inputFileLabel").style.display = "none";
    }
}
window.onload = rendSelectSensible;


A+
Modifié par marcv (07 Jun 2007 - 09:53)
Bonjour,

Cela fonctionne très bien et c'est compréhensible merci beaucoup.
C'est vrai que si on comprend bien l'anglais on comprend bien le javascript.
Encore merci pour le temps consacré.
Bonne journée Smiley cligne
Bonjour,

Ayant un prob. similaire, je commence par remercier marcv pour sa clarté. Mais je n'arrive pas à faire marcher l'engin pour un input type="radio"...
Voilà mon (java)script:

<script type="text/javascript">
function DisplayMore() {
    var lowrep = document.getElementById("LowRep");
    if (document.LaunchScript.RepLim.value == 10) {
    	if (lowrep.style.display == "none") { LR.style.visibility = "block"; }
    }
    else { lowrep.style.display = "none"; }
}
</script>

et voici mon formulaire.

<form name="LaunchScript" action="LRW_analyse.php" method="POST" enctype="multipart/form-data">
...
<b>Please choose a level of repetition:</b>
<table width="100%">
	<tr><td><input type="radio" name="RepLim" value="1" checked="checked"">Unique</td>
		<td><input type="radio" name="RepLim" value="10" onchange="DisplayMore();">Low Repetition 
			<select id="LowRep" name="LowRep" style="display: none">
				<option value="2">2</option>
				<option value="3">3</option>
				<option value="4">4</option>
				<option value="5">5</option>
				<option value="6">6</option>
				<option value="7">7</option>
				<option value="8">8</option>
				<option value="9">9</option>
				<option value="10">10</option>
			</select></td>
		<td><input type="radio" name="RepLim" value="25">Intermediary Repetition (10x to 25x)</td>
		<td><input type="radio" name="RepLim" value="1000000">High Repetition (> 25x)</td>
	</tr>
</table>

Je précise que je suis à peu près au niveau 0 en javascript. Mais je comprends pas pourquoi ça marche pas...
En fait si je mets par defaut qu'il soit affiché, au changement il disparait, mais ne réapparait plus. Et si par défaut je ne l'affiche pas, alors jamais il n'apparait...
Est-ce que je fais qq chose de mal, ou est-ce qu'il y a un pb pour faire ce genre de chose dans une table, ou est-ce du au type radio... Bref, si qq'un avait une petite suggestion... Smiley confus
Merci d'avance, bonne journée
Modifié par melilo07 (24 Jul 2007 - 15:49)
Je ne suis pas vraiment expert en javascript, mais je pense que c'est parce que tu as mis le style dans ton html :
<select id="LowRep" name="LowRep" style="display: none">

En fait une page html est lue de haut en bas, ligne par ligne. S'il voit à un moment : "la couleur de l'objet1 est rouge", puis quelques lignes plus bas : "la couleur de l'objet1 est verte" alors finalement l'objet aura une couleur verte.

Ici c'est le même principe puisqu'on lit le style="display: none" en dernier. C'est donc ce style qui sera pris en compte.

Donc pour faire court, il faut enlever ce style de là, et le mettre dans le javascript et avoir deux fonctions pour deux états : visible , pas visible. Et lorsque tu charges ta page, il faut lancer la fonction qui rend invisible.

Voilà j'espère que j'ai été assez clair Smiley ohwell
Bon courage à toi
Bonjour,

Peut-être que cela vient du fait que tu utilises :

{ LR.style.visibility = "block"; }


alors que LR ne se trouve pas dans ton code. Peut-être faudrait-il mettre à la place LowRep ?

edit : et je pense aussi qu'arnaudltp a raison
Modifié par rafale29 (24 Jul 2007 - 16:02)
ah oui, grave la honte Smiley confused , entièrement raison, les instructions de mes blocs étaient complètement incohérentes!! Je vais rectifier ça, et mettre en pratique le conseil d'arnaultp. Merci à vous 2!
Bon, bin... toujours pas...
En m'inspirant aussi du code de marcv, cette fois j'ai donc fait comme ça (pour l partie qui nous intéresse):
<html>
<body>
<script type="text/javascript">
function MakeInputSensitive() {
	document.getElementById("LowRep").style.display = "none";
	document.getElementById("RepLim").onchange = DisplayOrNot();
}
function DisplayOrNot() {
	var lowrep = document.getElementById("LowRep");
	if (document.LaunchScript.RepLim.value == 10) {
		if (lowrep.style.display == "none") { lowrep.style.display = "inline"; }
	}
	else { lowrep.style.display = "none"; }
}
 window.onload = MakeInputSensitive;
</script>

<form name="LaunchScript" action="LRW_analyse.php" method="POST" enctype="multipart/form-data">
<b>Please choose a level of repetition:</b>
<table width="100%">
	<tr><td><input type="radio" name="RepLim" value="1" checked="checked">Unique</td>
		<td><input type="radio" id="RepLim" name="RepLim" value="10">Low Repetition 
			<select id="LowRep" name="LowRep">
				<option value="2">2</option>
				<option value="3">3</option>
				<option value="4">4</option>
				<option value="5">5</option>
				<option value="6">6</option>
				<option value="7">7</option>
				<option value="8">8</option>
				<option value="9">9</option>
				<option value="10">10</option>
			</select></td>
		<td><input type="radio" name="RepLim" value="25">Intermediary Repetition (10x to 25x)</td>
		<td><input type="radio" name="RepLim" value="1000000">High Repetition (> 25x)</td>
	</tr>
</table>
</form>
</body>
</html>

Voilà, je suis à court... Smiley decu Si qq'un a la solution...
Merci d'avance, bon aprem
Modifié par melilo07 (25 Jul 2007 - 16:55)
bonjour,

j'arrive comme cela et je crois avoir compris, enfin j'espere Smiley sweatdrop essai avec cela pour me dire si c'est comme cela que tu le voulais.


<html>

<body>

<script type="text/javascript">

function MakeInputSensitive() {
	document.getElementById("LowRep").style.display = "none";
}

function DisplayOrNot(p) {
	var lowrep = document.getElementById("LowRep");
	if (p == 10) {
		lowrep.style.display = "inline"; 
	}
	else { lowrep.style.display = "none"; }
}
 window.onload = MakeInputSensitive;
</script>
<form name="LaunchScript" action="LRW_analyse.php" method="POST" enctype="multipart/form-data">
<b>Please choose a level of repetition:</b>
<table width="100%">
	<tr><td><input type="radio" id="RepLim" name="RepLim" value="1" checked="checked" onclick="DisplayOrNot(1)">Unique</td>
		<td><input type="radio" id="RepLim" name="RepLim" value="10" onclick="DisplayOrNot(10)">Low Repetition 
			<select id="LowRep" name="LowRep">
				<option value="2">2</option>
				<option value="3">3</option>
				<option value="4">4</option>
				<option value="5">5</option>
				<option value="6">6</option>
				<option value="7">7</option>
				<option value="8">8</option>
				<option value="9">9</option>
				<option value="10">10</option>
			</select></td>
		<td><input type="radio" id="RepLim" name="RepLim" value="25" onclick="DisplayOrNot(25)">Intermediary Repetition (10x to 25x)</td>
		<td><input type="radio" id="RepLim" name="RepLim" value="1000000" onclick="DisplayOrNot(1000000)">High Repetition (> 25x)</td>
	</tr>
</table>
</form>
</body>
</html>
Im-pec-cable! Smiley cligne
Magnifique, ça marche! Merci bien, en fait c'est dû à quoi?
C'est juste parce que la valeur doit être passée expressément, et la "sensibilité" du bouton mise dans l'html?...
Du coup d'ailleurs ça marche très bien sans la fonction 'MakeInputsensitive' et le 'onload', j'ai juste ajouté
style="display: none"
dans le select.
Merci bien en tout cas, bonne fin de journée!
Modifié par melilo07 (26 Jul 2007 - 16:31)