Added in Ben Alman's proposed event.namespace property (the property holds the namesp...
[jquery.git] / src / event.js
index 1e2d33d..b549cd5 100644 (file)
@@ -25,6 +25,10 @@ jQuery.event = {
                        elem = window;
                }
 
+               if ( handler === false ) {
+                       handler = returnFalse;
+               }
+
                var handleObjIn, handleObj;
 
                if ( handler.handler ) {
@@ -47,7 +51,7 @@ jQuery.event = {
                }
 
                var events = elemData.events = elemData.events || {},
-                       eventHandle = elemData.handle, eventHandle;
+                       eventHandle = elemData.handle;
 
                if ( !eventHandle ) {
                        elemData.handle = eventHandle = function() {
@@ -138,7 +142,11 @@ jQuery.event = {
                        return;
                }
 
-               var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+               if ( handler === false ) {
+                       handler = returnFalse;
+               }
+
+               var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
                        elemData = jQuery.data( elem ),
                        events = elemData && elemData.events;
 
@@ -179,7 +187,7 @@ jQuery.event = {
                                type = namespaces.shift();
 
                                namespace = new RegExp("(^|\\.)" + 
-                                       jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)")
+                                       jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
                        }
 
                        eventType = events[ type ];
@@ -189,7 +197,7 @@ jQuery.event = {
                        }
 
                        if ( !handler ) {
-                               for ( var j = 0; j < eventType.length; j++ ) {
+                               for ( j = 0; j < eventType.length; j++ ) {
                                        handleObj = eventType[ j ];
 
                                        if ( all || namespace.test( handleObj.namespace ) ) {
@@ -203,7 +211,7 @@ jQuery.event = {
 
                        special = jQuery.event.special[ type ] || {};
 
-                       for ( var j = pos || 0; j < eventType.length; j++ ) {
+                       for ( j = pos || 0; j < eventType.length; j++ ) {
                                handleObj = eventType[ j ];
 
                                if ( handler.guid === handleObj.guid ) {
@@ -321,7 +329,7 @@ jQuery.event = {
                        }
 
                // prevent IE from throwing an error for some elements with some event types, see #3533
-               } catch (e) {}
+               } catch (inlineError) {}
 
                if ( !event.isPropagationStopped() && parent ) {
                        jQuery.event.trigger( event, data, parent, true );
@@ -348,7 +356,7 @@ jQuery.event = {
                                        }
 
                                // prevent IE from throwing an error for some elements with some event types, see #3533
-                               } catch (e) {}
+                               } catch (triggerError) {}
 
                                if ( old ) {
                                        target[ "on" + type ] = old;
@@ -360,9 +368,9 @@ jQuery.event = {
        },
 
        handle: function( event ) {
-               var all, handlers, namespaces, namespace, events;
+               var all, handlers, namespaces, namespace_sort = [], namespace_re, events, args = jQuery.makeArray( arguments );
 
-               event = arguments[0] = jQuery.event.fix( event || window.event );
+               event = args[0] = jQuery.event.fix( event || window.event );
                event.currentTarget = this;
 
                // Namespaced event handlers
@@ -371,10 +379,13 @@ jQuery.event = {
                if ( !all ) {
                        namespaces = event.type.split(".");
                        event.type = namespaces.shift();
-                       namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
+                       namespace_sort = namespaces.slice(0).sort();
+                       namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
+                       event.namespace = namespace_sort.join(".");
                }
 
-               var events = jQuery.data(this, "events"), handlers = events[ event.type ];
+               events = jQuery.data(this, "events");
+               handlers = (events || {})[ event.type ];
 
                if ( events && handlers ) {
                        // Clone the handlers to prevent manipulation
@@ -384,14 +395,14 @@ jQuery.event = {
                                var handleObj = handlers[ j ];
 
                                // Filter the functions by class
-                               if ( all || namespace.test( handleObj.namespace ) ) {
+                               if ( all || namespace_re.test( handleObj.namespace ) ) {
                                        // Pass in a reference to the handler function itself
                                        // So that we can later remove it
                                        event.handler = handleObj.handler;
                                        event.data = handleObj.data;
                                        event.handleObj = handleObj;
        
-                                       var ret = handleObj.handler.apply( this, arguments );
+                                       var ret = handleObj.handler.apply( this, args );
 
                                        if ( ret !== undefined ) {
                                                event.result = ret;
@@ -511,9 +522,8 @@ jQuery.event = {
                                if ( this.setInterval ) {
                                        this.onbeforeunload = eventHandle;
                                }
-
-                               return false;
                        },
+
                        teardown: function( namespaces, eventHandle ) {
                                if ( this.onbeforeunload === eventHandle ) {
                                        this.onbeforeunload = null;
@@ -525,10 +535,14 @@ jQuery.event = {
 
 var removeEvent = document.removeEventListener ?
        function( elem, type, handle ) {
-               elem.removeEventListener( type, handle, false );
+               if ( elem.removeEventListener ) {
+                       elem.removeEventListener( type, handle, false );
+               }
        } : 
        function( elem, type, handle ) {
-               elem.detachEvent( "on" + type, handle );
+               if ( elem.detachEvent ) {
+                       elem.detachEvent( "on" + type, handle );
+               }
        };
 
 jQuery.Event = function( src ) {
@@ -826,7 +840,7 @@ jQuery.each(["bind", "one"], function( i, name ) {
                        return this;
                }
                
-               if ( jQuery.isFunction( data ) ) {
+               if ( jQuery.isFunction( data ) || data === false ) {
                        fn = data;
                        data = undefined;
                }
@@ -968,10 +982,10 @@ jQuery.each(["live", "die"], function( i, name ) {
 
                        if ( name === "live" ) {
                                // bind live handler
-                               context.each(function(){
-                                       jQuery.event.add( this, liveConvert( type, selector ),
+                               for ( var j = 0, l = context.length; j < l; j++ ) {
+                                       jQuery.event.add( context[j], liveConvert( type, selector ),
                                                { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
-                               });
+                               }
 
                        } else {
                                // unbind live handler
@@ -980,12 +994,12 @@ jQuery.each(["live", "die"], function( i, name ) {
                }
                
                return this;
-       }
+       };
 });
 
 function liveHandler( event ) {
        var stop, maxLevel, elems = [], selectors = [],
-               related, match, handleObj, elem, j, i, l, data, close,
+               related, match, handleObj, elem, j, i, l, data, close, namespace,
                events = jQuery.data( this, "events" );
 
        // Make sure we avoid non-left-click bubbling in Firefox (#3861)
@@ -993,6 +1007,10 @@ function liveHandler( event ) {
                return;
        }
 
+       if ( event.namespace ) {
+               namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+       }
+
        event.liveFired = this;
 
        var live = events.live.slice(0);
@@ -1016,7 +1034,7 @@ function liveHandler( event ) {
                for ( j = 0; j < live.length; j++ ) {
                        handleObj = live[j];
 
-                       if ( close.selector === handleObj.selector ) {
+                       if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) {
                                elem = close.elem;
                                related = null;
 
@@ -1067,8 +1085,15 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl
        "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
 
        // Handle event binding
-       jQuery.fn[ name ] = function( fn ) {
-               return fn ? this.bind( name, fn ) : this.trigger( name );
+       jQuery.fn[ name ] = function( data, fn ) {
+               if ( fn == null ) {
+                       fn = data;
+                       data = null;
+               }
+
+               return arguments.length > 0 ?
+                       this.bind( name, data, fn ) :
+                       this.trigger( name );
        };
 
        if ( jQuery.attrFn ) {