Make sure that .die() with no args works. Fixes #5789.
[jquery.git] / src / event.js
index 31ab8a3..a4b8f6c 100644 (file)
@@ -661,14 +661,14 @@ function testChange( e ) {
                data = jQuery.data( elem, "_change_data" );
                val = getVal(elem);
 
-               if ( val === data ) {
-                       return;
-               }
-
                // the current data will be also retrieved by beforeactivate
                if ( e.type !== "focusout" || elem.type !== "radio" ) {
                        jQuery.data( elem, "_change_data", val );
                }
+               
+               if ( data === undefined || val === data ) {
+                       return;
+               }
 
                if ( data != null || val ) {
                        e.type = "change";
@@ -838,23 +838,38 @@ jQuery.fn.extend({
 
        hover: function( fnOver, fnOut ) {
                return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-       },
+       }
+});
+
+jQuery.each(["live", "die"], function( i, name ) {
+       jQuery.fn[ name ] = function( types, data, fn ) {
+               var type, i = 0;
 
-       live: function( type, data, fn ) {
                if ( jQuery.isFunction( data ) ) {
                        fn = data;
                        data = undefined;
                }
 
-               jQuery( this.context ).bind( liveConvert( type, this.selector ), {
-                       data: data, selector: this.selector, live: type
-               }, fn );
+               types = (types || "").split( /\s+/ );
 
-               return this;
-       },
+               while ( (type = types[ i++ ]) != null ) {
+                       type = type === "focus" ? "focusin" : // focus --> focusin
+                                       type === "blur" ? "focusout" : // blur --> focusout
+                                       type === "hover" ? types.push("mouseleave") && "mouseenter" : // hover support
+                                       type;
+                       
+                       if ( name === "live" ) {
+                               // bind live handler
+                               jQuery( this.context ).bind( liveConvert( type, this.selector ), {
+                                       data: data, selector: this.selector, live: type
+                               }, fn );
 
-       die: function( type, fn ) {
-               jQuery( this.context ).unbind( liveConvert( type, this.selector ), fn ? { guid: fn.guid + this.selector + type } : null );
+                       } else {
+                               // unbind live handler
+                               jQuery( this.context ).unbind( liveConvert( type, this.selector ), fn ? { guid: fn.guid + this.selector + type } : null );
+                       }
+               }
+               
                return this;
        }
 });
@@ -919,7 +934,7 @@ function liveHandler( event ) {
 }
 
 function liveConvert( type, selector ) {
-       return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "&")].join(".");
+       return "live." + (type ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
 }
 
 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +