2012-02-01 43 views
15

它是確定綁定jQuery的事件平淡,非DOM的JavaScript對象:jQuery.bind()事件的對象

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

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

哪些

  • 垃圾回收的影響(沒有新的參考創建阻止對象GC'ed)

  • 對象屬性(分配給對象的新屬性)?

  • 性能

我注意到

有些事情
  • 事件名稱不得與對象,如函數名稱衝突你不能有函數初始化和事件命名爲init並觸發它的正確性
+0

你爲什麼要這麼做? – 2012-02-01 16:38:52

+0

如果你想要一個事件系統,我會建議你自己創建一個事件系統,或者使用一個適用於典型JS對象的現有系統。他們不難寫,而且對於你想要做的更具體。 – 2012-02-01 16:45:37

+0

我想不出一個很好的理由來做到這一點。 – jbabey 2012-02-01 16:49:40

回答

14

而不是使用jquery事件系統,我會實現一個模仿它使用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/


但是,爲了回答你的問題,我沒有看到你在做什麼其他比它不記錄,並可能因版本更改功能的任何直接的問題(儘管它適用於所有當前可用的版本1.2.6+)。

+0

謝謝。回調對象對我來說是新的,也許是最合適的方式來做到這一點,使用幫助函數callbackify(對象) – 2012-02-04 11:14:10

+5

我仍然不明白爲什麼我會實現我自己的。 – Quickredfox 2012-05-09 18:47:30

+0

@Quickredfox也許是因爲jQuery事件系統不適用於普通對象?僅僅因爲它現在起作用並不意味着它會在稍後工作。 – 2012-05-09 18:52:06

3

看到jQuery支持通過動畫改變對象屬性,這絕對沒問題。

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} 

Quickredfox的備份註釋是一個相當不錯的源太: http://forum.jquery.com/topic/triggering-custom-events-on-js-objects