Voilà quand même un dernier exercice plus dur, qui demande un peu plus de temps. Nous allons utiliser ici l'insertion d'événements dynamiques. Si vous arrivez à le faire, il ne vous manquera plus qu'un peu de pratique pour faire des sites dynamiques et pratiques.
Dernier exercice : Créer un formulaire avec des champs
text qui s'ajoutent et se suppriment à volonté (attention : il faut bien supprimer le bon formulaire), ainsi qu'une liste déroulante qui proposera un choix parmi
n valeurs (
n étant le nombre de champs
text), ces valeurs étant le contenu des champs de texte.
Voici pour ceux qui veulent un
exemple.
Voilà une liste de quelques indices, et ce dont vous aurez besoin (je ne vous en ai pas parlé) :
Code : JavaScript | var balise = document.getElementById("option");
var value = balise.getAttribute("attribut");//récupère la valeur d'un attribut
|
Quand vous avez un
node pointant sur un
input, vous pouvez récupérer la valeur se trouvant dans le champ dynamiquement (en effet : on ne peut pas utiliser
getAttribute("value").
Code : JavaScript | var input = document.getElementById("option");
var contenu_champ = input.value;
|
Pour récupérer ce que vaut un
node text, il vous faut procéder ainsi :
Code : JavaScript | var texte = document.getElementById("my_paragraphe").firstChild;
var contenu = texte.nodeValue;
//On peut également modifier la valeur d'un textNode ainsi :
var text.nodeValue = "Nouveau texte";
|
Et enfin, une fonction qui peut vous être utile :
Code : JavaScript | var texte = "Balise 2"
var numero = texte.split(" "); //numero devient alors un tableau qui contient les bouts de phrases de texte séparés par des " "
|
On aura donc
numero[0] qui vaut "
Balise" et
numero[1] qui vaut "
2".
Secret (cliquez pour afficher)
Code : HTML 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | <p id="testbox">If you see information appearing in the current box when you click in a text field javascript is enabled on your computer</p>
<div class="javascript">
<form action="test.html" method="post">
<fieldset id="zone_text">
<p class="lien" onClick="javascript:add()">Ajouter un champ texte</p><br />
</fieldset>
<fieldset id="liste_deroulante">
<select name="liste">
</select>
<input type="submit" value="Valider" /><br /><br />
</fieldset>
</form>
</div>
<script type="text/javascript">
add();
</script>
|
Code : JavaScript 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100 | function refresh(event){
//On sélectionne le premier et le deuxième fieldset
var liste = document.getElementById("liste_deroulante");
var text_fieldset = document.getElementById("zone_text");
//On récupère la position de notre champ texte
var node_source = (document.all)?event.srcElement:event.target;
var position = node_source.previousSibling.nodeValue.split(" ")[1];
//On récupère la valeur dans la champ texte
var labels = text_fieldset.getElementsByTagName("label");
var label = labels[position-1];
var input = label.getElementsByTagName("input")[0];
//On met à jour la liste déroulante
var option = liste.getElementsByTagName("option")[position-1];
option.firstChild.nodeValue = input.value;
}
function del(event){
//on sélectionne le premier fieldset et on récupère tous les label qu'il y a à l'intérieur
var text_fieldset = document.getElementById("zone_text");
var labels = text_fieldset.getElementsByTagName("label");
//On récupère le noeud qui émet l'évènement et sa position grâce au texte Valeur x
var node_source = (document.all)?event.srcElement:event.target;
var position = node_source.previousSibling.firstChild.nodeValue.split(" ")[1];
//On décale d'un cran inférieur tous les éléments situés après l'élément à supprimer
for(var i=position;i<labels.length;i++){
var label = labels[i];
var input = label.getElementsByTagName("input")[0];
input.setAttribute("name","nom"+i);
label.firstChild.nodeValue = "Valeur "+i+" ";
}
//Suppression de la zone de texte, du lien et du saut de ligne
var label = labels[position-1];
var lien = label.nextSibling;
var br = lien.nextSibling;
text_fieldset.removeChild(label);
text_fieldset.removeChild(lien);
text_fieldset.removeChild(br);
//Suppression de l'élément d'option
var liste = document.getElementById("liste_deroulante");
var select = liste.getElementsByTagName("select")[0];
var option = select.getElementsByTagName("option")[position-1];
select.removeChild(option);
}
function add(){
//On compte le nombre de label et on sélectionne le premier fieldset
var count = document.getElementsByTagName("label").length;
var text_fieldset = document.getElementById("zone_text");
count ++;
//création du label( <label>Valeur x <input type="text" name="nomx" value="" /></label>)
var input = document.createElement("input");
input.setAttribute("type","text");
input.setAttribute("name","nom"+count);
input.setAttribute("value","");
if(document.all) input.attachEvent("onkeyup",refresh);
else input.addEventListener("keyup",refresh,true);
var nom_label = document.createTextNode("Valeur "+count+" ");
var label = document.createElement("label");
label.appendChild(nom_label);
label.appendChild(input);
//Création des élement br et p ( <p class="lien">Supprimer</p><br /> )
var br = document.createElement("br");
var del_text = document.createTextNode("Supprimer");
var lien_del = document.createElement("p");
lien_del.setAttribute("class","lien");
lien_del.setAttribute("className","lien");
if(document.all) lien_del.attachEvent("onmouseup",del);
else lien_del.addEventListener("mouseup",del,true);
lien_del.appendChild(del_text);
//On raccroche ici tous nos éléments virtuels à une balise de notre fichier XHTML. Ils sont alors affichés
text_fieldset.appendChild(label);
text_fieldset.appendChild(lien_del);
text_fieldset.appendChild(br);
//Ajout d'un élément d'option vide dans notre liste ( <option value=""></option> )
var liste = document.getElementById("liste_deroulante");
var select = liste.getElementsByTagName("select")[0];
var option = document.createElement("option");
var texte = document.createTextNode("");
option.setAttribute("value","nom"+count);
option.appendChild(texte);
select.appendChild(option);
}
|