[Javascript] set handler dans une classe

set handler dans une classe [Javascript] - HTML/CSS - Programmation

Marsh Posté le 02-11-2005 à 17:08:46    

Alors voila j'ai cette classe javascript:

Code :
  1. function Test(){
  2.   this.newDiv = document.createElement('div');
  3.   //setting needed attribute for div
  4.   this.newDiv.setAttribute('id', 'div'+(++this.constructor.divMaxId));
  5.   //setting click handler on div with public method
  6.   this.newDiv.onmousedown=function(event) { publicGetId();}
  7.   //setting click handler on div with private method
  8.   this.newDiv.onmouseup=function(event) { privateGetId();}
  9.   //add text to node
  10.   this.newDiv.appendChild(document.createTextNode('div ayant pour id:'+this.constructor.divMaxId));
  11.   //add node to document
  12.   document.getElementById('divContainer').appendChild(this.newDiv);
  13.   // PRIVILEGED METHODS
  14.   this.privateGetId = function(){ alert(this.newDiv.getAttribute('id')); }
  15. }
  16. }
  17. // PUBLIC METHODS
  18. Test.prototype.publicGetId = function (){ alert(this.newDiv.getAttribute('id'));}
  19. // PROTOTYPE PROPERTY
  20. Test.divMaxId=0;  //max id of div


et cette page html pour tester:

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
  4. <head>
  5.   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6.   <meta name="author" content="Me" />
  7.   <meta name="keywords" content="" />
  8.   <meta name="description" content="" />
  9.   <meta name="robots" content="all" />
  10.   <title>Maquette</title>
  11.   <script type="text/javascript" src="Test.js"></script>
  12.   <script type="text/javascript" >
  13.   function doIt(){
  14.     var a = new Test;
  15.   }
  16.   </script>
  17.   <style type="text/css" media="all">
  18.   div{
  19.     background-color: blue;
  20.     border: 1px solid black;
  21.   }
  22.   </style>
  23. </head>
  24. <body>
  25. <input type="button" onclick="doIt()" value="test"/>
  26. <div id="divContainer" style="border:0px;"> <!-- usefull for adding new div nodes --> </div>
  27. </body>
  28. </html>


 
La construction des objets Test se passe très bien.
Le problème se trouve sur les handlers que je rajoute sur chacun d'eux:

Code :
  1. ...
  2.   //setting click handler on div with public method
  3.   newDiv.onmousedown=function(event) { publicGetId();}
  4.   //setting click handler on div with public method
  5.   newDiv.onmouseup=function(event) { privateGetId();}
  6.   ...


 
Dans les deux cas ( et aussi bien sous FF que IE ) les fonctions ne sont pas connues.
Je pense savoir pourquoi: les deux fonctions publicGetId et privateGetId ne sont connues que des objets Test. Or elles sont appelées par un click sur le div crée et non sur mon objet, donc ... ça marche pô!!!
 
D'ou ma question: Y a-t-il un moyen d'appeler des fonctions de ma classe dans ces handlers ou dois-je obligatoirement déclarer ces fonctions en dehors de ma classe ( ce qui ne me plairait pas trop)?
 
D'avance merci!
 
[edit: commentaires ajoutés]


Message édité par anapajari le 02-11-2005 à 17:45:31
Reply

Marsh Posté le 02-11-2005 à 17:08:46   

Reply

Marsh Posté le 02-11-2005 à 18:29:50    

Bonjour,
Normallement, il n'y a pas de problèmes pour utiliser les handlers dans un objet ...
Essaye de faire l'assignation de l'handler après avoir ajouté le noeud au document (this.newDiv.onmousedown=function(event) { publicGetId();} après  
document.getElementById('divContainer').appendChild(this.newDiv); )
 
sinon, avec cette méthode, tu risque de ne pas récupérer l'event, voici un exemple de ce que j'utilise:

Code :
  1. this._inputField.onkeyup=function(){getKeyEvent(event)};//pour IE
  2. this._inputField.onkeyup=function(e){getKeyEvent(e)};//Pour Gecko


 
Sinon, va faire un tour dans sur le site http://www.quirksmode.org/ rubrique Javascript/event, tu y trouvera une foule d'information pour t'aider ...


Message édité par fxoxo le 02-11-2005 à 18:30:28

---------------
stpfilms.free.fr
Reply

Marsh Posté le 03-11-2005 à 09:48:33    

D'abord merci mais ;)
 
Je n'ai pas dit qu'il y avait un problème pour utiliser un handler dans mon objet mais plutot pour utiliser une méthode de mon objet dans le handler ...
 
En gros mon problème c'est que quand je déclare la fonction de mon handler, le 'this' que j'y mets ne represente pas l'objet de ma classe Test mais l'objet (div) sur lequel l'event a lieu.
Donc fort logiquement il me sort que la fonction publicGetId est inconnue.
 
[edit]
Ah et mettre le handler après que le div ait été ajouté cela ne change rien  
[/edit]


Message édité par anapajari le 03-11-2005 à 09:49:52
Reply

Marsh Posté le 03-11-2005 à 10:21:35    

J'ai trouvé une solution pour ceux que ça interesseraient:
 

Code :
  1. function Test(){
  2.   this.newDiv = document.createElement('div');
  3.   //setting needed attribute for div
  4.   this.newDiv.setAttribute('id', 'div'+(++this.constructor.divMaxId));
  5.   //add text to node
  6.   this.newDiv.appendChild(document.createTextNode('div ayant pour id:'+this.constructor.divMaxId));
  7.   //add node to document
  8.   document.getElementById('divContainer').appendChild(this.newDiv);
  9.  
  10.    /*** la ruse est ici: on recopie l'objet en cours de creation pour pouvoir appeler ses methods dans le handler.
  11.   on ne peut pas se servir dans this dans le handler car cela serait l'objet cliqué et non l'objet de ma classe
  12. ***/
  13.   var obj = this;
  14.  
  15.   //setting click handler on div with public method
  16.   this.newDiv.onmousedown=function(event) { obj.publicGetId();}
  17.   //setting click handler on div with private method
  18.   this.newDiv.onmouseup=function(event) { obj.privateGetId();}
  19.   // PRIVILEGED METHODS
  20.   this.privateGetId = function(){ alert(this.newDiv.getAttribute('id')); }
  21. }
  22. // PUBLIC METHODS
  23. Test.prototype.publicGetId = function (){ alert(this.newDiv.getAttribute('id'));}
  24. // PROTOTYPE PROPERTY
  25. Test.divMaxId=0;  //max id of div


Message édité par anapajari le 03-11-2005 à 10:22:09
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed