rbrindley: branch 2.0 r4417 - /branches/2.0/config/js/jquery.delegate-1.1.js
SVN commits to the Asterisk-GUI project
asterisk-gui-commits at lists.digium.com
Tue Jan 13 12:07:03 CST 2009
Author: rbrindley
Date: Tue Jan 13 12:07:03 2009
New Revision: 4417
URL: http://svn.digium.com/svn-view/asterisk-gui?view=rev&rev=4417
Log:
added jquery.delegate plugin
Added:
branches/2.0/config/js/jquery.delegate-1.1.js
Added: branches/2.0/config/js/jquery.delegate-1.1.js
URL: http://svn.digium.com/svn-view/asterisk-gui/branches/2.0/config/js/jquery.delegate-1.1.js?view=auto&rev=4417
==============================================================================
--- branches/2.0/config/js/jquery.delegate-1.1.js (added)
+++ branches/2.0/config/js/jquery.delegate-1.1.js Tue Jan 13 12:07:03 2009
@@ -1,0 +1,155 @@
+/*! Copyright (c) 2008, Three Dub Media (http://threedubmedia.com) */
+;(function($){ // secure $ jQuery alias
+/*******************************************************************************************/
+// jquery.delgate.js - rev 5
+// Liscensed under the MIT License
+// http://www.opensource.org/licenses/mit-license.php
+// Created: 2008-08-14 | Updated: 2008-10-28
+/*******************************************************************************************/
+
+// extend jquery prototype, twice
+$.fn.delegate = function( types, selector, handler, data ){
+ return this.each(function(){
+ $.event.delegate.add( this, types, selector, handler, data );
+ });
+ };
+$.fn.undelegate = function( types, selector, handler ){
+ return this.each(function(){
+ $.event.delegate.remove( this, types, selector, handler );
+ });
+ };
+
+// extend the jquery.event object
+$.event.delegate = {
+ // ADD DELEGATES
+ add: function( elem, types, selector, handler, data ){
+ // first four arguments are required
+ if ( arguments.length < 4 ) return;
+ // handle single/multiple comma-seperated selectors...
+ var selectors = split( selector, comma ),
+ // reference or create an event delegation repository
+ repos = $.data( elem, 'delegates' ) || $.data( elem, 'delegates', {} );
+ // handle single/multiple space seperated event types...
+ $.each( split( types, space ), function( i, type ){
+ // reference or create event.type delegate cache
+ var cache = repos[ type ] || ( repos[ type ] = [] );
+ // bind the master delegate handler for this event.type
+ if ( !cache.length ) $.event.add( elem, type, $.event.delegate.handle, repos );
+ // store the handler with each selector
+ $.each( selectors, function( i, selector ){
+ // no empty strings
+ if ( !selector.length ) return;
+ // add the delegate selector and handler (and data) into the cache (push)
+ cache[ cache.length ] = {
+ selector: selector,
+ handler: handler,
+ data: data
+ };
+ });
+ });
+ },
+ // REMOVE DELEGATES
+ remove: function( elem, types, selector, handler ){
+ // handle single/multiple comma-seperated selectors...
+ var selectors = split( selector, comma ),
+ // reference event delegation repository
+ repos = $.data( elem, 'delegates' ) || {};
+ // remove ALL types and selectors
+ if ( elem && !types ){
+ // iterate all delegate types stored on this element
+ $.each( repos, function( type ){
+ // unbind the master delegate handler for each type
+ $.event.remove( elem, type, $.event.delegate.handle );
+ });
+ // clean-up stored data on this element
+ $.removeData( elem, 'delegates' );
+ // stop
+ return;
+ }
+ // handle single/multiple space seperated event types...
+ $.each( split( types, space ), function( i, type ){
+ // are there any selectors to check?
+ if ( selector && selector.length ){
+ // iterate all the stored selectors and handlers...
+ repos[ type ] = $.grep( repos[ type ] || [], function( stored, keep ){
+ // check against each passed selector
+ if ( stored ) $.each( selectors, function( x, selector ){
+ // match selector, and handler if provided
+ if ( stored.selector === selector &&
+ ( !handler || stored.handler === handler ) )
+ // break and set flag to remove data
+ return ( keep = false );
+ });
+ // remove or keep stored data
+ return ( keep !== false );
+ });
+ // if cache is NOT empty, stop
+ if ( repos[ type ].length ) return;
+ }
+ // unbind the master delegate handler for this event.type
+ $.event.remove( elem, type, $.event.delegate.handle );
+ // clean-out cached data for this event.type
+ delete repos[ type ];
+ });
+ },
+ // HANDLE EVENT DELEGATION
+ handle: function( event ){
+ // store the master delegate element
+ event.delegateParent = this;
+ // give delegate method for cancelling
+ event.stopDelegation = function(){ canceled = true; };
+ // local element, local variables
+ var target = event.target, args = arguments, ret, canceled,
+ // get delegates for this element and event.type
+ cache = ( event.data || {} )[ event.type ] || [];
+ // iterate stored delegate selectors
+ if ( cache.length ) do $.each( cache, function( i, stored ){
+ // match the target element to the delegate selector
+ if ( stored && $( target ).matches( stored.selector ) ) {
+ // pass along the data
+ event.data = stored.data;
+ // call the stored handler function
+ ret = stored.handler.apply( target, args );
+ // break $.each if "return false" or "stopDelegation"
+ if ( ret===false || canceled===true ) return false;
+ }
+ });
+ // walk up the parent tree to the delegate source/parent
+ while ( ret !== false && canceled !== true && target != this && ( target = target.parentNode ) )
+ // pass along the latest handler return value
+ return ret;
+ }
+ };
+
+// like "is" method... but handles descendant selector
+$.fn.matches = function( expr ) {
+ // reject bad arguments immediately
+ if ( typeof expr != "string" ) return false;
+ // local refs
+ var $this = this, tokens;
+ // loop through selector query in family pieces...
+ while ( expr.length && $this.length && ( tokens = pattern.exec( expr ) ) ) {
+ // filter collection for the terminal child(3) selector
+ $this = $this.setArray( $.filter( tokens[3], $this ).r );
+ // traverse "up" as needed using the descendant(2) and ancestor(1)
+ if ( tokens[2] ) $this = $this[ lookup[ tokens[2] ] ]( tokens[1] );
+ // remove descendant(2) and child(3) section of the query
+ expr = expr.replace( tokens[0].substr( tokens[1] ? tokens[1].length : 0 ), "" );
+ }
+ // query remains and no regexp match == bad selector
+ if ( !empty.test( expr ) && !tokens ) $this = [];
+ // if any elements matched, return true
+ return !!( $this.length > 0 );
+ };
+
+// "is" regular expression matches from the end of the selector
+var pattern = (/(?:([^>+~\s]+)\s*([>+~\s])\s*)?([^>+~\s]+)\s*$/),
+// white-space regexp and comma-sep regexp for splitting strings
+space = (/\s+/), comma = (/\s*,\s*/), empty = (/^\s*$/),
+// "is" lookup pairs the descender with the correct method to ascend...
+lookup = { ' ':'parents', '>':'parent', '+':'prev', '~':'prevAll' };
+// split and trim space seperated event types or comma-seperated selectors
+function split( str, regexp ){ return $.trim( str ).split( regexp ); };
+
+/*******************************************************************************************/
+})(jQuery);
More information about the asterisk-gui-commits
mailing list