]> source.dussan.org Git - jquery.git/commitdiff
DRY the hover pseudo-event, get the type right, allow override.
authorDave Methvin <dave.methvin@gmail.com>
Thu, 27 Oct 2011 21:11:40 +0000 (17:11 -0400)
committerDave Methvin <dave.methvin@gmail.com>
Thu, 27 Oct 2011 21:11:40 +0000 (17:11 -0400)
Now with working unit test for extra correctness! If external code defines a special.hover event, we won't string-hack "hover" into "mouseenter mouseleave".

src/event.js
test/unit/event.js

index dcbeb4b7f8005b95f712bb8bfe9a4d2d66276d99..509468328c518d694608593a942169e186aa84a4 100644 (file)
@@ -26,6 +26,9 @@ var rnamespaces = /\.(.*)$/,
                        (!m[2] || elem.id === m[2]) &&
                        (!m[3] || m[3].test( elem.className ))
                );
+       },
+       hoverHack = function( events ) {
+               return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
        };
 
 /*
@@ -76,7 +79,7 @@ jQuery.event = {
 
                // Handle multiple events separated by a space
                // jQuery(...).bind("mouseover mouseout", fn);
-               types = types.replace( rhoverHack, "mouseover$1 mouseout$1" ).split( " " );
+               types = hoverHack(types).split( " " );
                for ( t = 0; t < types.length; t++ ) {
 
                        tns = rtypenamespace.exec( types[t] ) || [];
@@ -166,7 +169,7 @@ jQuery.event = {
                }
 
                // Once for each type.namespace in types; type may be omitted
-               types = ( types || "" ).replace( rhoverHack, "mouseover$1 mouseout$1" ).split(" ");
+               types = hoverHack( types || "" ).split(" ");
                for ( t = 0; t < types.length; t++ ) {
                        tns = rtypenamespace.exec( types[t] ) || [];
                        type = tns[1];
index 246bde32204ee9bc3c310aa8b06017ae1f3cddfc..10286b2b78cbde8c9c7b98b32be826b61b5931a5 100644 (file)
@@ -786,7 +786,9 @@ test("unbind(eventObject)", function() {
        assert( 0 );
 });
 
-test("hover()", function() {
+test("hover() and hover pseudo-event", function() {
+       expect(2);
+
        var times = 0,
                handler1 = function( event ) { ++times; },
                handler2 = function( event ) { ++times; };
@@ -802,6 +804,24 @@ test("hover()", function() {
                .mouseenter().mouseleave();
 
        equals( times, 4, "hover handlers fired" );
+
+       var balance = 0;
+       jQuery( "#firstp" )
+               .bind("hover", function( e ) {
+                       if ( e.type === "mouseenter" ) {
+                               balance++;
+                       } else if ( e.type === "mouseleave" ) {
+                               balance--;
+                       } else {
+                               ok( false, "hover pseudo: unknown event type "+e.type );
+                       }
+               })
+               .trigger("mouseenter")
+               .trigger("mouseleave")
+               .unbind("hover")
+               .trigger("mouseenter");
+
+       equals( balance, 0, "hover pseudo-event" );
 });
 
 test("mouseover triggers mouseenter", function() {