mirror of
https://github.com/jquery/jquery.git
synced 2026-01-24 20:48:01 -05:00
jQuery.event.handlers delegate matching hook point
This commit is contained in:
committed by
Dave Methvin
parent
36457cb6af
commit
14c50da7d5
81
src/event.js
81
src/event.js
@@ -344,11 +344,10 @@ jQuery.event = {
|
||||
// Make a writable jQuery.Event from the native event object
|
||||
event = jQuery.event.fix( event );
|
||||
|
||||
var i, j, cur, ret, selMatch, matched, matches, handleObj, sel,
|
||||
var i, j, ret, matched, handleObj,
|
||||
handlerQueue = [],
|
||||
args = core_slice.call( arguments ),
|
||||
handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
|
||||
delegateCount = handlers.delegateCount,
|
||||
special = jQuery.event.special[ event.type ] || {};
|
||||
|
||||
// Use the fix-ed jQuery.Event rather than the (read-only) native event
|
||||
@@ -361,40 +360,7 @@ jQuery.event = {
|
||||
}
|
||||
|
||||
// Determine handlers that should run if there are delegated events
|
||||
// Avoid non-left-click bubbling in Firefox (#3861)
|
||||
if ( delegateCount && !(event.button && event.type === "click") ) {
|
||||
|
||||
for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
|
||||
|
||||
// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
|
||||
if ( cur.disabled !== true || event.type !== "click" ) {
|
||||
selMatch = {};
|
||||
matches = [];
|
||||
i = 0;
|
||||
for ( ; i < delegateCount; i++ ) {
|
||||
handleObj = handlers[ i ];
|
||||
sel = handleObj.selector;
|
||||
|
||||
if ( selMatch[ sel ] === undefined ) {
|
||||
selMatch[ sel ] = handleObj.needsContext ?
|
||||
jQuery( sel, this ).index( cur ) >= 0 :
|
||||
jQuery.find( sel, this, null, [ cur ] ).length;
|
||||
}
|
||||
if ( selMatch[ sel ] ) {
|
||||
matches.push( handleObj );
|
||||
}
|
||||
}
|
||||
if ( matches.length ) {
|
||||
handlerQueue.push({ elem: cur, handlers: matches });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add the remaining (directly-bound) handlers
|
||||
if ( handlers.length > delegateCount ) {
|
||||
handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
|
||||
}
|
||||
handlerQueue = jQuery.event.handlers.call( this, event, handlers );
|
||||
|
||||
// Run delegates first; they may want to stop propagation beneath us
|
||||
i = 0;
|
||||
@@ -432,6 +398,49 @@ jQuery.event = {
|
||||
return event.result;
|
||||
},
|
||||
|
||||
handlers: function( event, handlers ) {
|
||||
var i, cur, selMatch, matches, handleObj, sel,
|
||||
handlerQueue = [],
|
||||
delegateCount = handlers.delegateCount;
|
||||
|
||||
// Avoid non-left-click bubbling in Firefox (#3861)
|
||||
if ( delegateCount && !(event.button && event.type === "click") ) {
|
||||
|
||||
for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
|
||||
|
||||
// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
|
||||
if ( cur.disabled !== true || event.type !== "click" ) {
|
||||
selMatch = {};
|
||||
matches = [];
|
||||
i = 0;
|
||||
for ( ; i < delegateCount; i++ ) {
|
||||
handleObj = handlers[ i ];
|
||||
sel = handleObj.selector;
|
||||
|
||||
if ( selMatch[ sel ] === undefined ) {
|
||||
selMatch[ sel ] = handleObj.needsContext ?
|
||||
jQuery( sel, this ).index( cur ) >= 0 :
|
||||
jQuery.find( sel, this, null, [ cur ] ).length;
|
||||
}
|
||||
if ( selMatch[ sel ] ) {
|
||||
matches.push( handleObj );
|
||||
}
|
||||
}
|
||||
if ( matches.length ) {
|
||||
handlerQueue.push({ elem: cur, handlers: matches });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add the remaining (directly-bound) handlers
|
||||
if ( handlers.length > delegateCount ) {
|
||||
handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
|
||||
}
|
||||
|
||||
return handlerQueue;
|
||||
},
|
||||
|
||||
fix: function( event ) {
|
||||
if ( event[ jQuery.expando ] ) {
|
||||
return event;
|
||||
|
||||
Reference in New Issue
Block a user