2012-02-01 26 views
15

Is it ok để ràng buộc jQuery sự kiện để đồng bằng, không DOM đối tượng javascript:jQuery.bind() sự kiện trên đồng bằng javascript đối tượng

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

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

các tác động đối với bộ sưu tập

  • rác là gì (không có tham chiếu mới nào được tạo ngăn ngừa đối tượng thành GC'ed)

  • Thuộc tính đối tượng (thuộc tính mới được gán cho đối tượng)?

  • Performance

Một số điều tôi đã ghi nhận

  • tên tổ chức sự kiện không được xung đột với một tên hàm vào đối tượng, ví dụ bạn không thể có hàm init và sự kiện có tên init và kích hoạt nó correclty
+0

Tại sao bạn sẽ muốn làm điều này? –

+0

Nếu bạn muốn có một hệ thống sự kiện, tôi khuyên bạn nên tạo một hệ thống sự kiện riêng hoặc sử dụng một hệ thống hiện có dành cho các đối tượng JS điển hình. Chúng không khó để viết, và nó sẽ cụ thể hơn cho những gì bạn muốn làm. –

+0

tôi không thể nghĩ ra một lý do chính đáng để làm điều này. – jbabey

Trả lời

14

Thay vì sử dụng hệ thống sự kiện jquery, tôi sẽ triển khai thực hiện mô phỏng theo phương pháp 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/


Tuy nhiên, để trả lời câu hỏi của bạn, tôi không thấy bất kỳ vấn đề ngay lập tức với những gì bạn đang làm không phải là nó không được ghi chép lại và có thể thay đổi chức năng từ phiên bản lên phiên bản (mặc dù nó hoạt động trong tất cả các phiên bản hiện có 1.2.6+).

+0

Cảm ơn. Các đối tượng gọi lại là mới đối với tôi và có lẽ là cách phù hợp nhất để thực hiện việc này, sử dụng hàm callbackify (đối tượng) –

+5

Tôi vẫn không hiểu tại sao tôi lại tự thực hiện. – Quickredfox

+0

@Quickredfox Có lẽ vì hệ thống sự kiện jQuery không có nghĩa là đối với các đối tượng đơn giản? Chỉ vì nó hoạt động bây giờ không có nghĩa là nó sẽ hoạt động sau này. –

3

Xem dưới dạng hỗ trợ jQuery thay đổi thuộc tính đối tượng qua animate, điều này chắc chắn là tốt.

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} 

bình luận sao lưu Quickredfox là một nguồn khá tốt quá: http://forum.jquery.com/topic/triggering-custom-events-on-js-objects

Các vấn đề liên quan