2012-02-01 17 views
15

¿Es aceptable para enlazar eventos a jQuery de civil no DOM objetos, javascript:jQuery.bind() eventos en el llano Javascript objetos

var myobject = {}; 
$(myobject).bind("foobar", function() { alert("daa"); }); 

$(myobject).trigger("foobar"); 

¿Cuáles son las implicaciones para la recolección

  • basura (no se crearon nuevas referencias que impidieran el objeto a GC)

  • Atributos del objeto (nuevos atributos asignados al objeto)?

  • Rendimiento

Algunas cosas que he observado

  • Nombre del evento no debe entrar en conflicto con un nombre de función en el objeto, por ejemplo, no se puede tener la función init y evento denominado init y dispararlo correclty
+0

¿Por qué quieres hacer esto? –

+0

Si desea un sistema de eventos, le sugiero que cree uno propio, o utilice uno existente que esté destinado a objetos JS típicos. No son difíciles de escribir, y serán más específicos para lo que quieres hacer. –

+0

No puedo pensar en una buena razón para hacer esto. – jbabey

Respuesta

14

En lugar de utilizar el sistema de eventos de jQuery, me gustaría implementar uno que imita usando el método jQuery.Callbacks.

var myClass = function(){ 
    this._callbacks = {}; 
}; 
myClass.prototype = { 
    addEvent: function(evname,callback) { 
    if (!this._callbacks[evname]) { 
     this._callbacks[evname] = $.Callbacks(); 
    } 
    this._callbacks[evname].add(callback); 
    }, 
    removeEvent: function(evname) { 
    if (!this._callbacks[evname]) { 
     return; 
    } 
    this._callbacks[evname].remove(); 
    //Might need this too: 
    //this._callbacks[evname] = null; 
    }, 
    triggerEvent: function(evname) { 
    if (this._callbacks[evname]) { 
     this._callbacks[evname].fire(); 
    } 
    } 
}; 
var foo = new myClass(); 
foo.addEvent("foo",function(){ 
    console.log('foo'); 
}); 
foo.triggerEvent("foo"); 
foo.removeEvent("foo"); 
// event was removed, the below line won't do anything. 
foo.triggerEvent("foo"); 

http://jsfiddle.net/kEuAP/


Sin embargo, para responder a su pregunta, no veo ningún problema inmediato con lo que está haciendo aparte de que no está documentada y puede cambiar la funcionalidad de una versión a otra (aunque funciona en todas las versiones 1.2.6+ disponibles actualmente).

+0

Gracias. Los objetos de devolución de llamada eran nuevos para mí y probablemente la forma más adecuada de hacerlo, mediante el uso de la función auxiliar callbackify (object) –

+5

No obstante, aún no entiendo por qué implementaría el mío. – Quickredfox

+0

@Quickredfox Tal vez porque el sistema de eventos jQuery no es para objetos simples? El hecho de que funcione ahora no significa que funcionará más tarde. –

3

Al ver como jQuery admite la alteración de las propiedades del objeto a través de animate también, esto está definitivamente bien.

var obj = {'test':0}; 
var interval = setInterval(function(){console.log(obj);}, 250); 
$(obj).on("fun", function(){this.test++}); 

$(obj).animate(
    {'test':100}, 
    3000, 
    function(){ 
     console.log(obj); 
     clearInterval(interval); 


     $(obj).trigger("fun") 
     console.log("increment",obj); 
    } 
); 

//will console log {test: 1.5}, {test: 6.4} etc then {test: 100} 
//and finally "interval" {test: 101} 

comentario copia de seguridad de Quickredfox es una muy buena fuente también: http://forum.jquery.com/topic/triggering-custom-events-on-js-objects