Tom's Guide > Forum > Programmation > [résolu] Javascript objet et évènements

[résolu] Javascript objet et évènements

Forum Programmation : [résolu] Javascript objet et évènements

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

Bonjour !

Voila un bon moment qu'en tant que développeur web je travaille avec le langage Javascript mais je ne m'étais encore jamais intéressé à la création de la classe.
J'ai donc essayer de chercher quelques tutos sur le net mais j'avoue que je suis un peux pommé...

Pour créer ma classe j'utilise le framework Prototype.js ainsi :

Code :
  1. var MaClasse = Class.create();
  2. MaClasse.prototype = {
  3.     initialize: function (arg) {
  4.         this.attribut = arg;
  5.     }
  6.     methode: function (id) {
  7.         new Event.observe(id, 'click', function (e) {
  8.             this.attribut = id;
  9.         });
  10.     }
  11. }



J'ai fait un exemple très simple qui ne fonctionne pas juste pour illustrer le problème : ma ligne "this.attribut = id;" dans la méthode "methode" ne fonctionne pas tout simplement car le "this" ne se réfère plus à mon objet de la classe MaClasse mais à l'objet Event...

Est-ce que quelqu'un saurait comment remédier à ce problème ?

Merci pour vos réponse !

PS : J'ai dû éditer le message car, réflexe de développeur, j'ai voulu indenter mon code en appuyant sur tabulation et ça m'a envoyé le focus sur le bouton "Valider" -__-" et ensuite j'ai dû appuyer sur une mauvaise touche...


Message édité par Bioteck le 20-02-2009 à 14:20:22
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Salut,

Je vois pas trop ce que tu veux faire avec ta méthode là en fait...
Je vois pas ton but final.

------------------------------ Les dessins des seins ou les desseins des saints ?
Répondre à OmaR

En faisant quelques recherches, j'ai fini par trouver un post sur Alsacréation traitant d'exactement le même problème :

http://forum.alsacreations.com/top [...] ments.html

Pour être plus précis, ce que je cherche à faire c'est l'affichage de villes dans une liste déroulante en fonction d'un code postal saisit dans un champ texte, et tout ça en programmation objet (pour tout simplement pouvoir gérer plusieurs objets).

Grâce à l'exemple posté sur Alsacréation j'ai réussis à trouver une solution à mon problème.
Voilà donc ce que donne cette classe :

Code :
  1. var CityList = Class.create();
  2. CityList.prototype = {
  3.     //Méthode d'initialisation ; constructeur de la classe
  4.     initialize: function (idContainer, idCode, idList) {
  5.         //Création des attributs
  6.         this.container = $(idContainer);
  7.         this.code = $(idCode);
  8.         this.idList = idList;
  9.         this.value = null;
  10.         //Cette ligne permet d'initialiser le conteneur avec une liste vide uniquement si celle-ci n'existe pas déjà !
  11.         !$(idList) ? this.reset() : false;
  12.         //On récupère l'objet dans une variable pour les listeneurs
  13.         var o = this;
  14.         //----------------------------------------------------
  15.         // Gestion des évènements sur le champ du code postal
  16.         //----------------------------------------------------
  17.         //Touche de clavier pressée
  18.         Event.observe(this.code, 'keydown', function (e) {
  19.             var c = this.prototype = CityList.prototype;
  20.             c.actionOnKeyboard(Event.element(e), o, true);
  21.         });
  22.         //Touche de clavier relevée
  23.         Event.observe(this.code, 'keyup', function (e) {
  24.             var c = this.prototype = CityList.prototype;
  25.             c.actionOnKeyboard(Event.element(e), o, false);
  26.         });
  27.         //----------------------------------------------------
  28.     },
  29.     //Action sur le clavier
  30.     actionOnKeyboard: function (el, o, onPress) {
  31.         //Si l'on est en train de presser la touche...
  32.         if (onPress)
  33.             // on mémorise la valeur du champ code postal
  34.             o.value = el.value;
  35.         else
  36.             //... sinon (touche relevé), on affiche la liste de villes
  37.             o.display(el.value);
  38.     },
  39.     //Affichage de la liste des villes ; requête AJAX au serveur
  40.     display: function (v) {
  41.         //Le "v != this.value" permet de vérifier si la valeur du code postal au moment du relachement de la touche du clavier est bien différente de celle mémorisée au moment de la pression, c'est à dire si la valeur du champ a bien changé entre les deux actions (par ex. si l'on avait appuyé sur SHIFT, il n'y aurait pas eu de changement et on enverrait une requête au serveur pour rien...)
  42.         //Le reste sert à vérifier si le code postal est bien valide
  43.         if (v != this.value) {
  44.             if (v.match(/^[0-9]{3,4}0$/) && parseInt(v) >= 1000 && parseInt(v) <= 95880) {
  45.                 //En attendant la réponse du serveur, un loader remplace la liste déroulante dans le conteneur
  46.                 this.container.innerHTML = '<img src="image/loader.gif" alt="Loading" />';
  47.                 //Envoi d'une requête AJAX à un fichier PHP permettant de récupérer les villes correspondant au code postal saisit (la liste des villes est stockée dans une base de données)
  48.                 new Ajax.Updater(this.container.id, 'getCityList.php', {
  49.                     method: 'post',
  50.                     postBody: 'code=' + v + '&id_list=' + this.idList + '&ajax=1'
  51.                 });
  52.             }
  53.             else
  54.                 this.reset();
  55.         }
  56.     },
  57.     //Réinitialisation du conteneur (liste déroulante vide et désactivée)
  58.     reset: function () {
  59.         this.container.innerHTML = '<select id="' + this.idList + '" disabled="disabled"><option></option></select>';
  60.     }
  61. }


La partie qui me posait problème est celle où l'élément (champ de texte code postal) devait interagir avec l'objet de la classe CityList correspondant. En bref, toute la partie que j'ai commenté "Gestion des évènements sur le champ code postal".
J'avoue ne pas avoir très bien saisie la ligne "var c = this.prototype = CityList.prototype" mais je sais qu'elle joue un grand rôle dans la solution au problème ^^

En fin de compte je m'aperçois que le titre que j'ai mis au sujet n'est pas très adapté... "Javascript objet et les évènements" aurait été plus proche du problème mais tant pis...

En espérant que ce sujet puisse resservir à d'autres ! (le Javascript orienté objet est assez délicat)


Message édité par Bioteck le 21-02-2009 à 16:05:58
Répondre à Bioteck

Citation :

J'avoue ne pas avoir très bien saisie la ligne "var c = this.prototype = CityList.prototype" mais je sais qu'elle joue un grand rôle dans la solution au problème ^^

 

Je suppose que l'on doit pouvoir remplacer

Code :
  1. var c = this.prototype = CityList.prototype;
  2. c.actionOnKeyboard(Event.element(e), o, true);


par

Code :
  1. CityList.prototype.actionOnKeyboard(Event.element(e), o, true);
 

C'est juste pour avoir accès au prototype de ta classe depuis l'évènement, car comme tu l'avais vu this.prototype te retournait les propriétés de ton évènement et pas de ta classe.

 
Citation :

le Javascript orienté objet est assez délicat


Ah ça... :)


Message édité par OmaR le 20-02-2009 à 19:56:13
------------------------------ Les dessins des seins ou les desseins des saints ?
Répondre à OmaR

Citation :


Je suppose que l'on doit pouvoir remplacer

Code :
  1. var c = this.prototype = CityList.prototype;
  2. c.actionOnKeyboard(Event.element(e), o, true);



par

Code :
  1. CityList.prototype.actionOnKeyboard(Event.element(e), o, true);





En effet, ça fonctionne tout aussi bien comme ça. Merci Omar pour cette précision :)

Sinon, j'ai édité le script car il y avait quelques petites erreurs de syntaxe et d'algorithme (j'avais pas le script sur moi au moment où j'ai posté donc j'ai tout retaper de tête ^^" )

Répondre à Bioteck

En tout cas c'est sympa de revenir poster les réponses que tu as pu trouver.
Désolé de pas avoir pu t'aider. :)

------------------------------ Les dessins des seins ou les desseins des saints ?
Répondre à OmaR
Tom's Guide > Forum > Programmation > [résolu] Javascript objet et évènements
Aller à :

Il y a 278 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens