Projet

Général

Profil

Javascript » Historique » Version 5

Anonyme, 17/03/2009 20:55
Ajout du gestionnaire d'évènements

1 1
On se propose d'expliquer les principales fonctions javascript déjà développées dans Gepi.[[BR]]
2
[[BR]]
3
----
4
== Utiliser Prototype ==
5
[[BR]]
6 2
Prototype est une librairie qui simplifie beaucoup le codage javascript. Elle est utilisée, entre autre, pour les requête ajax dans certains cas.[[BR]]
7 1
[[BR]]
8 2
* '''Ajax.request(url, options)'''[[BR]][[BR]]
9 1
10 2
Cet objet gère toute la requête Ajax en s'occupant de la compatibilité avec le navigateur de l'utilisateur et de l'envoie de la requête (pas besoin de send() dans le code par exemple).[[BR]] L'objet Ajax.Request a besoin de deux arguments : l'url et un tableau associatif d'options.[[BR]]
11 4
Ces options sont multiples et ont un comportement par défaut. La première 'asynchronous' (=true par défaut) est le mode de synchronisation de la requête, donc pas la peine de la préciser puisque la plupart des requêtes ajax sont asynchrones. La seconde, 'method' (=post) peut valoir 'get' alors que les troisième et quatrième options sont 'parameters' pour les requêtes en get et 'postbody' pour les requêtes en post.[[BR]]
12 2
[[BR]]
13
* Exemple :[[BR]]
14
[[BR]]
15
{{{
16 3
        // On indique l'url qui va recevoir et gérer la réponse de la requête
17
        // on peut passer le gepiPath en appel de la fonction si on veut
18
19
    var url = path+'./lib/change_mode_header.php';
20
21 2
        // On précise que les options sont un tableau associatif
22 3
23 2
    options = new Object();
24 3
25 2
        // On indique le nom de l'argument à envoyer en post (ici cacher_header)  
26 4
        // ainsi que sa valeur (ici mode qui est précisé dans l'appel de la fonction)
27 3
28 2
    options = {postBody: 'cacher_header='+mode};
29 3
30 1
        // et on construit l'objet ajax.Request qui s'occupe de tout 
31 3
32 2
    var requeteAjax = new Ajax.Request(url,options);
33
}}}
34 1
35
Cette portion de code suffit à définir une requête de type ajax avec des arguments envoyés en 'post'.[[BR]]
36
[[BR]]
37 4
  A noter qu'il existe des méthodes utilisables directement dont la plus utile est certainement responseIsFailure qu'on peut coupler sur l'option onComplete qui permet de définir l'appel d'une fonction quand la requête est en "réception terminée" (équivalent au test de readyState) pour envoyer une réponse adaptée s'il y a une erreur (cas par exemple d'un serveur qui ne répond pas parce qu'en panne ou sans électricité).[[BR]]
38
[[BR]]
39 1
40 4
[[BR]]
41
42
43 1
* '''Ajax.Updater'''[[BR]]
44 4
[[BR]]
45
  Ajax.Updater permet de modifier des portions de page html en utilisant Ajax. Dans l'exemple suivant, on voit comment est construit cet objet avec un troisième argument qui désigne l'élément qui sera modifié (elementHTML dans cet exemple). A noter qu'avec prototype, cet argument peut être le nom de l'identifiant (id) ou l'élément lui-même. Il existe aussi une option qui peut être pratique, c'est insertion (=undefined) qui permet de préciser à quel endroit javascript doit faire l'ajout renvoyé par le php :[[BR]]
46
  ||''default''||l'insertion a lieu dans l'élément, à la place du contenu précédent.||
47
  ||Insertion.Bottom||l'insertion a lieu dans l'élément, juste après le contenu déjà présent.||
48
  ||Insertion.Top||l'insertion a lieu dans l'élément, juste avant le contenu déjà présent.||
49
  ||Insertion.After||l'insertion a lieu après l'élément.||
50
  ||Insertion.Before||l'insertion a lieu avant l'élément.||
51
[[BR]]
52
Exemple :[[BR]]
53
[[BR]]
54
{{{
55
function couleursEdtAjax(id, reglage){
56 1
57 4
		elementHTML = document.getElementById(id);
58
	var url = "ajax_edtcouleurs.php";
59
	o_options = new Object();
60
	o_options = {method: 'get', parameters: 'var1='+id+'&var2='+reglage};
61
	var laRequete = new Ajax.Updater(elementHTML,url,o_options);
62
}
63
}}}
64
[[BR]]
65
  A noter aussi que l'on peut préciser deux sorties à cet objet (succès et échec) en précisant les propriétés success et failure de l'objet.[[BR]]
66
[[BR]]
67
Exemple :[[BR]]
68
[[BR]]
69
{{{
70
71
    // on indique à l'objet ce qu'il doit faire : si la requête est un succès, 
72
    // on met à jour elementHTML sinon on met à jour encasderreur (qui peut être identique  au précédent)
73
    // On peut alors définir un lieu dans la page avec un élément xhtml qui a un id="encasderreur" qui recevrait tous les messages d'erreur
74
    var laRequete = new Ajax.Updater({success: elementHTML, failure: 'encasderreur'},url,o_options);
75
}}}
76
77
78
* '''Ajax.!PeriodicalUpdater'''[[BR]]
79
[[BR]]
80
  C'est le même objet que le précédent sauf qu'il se débrouille tout seul avec deux options supplémentaires : 'frequency' (=2) qui détermine le nombre de secondes qui séparent deux appels et 'decay' (=1) qui permet d'allonger la 'frequency' si deux réponses qui se suivent sont identiques (la 'frequency' suivante étant alors égale à frequency x decay). Cette option permet de ne pas alourdir le serveur de requêtes inutiles si les réponses sont identiques (cas d'un tchat sans échange). A noter que 'decay' repasse à 1 quand une réponse différente arrive... et ainsi de suite.[[BR]]
81
[[BR]]
82
83
* '''les fonctions de base'''[[BR]]
84
[[BR]]
85
  * $ permet de récupérer un élément de la page par son id. Donc $('id') récupère la même chose que document.getElementById('id').[[BR]]
86
  * $F fait la même chose pour un formulaire :[[BR]]
87
{{{
88
function ajaxAppreciations(eleveperiode, enseignement, textId){
89
90
	// On récupère le contenu du textarea dont l'id est textId
91
	var contenu = $F(textId);
92
[...]
93
}}}
94 5
[[BR]]
95
* '''Créer un gestionnaire d'évènement avec Prototype'''[[BR]]
96
[[BR]]
97
  * Mettre en place un gestionnaire de ce type permet de dissocier le code javascript du code (x)html de la page. Une fonction écoute les évènements de la page pour les envoyer à une fonction qui traite ces évènements.
98
  * On peut ainsi écouter le click de la souris, le fait d'appuyer sur une touche,...
99
  * La fonction observeur() doit être chargée dans le onload.
100
  * Voici un exemple de code qui permet de récupérer ce dont on a besoin pour traiter les évènements de la page. On écoute le clic et le onblur sur des champs de formulaire.
101
  * Le principe d'un écouteur est Event.observe(quoi, type, fonction_appelee). Quoi étant le lieu de la page que l'on veut écouter, type étant le type d'évènement.
102
  * On peut récupérer (Event.element(event)) le tagname, le name, l'id, la valeur, ...de l'objet html.
103
  * L'analyse de l'information peut se faire côté server ou côté client (voire les deux).
104
{{{
105
# javascript
106 1
107 5
function observeur(){
108
  Event.observe(document, 'click', voirElementHTML);
109
  Event.observe(document, 'onblur', voirElementHTML);
110
}
111
function voirElementHTML(event)	{
112
  var elementCliquer = Event.element(event);
113
  var premierSelectCliquer = Event.findElement(event,"select") ? Event.findElement(event,"select") : null;
114
  var affPremierSelectCliquer = premierSelectCliquer ? premierSelectCliquer.name : 'aucun';
115
  var aff = ('<br />'+elementCliquer.tagName+' et la valeur --> '+elementCliquer.value+' et le name --> '+elementCliquer.name+' et le select --> '+affPremierSelectCliquer+' et id='+elementCliquer.id);
116
  var insertion = new Insertion.After("aff_result",aff);
117
118
  if (elementCliquer.id == 'p'){
119
    Effect.BlindDown('d1');
120
  }else if(elementCliquer.id == 'span'){
121
    Effect.BlindUp('d1');
122
  }else if(elementCliquer.tagName == 'TH'){
123
    if (elementCliquer.id == 'c1'){
124
      utiliseAjaxAbs('aff_result', 'des fraises', 'ajax.php');
125
    }
126
  }else if(elementCliquer.id.substr(0, 6) == 'fermer'){
127
    var idUt = elementCliquer.id.substr(6, 20);
128
    cacherDiv(idUt);
129
    utiliseAjaxAbs('tbody1', 'des nefles', 'ajax2.php')
130
  }
131
}
132
}}}
133 1
134
----