kis-js/src/modules/event.js

149 lines
3.0 KiB
JavaScript
Raw Normal View History

/**
* Event
*
* Event api wrapper
2012-03-29 11:58:32 -04:00
* @todo Add method for triggering events
*/
(function (undefined){
"use strict";
var _add_remove, e, _attach_delegate;
_add_remove = function (sel, event, callback, add)
{
var i, len;
2012-03-29 11:58:32 -04:00
if(sel === undefined)
{
2012-04-26 13:21:47 -04:00
return null;
}
2011-11-06 17:11:34 -05:00
// Multiple events? Run recursively!
2012-02-23 12:42:33 -05:00
if ( ! event.match(/^([\w\-]+)$/))
{
event = event.split(" ");
2012-03-29 11:58:32 -04:00
len = event.length;
for (i = 0; i < len; i++)
{
_add_remove(sel, event[i], callback, add);
}
return;
}
// Bind the event
(add === true)
? sel.addEventListener(event, callback, false)
: sel.removeEventListener(event, callback, false);
};
_attach_delegate = function(sel, target, event, callback)
{
2011-11-06 17:11:34 -05:00
// attach the listener to the parent object
_add_remove(sel, event, function(e){
2012-03-29 11:58:32 -04:00
var elem, t;
2012-03-29 11:58:32 -04:00
2011-11-06 17:11:34 -05:00
// Get the live version of the target selector
2012-02-23 12:42:33 -05:00
t = $_.$(target, sel);
2012-03-29 11:58:32 -04:00
2011-11-06 17:11:34 -05:00
// Check each element to see if it matches the target
for(elem in t)
{
2011-11-06 17:11:34 -05:00
// Fire target callback when event bubbles from target
if(e.target == t[elem])
{
2011-11-06 17:11:34 -05:00
// Trigger the event callback
callback.call(t[elem], e);
2012-03-29 11:58:32 -04:00
2011-11-06 17:11:34 -05:00
// Stop event propegation
e.stopPropagation();
}
}
2012-03-29 11:58:32 -04:00
}, true);
};
2012-03-29 11:58:32 -04:00
// --------------------------------------------------------------------------
/**
2011-11-03 16:04:35 -04:00
* Event Listener module
*
* @namespace
* @name event
* @memberOf $_
*/
e = {
/**
* Adds an event that returns a callback when triggered on the selected
* event and selector
2012-03-29 11:58:32 -04:00
*
* @memberOf $_.event
* @name add
* @function
* @example Eg. $_("#selector").event.add("click", do_something());
* @param string event
* @param function callback
*/
add: function (event, callback)
{
$_.each(function(e){
_add_remove(e, event, callback, true);
});
},
/**
* Removes an event bound the the specified selector, event type, and callback
*
* @memberOf $_.event
* @name remove
* @function
* @example Eg. $_("#selector").event.remove("click", do_something());
* @param string event
* @param string callback
*/
remove: function (event, callback)
{
$_.each(function(e){
_add_remove(e, event, callback, false);
});
},
2012-03-29 11:58:32 -04:00
/**
2011-11-03 16:04:35 -04:00
* Binds a persistent event to the document
*
* @memberOf $_.event
* @name live
* @function
* @example Eg. $_.event.live(".button", "click", do_something());
* @param string target
* @param string event
* @param function callback
*/
live: function (target, event, callback)
{
_attach_delegate(document.documentElement, target, event, callback);
},
2012-03-29 11:58:32 -04:00
/**
* Binds an event to a parent object
*
* @memberOf $_.event
* @name delegate
* @function
* @example Eg. $_("#parent").delegate(".button", "click", do_something());
* @param string target
* @param string event_type
2011-11-03 16:04:35 -04:00
* @param function callback
*/
2011-11-06 17:11:34 -05:00
delegate: function (target, event, callback)
{
$_.each(function(e){
_attach_delegate(e, target, event, callback);
});
}
};
$_.ext('event', e);
}());