Skip to content
Permalink
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
dmethvin committed Oct 27, 2011
1 parent df4a160 commit 5c0c86378a602fbc06535617fc5d712fa6d6e024
Showing 2 changed files with 26 additions and 3 deletions.
@@ -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];
@@ -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
Copy link

@davidmurdoch davidmurdoch commented on 5c0c863 Oct 27, 2011

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@dmethvin
Copy link
Member Author

@dmethvin dmethvin commented on 5c0c863 Oct 27, 2011

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.