Использование событий класса / объекта в стиле MooTools в jQuery - PullRequest
0 голосов
/ 13 апреля 2010

Одна из приятных особенностей MooTools заключается в том, что он позволяет легко назначать / запускать события для объектов, например:

var playerSingleton = new (new Class({
  Implements: [Events],

  initialize: function() {},

  setVolume: function() { 
    // do some stuff..
    this.fireEvent('volumeChanged')
  }

}));

// Somewhere else...

playerSingleton.addEvent('volumeChanged', function() {
  // do something when volume changes
});

playerSingleton.setVolume(75);
// bam our event fires.

Как можно сделать что-то подобное с jQuery? Я знаю, что есть .bind и .trigger, но, похоже, единственный способ сделать это - привязать / запустить события для объекта окна:

$(window).bind('volumeChanged', fn);

Есть ли что-нибудь лучше, чем этот, больше похожий на подход MooTools? Спасибо!

1 Ответ

4 голосов
/ 13 апреля 2010

Привязка и триггер jQuery работают на обычных объектах. Не видел исходный код, чтобы увидеть, как он работает (если он является частью публичного API или нет), но это так. См. эту дискуссию с прошлого года, где обсуждается та же идея.

player - обычный объект, с методами установки громкости и добавления слушателей для изменения громкости. пример здесь .

var player = {
    setVolume: function() {
        $(this).trigger("volumeChanged");
    },

    addVolumeChangeHandler: function(fn) {
        $(this).bind("volumeChanged", fn);
    }
};

// add a listener
player.addVolumeChangeHandler(function() {
    alert("volume has been changed");
});

// change volume (should fire the attached listener)
player.setVolume(); // alerts "volume has been changed"
...