Skip to content

Instantly share code, notes, and snippets.

@cpojer
Forked from ibolmo/Listener.js
Created February 9, 2011 01:37
Show Gist options
  • Save cpojer/817717 to your computer and use it in GitHub Desktop.
Save cpojer/817717 to your computer and use it in GitHub Desktop.
// Element Listener Mixin
(function(){
var property = '$listener';
var setup = function(element){
var listener = new Events, removeEvent = listener.removeEvent;
listener.removeEvent = function(key, value){
removeEvent.call(this, key, value);
element.removeEvent(key, value);
};
return listener;
};
this.Listener = new Class({
attach: function(key, value){
if (!this[property]) this[property] = setup(this.toElement());
this[property].addEvent(key, value);
this.toElement().addEvent(key, value);
}.overloadSetter(),
detach: function(key, value){
if (this[property]){
if (typeof key == 'string') this[property].removeEvent(key, value);
else this[property].removeEvents(key);
}
return this;
},
toElement: function(){
return this.element;
}
});
}).call(this);
// Implementation
var MyClass = new Class({
Implements: [Listener, Class.Binds],
initialize: function(){
this.element = new Element('div');
this.attach({
click: this.bound('onClick'),
'keyup:relay(:input)': this.bound('onKeyUp')
});
}
});
// Use
var myInstance = new MyClass();
myInstance.detach();
(function(){
describe('Listener', function(){
var MyClass = new Class({
Implements: Listener,
initialize: function(){
this.element = new Element('div');
}
});
it('should implement toElement correctly', function(){
var element = document.id(new MyClass);
expect(typeOf(element)).toBe('element');
expect(element.get('tag')).toBe('div');
});
it('should be able to attach listeners', function(){
var instance = new MyClass,
element = document.id(instance),
list = [],
click = function(){
list.push(1);
},
mouseenter = function(){
list.push(2);
};
instance.attach({
'click': click,
'mouseenter': mouseenter
});
element.fireEvent('click');
expect(list).toEqual([1]);
instance.detach();
element.fireEvent('click').fireEvent('mouseenter');
expect(list).toEqual([1]);
instance.attach('click', click);
element.fireEvent('click');
expect(list).toEqual([1, 1]);
instance.detach('click', mouseenter);
element.fireEvent('click');
expect(list).toEqual([1, 1, 1]);
instance.detach('click', click);
element.fireEvent('click');
expect(list).toEqual([1, 1, 1]);
instance.attach('mouseenter', mouseenter);
element.fireEvent('mouseenter');
expect(list).toEqual([1, 1, 1, 2]);
instance.detach({
click: mouseenter
});
element.fireEvent('mouseenter');
expect(list).toEqual([1, 1, 1, 2, 2]);
instance.detach({
mouseenter: mouseenter
});
element.fireEvent('mouseenter');
expect(list).toEqual([1, 1, 1, 2, 2]);
});
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment