2010-01-18 9 views
16

Können einfache Javascript-Objekte Ereignisse mit ihnen verbunden haben? Sagen Sie etwas wie folgt aus:Können einfache Javascript-Objekte Ereignisse haben?

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

Ich weiß, dass ich dies mit jQuery tun kann, aber ist es möglich, ohne Bibliothek?

+1

Wow, was für eine Menge Antworten! – Skilldrick

+0

Wer würde solche Ereignisaktionen aufrufen? – Gumbo

+1

Yeah ... So viel, so schnell! Danke Leute! @Gumbo sagen Sie können etwas wie xmpp Bibliothek haben und Sie können Ereignisse auf diesem lib/Objekt (wie "verbunden", "getrennt" usw.) auslösen. Und Sie möchten, dass einige Aktionen ausgeführt werden, wenn ein Ereignis eintritt ... Deshalb frage ich nach Ereignissen. – NilColor

Antwort

9

Sie müssen Ihre eigene Funktionalität dafür implementieren, aber das ist nicht sehr schwer.

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

Ja. Es ist nicht so schwer. Aber ich möchte sicher sein, dass ich es muss. Vielen Dank! – NilColor

+0

Dieser Code funktioniert nicht. '' '! eventName in this.events''' sollte' ''! sein (eventName in this.events) '' ' –

+1

@LuisVasconcellos: Richtig. Bearbeitet. Vielen Dank. –

1

Nr. addEventListener ist eine Funktion des DOM, nicht JS.

+0

Ich weiß. Deshalb sage ich "something like ...";) – NilColor

1

Ich denke, Sie werden feststellen, dass in reinem JavaScript nur DOM-Objekte Ereignisse haben können.

+0

Insbesondere können Sie Ereignisse für Objekte haben, die die 'EventTarget'-Schnittstelle von DOM Level 2 Events implementieren. Dazu gehören 'Element' und' Document' aus dem DOM, aber auch 'window',' XMLHttpRequest' und 'WebSocket'; wahrscheinlich habe ich mehr vergessen. – bobince

0

Nein, nicht in dem Ausmaß, dass Sie einen Event-Handler zu einem Objekt hinzufügen können. Sie könnten jedoch ein eigenes Ereignissystem für Objekte schreiben, wenn Sie eine Art API oder Bibliothek für andere Skripte schreiben, mit denen Sie interagieren können.

2

Nicht direkt, aber Sie fügen die erforderliche publish/subscribe Infrastruktur zu jedem von ihnen hinzu.

5

Nr

Allerdings könnten Sie Ihre eigene Implementierung machen durch addEventListener und andere Funktionen und Speichern einer Liste der Handler für jedes Ereignis zu schreiben.

Zum Beispiel: (Ungeprüfte)

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

das ist eine solidere Anstrengung als meine eigene, also +1 dafür. –

1

Nein, die einzige Sache, die JavaScript-Objekte haben, sind Eigenschaften. Die Werte dieser Eigenschaften sein kann:

  • Ein Grundwert
  • Ein Objekt (einschließlich eines Funktionsobjekt)
0

Sie eine addEventListener Methode definieren können alle Zuhörer Objekte zu sammeln, und Ihr Code kann sie jederzeit anrufen. Es ist nur OO-Programmierung. Definieren Sie den addXListener, fügen Sie das als Parameter übergebene Objekt hinzu, und wenn etwas passiert, rufen Sie seine Methode auf.

Ja.

Aber denken Sie daran, dass UI-Ereignisse die durch HTML/Javascript definierten sind, also, was Sie programmieren würden, ist nur für Ihr "obj" -Objekt, um über IHRE Ereignisse zu informieren.

Am Beispiel:

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

und doSuff zuerst die Start Hörer anrufen, neben etwas Schleife tun und für jede Iteration Anrufverarbeitungs Hörer, und am Ende Anrufendsignal Hörer.

+0

Ihr FunnyProcessor erinnert mich an ein Observable ... und der Beitrag von 2010 ist ein Observable, bevor es cool war. – SparK

Verwandte Themen