События jQuery.bind() на простых объектах Javascript

Можно ли связать события jQuery с обычными объектами без DOM Javascript:

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

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

Каковы последствия для

  • Сбор мусора (не создаются новые ссылки, запрещающие объект GC)

  • Атрибуты объекта (новые атрибуты, назначенные объекту)?

  • Производительность

Некоторые вещи, которые я отметил

  • Имя события не должно конфликтовать с именем функции на объекте, например. вы не можете иметь функцию init и event с именем init и вызвать ее корреляцию

Ответы

Ответ 1

Вместо использования системы событий 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 +).

Ответ 2

Увидев, что jQuery поддерживает изменение свойств объекта через animate, это, безусловно, прекрасно.

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