2010-01-18 12 views
16

È possibile che a determinati oggetti Javascript sia associato un evento? Dì qualcosa del genere:I semplici oggetti Javascript possono avere eventi?

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

So che posso farlo con jQuery, ma è possibile senza alcuna libreria?

+1

Wow, quante risposte! – Skilldrick

+0

Chi chiamerebbe azioni di questo tipo? – Gumbo

+1

Sì ... così tanto, così in fretta! Grazie gente! @Gumbo dire che puoi avere qualcosa come la libreria xmpp e puoi attivare eventi su quella lib/oggetto (come "connesso", "disconnesso" ecc.). E vuoi che alcune azioni vengano eseguite quando si verifica un evento ... Ecco perché chiedo degli eventi. – NilColor

risposta

9

Dovrai implementare le tue funzionalità per quello, ma non è molto 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

Sì. Non è così difficile. Ma mi piacerebbe essere sicuro di doverlo fare. Grazie! – NilColor

+0

Questo codice non funziona. '' '! eventName in this.events''' dovrebbe essere' ''! (eventname in this.events) '' ' –

+1

@LuisVasconcellos: corretto. Modificato. Grazie. –

1

No. addEventListener è una funzionalità del DOM, non JS.

+0

Lo so. Questo è il motivo per cui dico "somethng like ...";) – NilColor

1

Penso che troverete in chiaro JavaScript, sono solo gli oggetti DOM che possono avere eventi.

+0

In particolare, è possibile avere eventi sugli oggetti che implementano l'interfaccia "EventTarget' dagli eventi DOM Level 2. Ciò include 'Element' e' Document' dal DOM, ma anche 'window',' XMLHttpRequest' e 'WebSocket'; probabilmente più che ho dimenticato. – bobince

0

No, non nella misura in cui è possibile aggiungere un gestore di eventi a qualsiasi oggetto. Potresti scrivere il tuo sistema di eventi per gli oggetti, se stai scrivendo una sorta di API o libreria per altri script con cui interagire.

2

Non direttamente ma si aggiunge l'infrastruttura publish/subscribe richiesta a uno di essi.

5

No.

Tuttavia, si potrebbe fare una propria implementazione scrivendo addEventListener e altre funzioni e memorizzare un elenco di gestori per ogni evento.

Ad esempio: (testato)

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

questo è uno sforzo più solido del mio, quindi +1 per quello. –

1

No, l'unica cosa che gli oggetti JavaScript hanno è proprietà. I valori di queste proprietà possono essere:

  • un valore di base
  • Un oggetto (tra cui un oggetto funzione)
0

È possibile definire un metodo addEventListener di raccogliere tutti gli oggetti listener, e il codice puoi chiamarli in qualsiasi momento È solo la programmazione OO. Definisci l'addXListener, aggiungi l'oggetto passato come parametro da qualche parte, e quando succede qualcosa chiami i suoi metodi.

Sì.

Ma ricorda che gli eventi dell'interfaccia utente sono quelli definiti da HTML/Javascript, quindi ciò che programmeresti sarà solo per il tuo oggetto "obj" per avvisare dei tuoi eventi.

By esempio:

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

e doSuff chiamerà primo ascoltatori avvio, prossimo fare qualche ciclo e per ogni iterazione ascoltatori elaborazione delle chiamate, e alla fine ascoltatori fine chiamata.

+0

Your FunnyProcessor mi ricorda un Observable ... e il post è del 2010, è un Observable prima che fosse bello. – SparK

Problemi correlati