mirror of
https://github.com/jquery/jquery.git
synced 2024-10-05 11:34:18 +00:00
Fixes #12736. Move hover event hack to deprecated.js for removal in 1.9. Closes gh-982.
Signed-off-by: Timmy Willison <timmywillisn@gmail.com>
This commit is contained in:
parent
fd5facf1d1
commit
e83bc970f2
@ -1,7 +1,12 @@
|
||||
// Limit scope pollution from any deprecated API
|
||||
(function() {
|
||||
|
||||
var matched, browser;
|
||||
var matched, browser, eventAdd, eventRemove,
|
||||
oldToggle = jQuery.fn.toggle,
|
||||
rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
|
||||
hoverHack = function( events ) {
|
||||
return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
|
||||
};
|
||||
|
||||
// Use of jQuery.browser is frowned upon.
|
||||
// More details: http://api.jquery.com/jQuery.browser
|
||||
@ -60,10 +65,6 @@ jQuery.sub = function() {
|
||||
return jQuerySub;
|
||||
};
|
||||
|
||||
// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
|
||||
jQuery.attrFn = {};
|
||||
|
||||
var oldToggle = jQuery.fn.toggle;
|
||||
jQuery.fn.toggle = function( fn, fn2 ) {
|
||||
|
||||
if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
|
||||
@ -72,19 +73,19 @@ jQuery.fn.toggle = function( fn, fn2 ) {
|
||||
|
||||
// Save reference to arguments for access in closure
|
||||
var args = arguments,
|
||||
guid = fn.guid || jQuery.guid++,
|
||||
i = 0,
|
||||
toggler = function( event ) {
|
||||
// Figure out which function to execute
|
||||
var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
|
||||
jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
|
||||
guid = fn.guid || jQuery.guid++,
|
||||
i = 0,
|
||||
toggler = function( event ) {
|
||||
// Figure out which function to execute
|
||||
var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
|
||||
jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
|
||||
|
||||
// Make sure that clicks stop
|
||||
event.preventDefault();
|
||||
// Make sure that clicks stop
|
||||
event.preventDefault();
|
||||
|
||||
// and execute the function
|
||||
return args[ lastToggle ].apply( this, arguments ) || false;
|
||||
};
|
||||
// and execute the function
|
||||
return args[ lastToggle ].apply( this, arguments ) || false;
|
||||
};
|
||||
|
||||
// link all the functions, so any of them can unbind this click handler
|
||||
toggler.guid = guid;
|
||||
@ -95,4 +96,32 @@ jQuery.fn.toggle = function( fn, fn2 ) {
|
||||
return this.click( toggler );
|
||||
};
|
||||
|
||||
|
||||
// Support for 'hover' type
|
||||
eventAdd = jQuery.event.add;
|
||||
|
||||
// Duck punch jQuery.event.add, and jquery.event.remove
|
||||
// Signatures:
|
||||
// jQuery.event = {
|
||||
// add: function( elem, types, handler, data, selector ) {
|
||||
// remove: function( elem, types, handler, selector, mappedTypes ) {
|
||||
jQuery.event.add = function( elem, types, handler, data, selector ){
|
||||
if ( types ) {
|
||||
types = hoverHack( types );
|
||||
}
|
||||
eventAdd.call( this, elem, types, handler, data, selector );
|
||||
};
|
||||
|
||||
eventRemove = jQuery.event.remove;
|
||||
|
||||
jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
|
||||
if ( types ) {
|
||||
types = hoverHack( types );
|
||||
}
|
||||
eventRemove.call( this, elem, types, handler, selector, mappedTypes );
|
||||
};
|
||||
|
||||
// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
|
||||
jQuery.attrFn = {};
|
||||
|
||||
})();
|
||||
|
10
src/event.js
10
src/event.js
@ -1,12 +1,8 @@
|
||||
var rformElems = /^(?:textarea|input|select)$/i,
|
||||
rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
|
||||
rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
|
||||
rkeyEvent = /^key/,
|
||||
rmouseEvent = /^(?:mouse|contextmenu)|click/,
|
||||
rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
|
||||
hoverHack = function( events ) {
|
||||
return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
|
||||
};
|
||||
rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
|
||||
|
||||
/*
|
||||
* Helper functions for managing events -- not part of the public interface.
|
||||
@ -56,7 +52,7 @@ jQuery.event = {
|
||||
|
||||
// Handle multiple events separated by a space
|
||||
// jQuery(...).bind("mouseover mouseout", fn);
|
||||
types = jQuery.trim( hoverHack(types) ).split( " " );
|
||||
types = jQuery.trim( types ).split( " " );
|
||||
for ( t = 0; t < types.length; t++ ) {
|
||||
|
||||
tns = rtypenamespace.exec( types[t] ) || [];
|
||||
@ -139,7 +135,7 @@ jQuery.event = {
|
||||
}
|
||||
|
||||
// Once for each type.namespace in types; type may be omitted
|
||||
types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
|
||||
types = jQuery.trim( types ).split(" ");
|
||||
for ( t = 0; t < types.length; t++ ) {
|
||||
tns = rtypenamespace.exec( types[t] ) || [];
|
||||
type = origType = tns[1];
|
||||
|
@ -107,4 +107,33 @@ if ( jQuery.browser ) {
|
||||
ok(!!jQuery.attrFn, "attrFnPresent");
|
||||
});
|
||||
|
||||
test("hover pseudo-event", function() {
|
||||
expect(2);
|
||||
|
||||
var balance = 0;
|
||||
jQuery( "#firstp" )
|
||||
.on( "hovercraft", function() {
|
||||
ok( false, "hovercraft is full of ills" );
|
||||
})
|
||||
.on( "click.hover.me.not", function( e ) {
|
||||
equal( e.handleObj.namespace, "hover.me.not", "hover hack doesn't mangle namespaces" );
|
||||
})
|
||||
.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("click")
|
||||
.trigger("mouseenter")
|
||||
.trigger("mouseleave")
|
||||
.unbind("hover")
|
||||
.trigger("mouseenter");
|
||||
|
||||
equal( balance, 0, "hover pseudo-event" );
|
||||
});
|
||||
|
||||
}
|
||||
|
@ -798,8 +798,8 @@ test("unbind(eventObject)", function() {
|
||||
assert( 0 );
|
||||
});
|
||||
|
||||
test("hover() and hover pseudo-event", function() {
|
||||
expect(3);
|
||||
test("hover() mouseenter mouseleave", function() {
|
||||
expect(1);
|
||||
|
||||
var times = 0,
|
||||
handler1 = function( event ) { ++times; },
|
||||
@ -817,30 +817,6 @@ test("hover() and hover pseudo-event", function() {
|
||||
|
||||
equal( times, 4, "hover handlers fired" );
|
||||
|
||||
var balance = 0;
|
||||
jQuery( "#firstp" )
|
||||
.on( "hovercraft", function() {
|
||||
ok( false, "hovercraft is full of ills" );
|
||||
})
|
||||
.on( "click.hover.me.not", function( e ) {
|
||||
equal( e.handleObj.namespace, "hover.me.not", "hover hack doesn't mangle namespaces" );
|
||||
})
|
||||
.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("click")
|
||||
.trigger("mouseenter")
|
||||
.trigger("mouseleave")
|
||||
.unbind("hover")
|
||||
.trigger("mouseenter");
|
||||
|
||||
equal( balance, 0, "hover pseudo-event" );
|
||||
});
|
||||
|
||||
test("mouseover triggers mouseenter", function() {
|
||||
|
Loading…
Reference in New Issue
Block a user