Skip to content

Instantly share code, notes, and snippets.

@RStankov
Created August 12, 2009 20:35
Show Gist options
  • Save RStankov/166744 to your computer and use it in GitHub Desktop.
Save RStankov/166744 to your computer and use it in GitHub Desktop.
// more on Event.register: https://prototype.lighthouseapp.com/projects/8886/tickets/477-custom-event-register#ticket-477-4
(function(){
// mouse:wheel ( DOMMouseScroll )
function wheel(event){
var realDelta;
// normalize the delta
if (event.detail){
realDelta = -event.detail / 3; // W3C
} else if (event.wheelDelta){
realDelta = event.wheelDelta / 120;// IE & Opera
}
if (!realDelta){
var customEvent = event.element().fire("mouse:wheel", {delta: realDelta});
if (customEvent.stopped) event.stop();
}
}
Event.register('mouse:wheel', function(){
document.observe('mousewheel', wheel);
document.observe('DOMMouseScroll', wheel);
});
// focus:in (bubbling focus)
function focusInHandler(e){
e.element().fire("focus:in");
}
Event.register('focus:in', function(){
if (document.addEventListener){
document.addEventListener("focus", focusInHandler, true);
} else {
document.observe("focusin", focusInHandler);
}
});
// focus:out (bubbling blur)
function focusOutHandler(e){
e.element().fire("focus:out");
}
Event.register('focus:out', function(){
if (document.addEventListener){
document.addEventListener("blur", focusInHandler, true);
} else {
document.observe("focusout", focusInHandler);
}
});
})();
// NOTE: untested
(function(){
var events = {};
Event.register = function(eventName, options){
events[eventName] = Object.extend({
initialize: Prototype.emptyFunction,
setup: Prototype.K,
teardown: Prototype.K,
handler: Prototype.K
}, Object.isFunction(options) ? {
initialize: options
} : options);
};
Event.observe = Event.observe.wrap(function(observe, element, eventName, handler){
if (!eventName.includes(':') || !eventName in events) return observe(element, eventName, handler);
var event = events[eventName];
if ('initialize' in event){
event.initialize();
delete event.initialize;
}
if (event.setup){
event.setup(element = $(element));
}
return observe(element, eventName, event.handler(handler));
});
Event.stopObserving = Event.stopObserving.wrap(function(stopObserving, element, eventName, handler){
if (!eventName.includes(':') || !eventName in events) return stopObserving(element, eventName, handler);
var event = events[eventName];
if (event.teardown){
event.teardown(element = $(element));
}
// !note handler reference is not the same !!! ( event.handler(handler) )
return stopObserving(element, eventName, hanlder);
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment