2010-01-18 12 views
16

¿Se pueden adjuntar eventos de JavaScript simples a eventos? Decir algo como esto:¿Pueden los objetos Javascript simples tener eventos?

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

Sé que puedo hacer esto con jQuery, pero ¿es posible sin ningún tipo de biblioteca?

+1

Wow, ¡cuántas respuestas! – Skilldrick

+0

¿Quién llamaría tales acciones de evento? – Gumbo

+1

Sí ... ¡Tanto, tan rápido! ¡Gracias a todos! @Gumbo dice que puede tener algo así como la biblioteca xmpp y puede desencadenar eventos en esa lib/objeto (como "conectado", "desconectado", etc.). Y quiere que se ejecuten algunas acciones cuando ocurre un evento ... Por eso pregunto sobre eventos. – NilColor

Respuesta

9

Tendrá que implementar su propia funcionalidad para eso, pero eso no es muy difícil.

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í. No es tan dificil. Pero me gustaría estar seguro de que tengo que hacerlo. ¡Gracias! – NilColor

+0

Este código no funciona. '' '! eventName en this.events''' debe ser' ''! (eventName en this.events) '' ' –

+1

@LuisVasconcellos: Correcto. Editado Gracias. –

1

No. addEventListener es una función del DOM, no JS.

+0

Lo sé. Esta es la razón por la que digo "algo así como ...";) – NilColor

1

Creo que encontrará que en JavaScript plano, solo los objetos DOM pueden tener eventos.

+0

Específicamente, puede tener eventos en objetos que implementen la interfaz 'EventTarget' desde los eventos DOM Nivel 2. Eso incluye 'Element' y' Document' del DOM, pero también 'window',' XMLHttpRequest' y 'WebSocket'; probablemente más lo he olvidado. – bobince

0

No, en la medida en que puede agregar un controlador de eventos a cualquier objeto. Sin embargo, podría escribir su propio sistema de eventos para objetos, si está escribiendo algún tipo de API o biblioteca para que otros scripts interactúen.

2

No directamente pero agrega la infraestructura publish/subscribe requerida a cualquiera de ellos.

5

Sin embargo, usted podría hacer su propia aplicación escribiendo addEventListener y otras funciones y almacenar una lista de controladores para cada evento.

Por ejemplo: (no probado)

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

este es un esfuerzo más sólido que el mío, así que +1 para eso. –

1

No, lo único que tienen objetos JavaScript es propiedades. Los valores de estas propiedades pueden ser:

  • un valor primitivo
  • Un objeto (incluyendo un objeto de función)
0

Se puede definir un método addEventListener para recoger todos los objetos detectores, y su código puede llamarlos en cualquier momento Es solo programación de OO. Defina addXListener, agregue el objeto pasado como parámetro en alguna parte, y cuando sucede algo, llame a sus métodos.

Sí.

Pero recuerde que los eventos de interfaz de usuario son aquellos definidos por HTML/Javascript, por lo que lo que estaría programando sería solo para su objeto "obj" para alertar sobre sus eventos.

Por ejemplo:

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

y doSuff llamarán primero los oyentes de inicio, junto hacer un poco de bucle y para cada iteración oyentes de procesamiento de llamadas, y al final los oyentes de colgar.

+0

Su FunnyProcessor me recuerda un Observable ... y la publicación es de 2010, es un Observable antes de que fuera genial. – SparK

Cuestiones relacionadas