As promised, here it is. Refer to the earlier articles if you want to know the hows and whys.
/*
* Created on 5/11/4
*
* Copyright 2004 Paul Marrington
* All rights reserved - http://marringtons.com
* PROPRIETARY/CONFIDENTIAL
* Use is subject to license terms - pa...@marrington.net
*/
/**
* Add all the events in an event object
* inside the group given.
*/
Events.addEvents = function( element, group)
{
for (var name in group.events)
Events.add(
element, name, group.events[name]);
}
Events.addSameEvent = function(
name, action, elements)
{
for (var i = 2; i < arguments.length; i++)
Events.add( arguments[i], name, action);
}
Events.add = function( element, name, action)
{
name = name.toLowerCase();
var on = "on" + name;
if (! element.events)
element.events = new Object();
var list = element.events[name];
if (! list)
{
list = element.events[name] = new Array();
if (element[on]) list.push( element[on]);
/*
* This is an interesting bit of obscure code.
* If there were any other way, I would not do
* it, but IE makes it essential. The event handler
* is inline so that it keeps a handle to the surrounding
* function/object. This way we can set event.owner
* to the same as the calling element when add
* function was called - even though the event
* handler is called asynchronously later,
* long after the add function is dead and buried.
* Nasty. It also means we are hanging on to an
* unknown amount of stuff. The W3C DOM uses
* evt.currentTarget, but this is the ONLY way
* we can get IE to know the owner. This is
* because evt.target is the actual element
* clicked on or whatever, while the owner
* of the event can be further up the DOM tree.
*/
element[on] = function( evt)
{
/*
* Normalise the event object between
& browsers and retrieve the list
* of actions to take.
*/
evt = evt || event;
if (! evt.target)
evt.target = evt.srcElement;
/*
* We get element from the owner object.
*/
evt.owner = element;
var list = this.events[evt.type];
/*
* Run each event in the list until
* one returns false. This breaks the chain.
* Events are run from the most
* recently added to the oldest.
*/
for (var i = list.length - 1; i >= 0; i--)
{
evt.action = list[i];
if (! evt.action( evt))
return false;
}
return true;
}
}
list.push( action);
}
Events.newList = function( name)
{
var newList = function( evt)
{
for (var j = evt.action.events.length - 1;
j >= 0; j--)
if (! evt.action.events[j]( evt))
return false;
return true;
}
newList.eventName = name;
newList.events = new Array();
newList.add = function( event)
{
this.events.push( event);
}
return newList;
}
--
Posted by Paul Marrington to Adept Software Development at 9/20/2005 06:28:00 PM