Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

DRY the hover pseudo-event, get the type right, allow override.

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".
  • Loading branch information...
commit 5c0c86378a602fbc06535617fc5d712fa6d6e024 1 parent df4a160
@dmethvin dmethvin authored
Showing with 26 additions and 3 deletions.
  1. +5 −2 src/event.js
  2. +21 −1 test/unit/event.js
View
7 src/event.js
@@ -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];
View
22 test/unit/event.js
@@ -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() {

2 comments on commit 5c0c863

@davidmurdoch

Why not put .split( " " ) in hoverHack, too?

@dmethvin
Owner

It didn't seem to logically belong there, it's not part of the hack. Eventually I would like to eliminate the hover mess, but the solution I had (a special event handler for "hover") was bigger and I didn't want to make big changes so close to the release.

Please sign in to comment.
Something went wrong with that request. Please try again.