2010-01-18 3 views
16

Les objets Javascript simples peuvent-ils être associés à un événement? Dites quelque chose comme ceci:Les objets Javascript simples peuvent-ils avoir des événements?

obj = new Object(); 
obj.addEventListener('doSomething', foo, true); 

Je sais que je peux le faire avec jQuery, mais est-il possible sans bibliothèque?

+1

Wow, combien de réponses! – Skilldrick

+0

Qui appellerait de telles actions événementielles? – Gumbo

+1

Ouais ... Tellement, tellement vite! Merci les gens! @Gumbo dit que vous pouvez avoir quelque chose comme la bibliothèque xmpp et que vous pouvez déclencher des événements sur cet objet/lib (comme "connecté", "déconnecté", etc.). Et vous voulez que certaines actions soient exécutées quand l'événement se produit ... C'est pourquoi je pose des questions sur les événements. – NilColor

Répondre

9

Vous devrez implémenter votre propre fonctionnalité pour cela, mais ce n'est pas très difficile.

var obj = { 
    events: {}, 
    addEventListener: function(eventName, handler) { 
     if(!(eventName in this.events)) 
      this.events[eventName] = []; 

     this.events[eventName].push(handler); 
    }, 

    raiseEvent: function(eventName, args) { 
     var currentEvents = this.events[eventName]; 
     if(!currentEvents) return; 

     for(var i = 0; i < currentEvents.length; i++) { 
      if(typeof currentEvents[i] == 'function') { 
       currentEvents[i](args); 
      } 
     } 
    }, 

    click: function() { 
     // custom 'click' function. when this is called, you do whatever you 
     // want 'click' to do. and then raise the event: 

     this.raiseEvent('onClick'); 
    } 
}; 
+0

Ouais. Ce n'est pas si dur. Mais je voudrais être sûr que je dois. Merci! – NilColor

+0

Ce code ne fonctionne pas. '' '! eventName dans this.events''' devrait être' ''! (eventName dans this.events) '' ' –

+1

@LuisVasconcellos: Correct. Édité. Merci. –

1

n ° addEventListener est une caractéristique du DOM, pas JS.

+0

Je sais. C'est pourquoi je dis "quelque chose comme ...";) – NilColor

1

Je pense que vous constaterez que dans JavaScript simple, ce sont uniquement les objets DOM qui peuvent avoir des événements.

+0

Plus précisément, vous pouvez avoir des événements sur les objets qui implémentent l'interface 'EventTarget' à partir de DOM Level 2 Events. Cela inclut 'Element' et' Document' du DOM, mais aussi 'window',' XMLHttpRequest' et 'WebSocket'; probablement plus j'ai oublié. – bobince

0

Non, pas dans la mesure où vous pouvez ajouter un gestionnaire d'événements à un objet. Vous pouvez cependant écrire votre propre système d'événements pour les objets, si vous écrivez une sorte d'API ou de bibliothèque avec laquelle interagir avec d'autres scripts.

2

Non directement, mais vous ajoutez l'infrastructure publish/subscribe requise à l'un d'entre eux.

5

n °

Cependant, vous pouvez faire votre propre implémentation en écrivant addEventListener et d'autres fonctions et mémoriser une liste des gestionnaires pour chaque événement.

Par exemple: (non testé)

function addEventListener(name, handler) { 
    if (!this.events) this.events = {}; 
    if (!this.events[name]) this.events[name] = []; 
    this.events[name].push(handler); 
} 

function removeEventListener(name, handler) { 
    if (!this.events) return; 
    if (!this.events[name]) return; 
    for (var i = this.events[name].length - 1; i >= 0; i--) 
     if (this.events[name][i] == handler) 
      this.events[name].splice(i, 1); 
} 

function raiseEvent(name, args) { 
    if (!this.events) return; 
    if (!this.events[name]) return; 
    for (var i = 0; i < this.events[name].length; i++) 
     this.events[name][i].apply(this, args); 
} 


var obj = ...; 
obj.addEventListener = addEventListener; 
obj.removeEventListener = removeEventListener; 
obj.raiseEvent = raiseEvent; 
+1

c'est un effort plus solide que le mien, donc +1 pour ça. –

1

Non, la seule chose que les objets JavaScript ont des propriétés est. Les valeurs de ces propriétés peuvent être:

  • Une valeur primitive
  • Un objet (y compris un objet de fonction)
0

Vous pouvez définir une méthode addEventListener pour recueillir tous les objets d'écoute, et votre code peut les appeler à tout moment. C'est juste de la programmation OO. Définissez le addXListener, ajoutez l'objet passé en paramètre quelque part, et quand quelque chose arrive, vous appelez ses méthodes.

Oui. Mais rappelez-vous que les événements de l'interface utilisateur sont ceux définis par HTML/Javascript, donc ce que vous allez programmer sera seulement pour votre objet "obj" pour alerter sur vos événements.

Par exemple:

FunnyProcessor 
+ addStartListener(...) 
+ addProcessingListener(...) 
+ addEndListener(...) 
+ doStuff() 

et doSuff appellera d'abord les auditeurs de départ, à côté faire une boucle et pour chaque itération le traitement des appels d'auditeurs et aux auditeurs de fin d'appel de fin.

+0

Votre FunnyProcessor me fait penser à un Observable ... et le post de 2010, c'est un Observable avant qu'il ne soit cool. – SparK

Questions connexes