evenements javascript

Invité
Invité n'ayant pas de compte PHPfrance

18 août 2010, 09:23

Bonjour,

Je travaille dans une classe javascript assez complexe, je vais essayer de ne montrer que l'essentiel pour ma question.
La classe en question définit une liste d'événements comme ceci:
  this.events = {

    // handlers for sound events as they're started/stopped/played

    play: function() {
      pl.removeClass(this._360data.oUIBox,this._360data.className);
      this._360data.className = pl.css.sPlaying;
      pl.addClass(this._360data.oUIBox,this._360data.className);
	  self.fanOut(this);
    },

    stop: function() {
      pl.removeClass(this._360data.oUIBox,this._360data.className);
      this._360data.className = '';
	  self.fanIn(this);
    },

    pause: function() {
      pl.removeClass(this._360data.oUIBox,this._360data.className);
      this._360data.className = pl.css.sPaused;
      pl.addClass(this._360data.oUIBox,this._360data.className);
    },

    resume: function() {
      pl.removeClass(this._360data.oUIBox,this._360data.className);
      this._360data.className = pl.css.sPlaying;
      pl.addClass(this._360data.oUIBox,this._360data.className);      
    },

    finish: function() {
      pl.removeClass(this._360data.oUIBox,this._360data.className);
      this._360data.className = '';
      // self.clearCanvas(this._360data.oCanvas);
      this._360data.didFinish = true; // so fan draws full circle
	  self.fanIn(this);
      if (pl.config.playNext) {
        var nextLink = (pl.indexByURL[this._360data.oLink.href]+1);
        if (nextLink<pl.links.length) {
          pl.handleClick({'target':pl.links[nextLink]});
        }
      }
    },
Ces événements se déclenchent quand on clique sur un bouton et ça fonctionne très bien.
Après avoir créé un objet à partir de cette classe, lorsqu'on clique sur le bouton, la fonction de l'événement déclenché s'affiche

Exemple:
alert(MonObjet.events.pause);
m'affiche bien la fonction qui a été exécutée:

function() {
pl.removeClass(this._360data.oUIBox,this._360data.className);
this._360data.className = pl.css.sPaused;
pl.addClass(this._360data.oUIBox,this._360data.className);
}

Ma question: comment détecter le nom de l'événement qui a été déclenché, au lieu d'en afficher la fonction?
En gros, comment savoir si l'événement est play, stop, finish...

Merci pour vos réponses

ViPHP
ViPHP | 3607 Messages

18 août 2010, 09:36

Bonjour,
comment sont appelées les méthodes de ta classe?
Et à quelle endroit souhaite tu savoir celle qui a été appelée

Invité
Invité n'ayant pas de compte PHPfrance

18 août 2010, 09:48

Bonjour,

Merci beaucoup pour cette réponse rapide.
Voici un aperçu complet de la structure de la classe. Il n'y a pas tout, juste des morceaux représentatifs pour voir comment la classe est constituée:
function ThreeSixtyPlayer() {
//initialisation de divers paramètres
  var self = this;
  var pl = this;
  var sm = soundManager; // soundManager instance
  var isIE = (navigator.userAgent.match(/msie/i));

  this.links = [];
  this.sounds = [];
  this.soundsByURL = [];

  this.config = {

    playNext: false,   // stop after one sound, or play through list until end
    autoPlay: false,   // start playing the first sound right away
    loadRingColor: '#bbbbbb', // how much has loaded
}

//définition de méthodes diverses
  this.addEventHandler = function(o,evtName,evtHandler) {
    typeof(attachEvent)=='undefined'?o.addEventListener(evtName,evtHandler,false):o.attachEvent('on'+evtName,evtHandler);
  }

  this.removeEventHandler = function(o,evtName,evtHandler) {
    typeof(attachEvent)=='undefined'?o.removeEventListener(evtName,evtHandler,false):o.detachEvent('on'+evtName,evtHandler);
  }

  this.hasClass = function(o,cStr) {
	return (typeof(o.className)!='undefined'?o.className.match(new RegExp('(\\s|^)'+cStr+'(\\s|$)')):false);
  }

  this.addClass = function(o,cStr) {
    if (!o || !cStr || self.hasClass(o,cStr)) return false;
    o.className = (o.className?o.className+' ':'')+cStr;
  }

  this.removeClass = function(o,cStr) {
    if (!o || !cStr || !self.hasClass(o,cStr)) return false;
    o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),'');
  }

//définition d'événements (extrait identique au post précédent
  this.events = {

    // handlers for sound events as they're started/stopped/played

    play: function() {
      pl.removeClass(this._360data.oUIBox,this._360data.className);
      this._360data.className = pl.css.sPlaying;
      pl.addClass(this._360data.oUIBox,this._360data.className);
	  self.fanOut(this);
    },

    stop: function() {
      pl.removeClass(this._360data.oUIBox,this._360data.className);
      this._360data.className = '';
	  self.fanIn(this);
    },

    this.init = function() {
      /**** code d'initialisation ***/
   }
}


Et pour utiliser cette classe, je fais ceci:
    //instanciation de la classe
    threeSixtyPlayer.init();

    //bouton qui déclenche les événements
    $('.p_playerbutton').click(function(){

		alert(threeSixtyPlayer.events.pause); //mon test qui affiche bien la fonction de l'événement délcenché. Je cherche à afficher le nom de la fonction plutôt que le contenu de la fonction

   });

ViPHP
ViPHP | 3607 Messages

18 août 2010, 09:51

bonjour,
pourquoi ne pas donner une valeur de retour à tes méthodes?
genre:

Code : Tout sélectionner

play: function() { pl.removeClass(this._360data.oUIBox,this._360data.className); this._360data.className = pl.css.sPlaying; pl.addClass(this._360data.oUIBox,this._360data.className); self.fanOut(this); return 'play'; },

Invité
Invité n'ayant pas de compte PHPfrance

18 août 2010, 09:58

Ben oui, suis-je bête...je pense que cette solution conviendra, merci encore
Donc si j'ai bien compris, il n'existe pas de solution simple pour récupérer le nom d'une fonction ou d'un événement qui vient d'être exécuté?

Invité
Invité n'ayant pas de compte PHPfrance

18 août 2010, 10:03

ok, j'ai rajouté le return 'pause' dans la fonction, mais comment je récupère cette valeur?

alert(threeSixtyPlayer.events.pause);

me renvoie toujours tout le code de la fonction qui a été déclenchée, plutôt que la valeur retournée par la fonction en question.

ViPHP
ViPHP | 3607 Messages

18 août 2010, 10:05

Je ne sais pas su tout si ce genre de chose est possible...
Après je n'arrive toujours pas à saisir l'intérêt de ta démarche...
étant donné que l'on sait quelle fonction est appelée, puisque tu l'écris "en dur"...?

une autre manière de faire si tu veux conserver les return pour une autre utilisation:

Code : Tout sélectionner

function ThreeSixtyPlayer() { //initialisation de divers paramètres var self = this; var pl = this; var sm = soundManager; // soundManager instance var isIE = (navigator.userAgent.match(/msie/i)); var this.lastFunctionCalled = ''; this.getLastFunctionCalled = function(){ return this.lastFunctionCalled; } //... play: function() { pl.removeClass(this._360data.oUIBox,this._360data.className); this._360data.className = pl.css.sPlaying; pl.addClass(this._360data.oUIBox,this._360data.className); self.fanOut(this); this.lastFunctionCalled = 'play'; },

ViPHP
ViPHP | 3607 Messages

18 août 2010, 10:11

ok, j'ai rajouté le return 'pause' dans la fonction, mais comment je récupère cette valeur?

alert(threeSixtyPlayer.events.pause);

me renvoie toujours tout le code de la fonction qui a été déclenchée, plutôt que la valeur retournée par la fonction en question.
Et si tu faits cela:

Code : Tout sélectionner

alert(threeSixtyPlayer.events.pause());//rajout de parenthèses
ou encore celà:

Code : Tout sélectionner

var funcName = threeSixtyPlayer.events.pause();//rajout de parenthèses alert(funcName);
?

Invité
Invité n'ayant pas de compte PHPfrance

19 août 2010, 10:49

tout va beaucoup mieux, merci beaucoup pour ton aide

ViPHP
ViPHP | 3607 Messages

19 août 2010, 10:50

Par curiosité, quelle solution as-tu retenu?
On peut voir le code final?