| 3583 | }); |
| 3584 | |
| 3585 | function liveHandler( event ) { |
| 3586 | var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, |
| 3587 | elems = [], |
| 3588 | selectors = [], |
| 3589 | events = jQuery._data( this, "events" ); |
| 3590 | |
| 3591 | // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) |
| 3592 | if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { |
| 3593 | return; |
| 3594 | } |
| 3595 | |
| 3596 | if ( event.namespace ) { |
| 3597 | namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); |
| 3598 | } |
| 3599 | |
| 3600 | event.liveFired = this; |
| 3601 | |
| 3602 | var live = events.live.slice(0); |
| 3603 | |
| 3604 | for ( j = 0; j < live.length; j++ ) { |
| 3605 | handleObj = live[j]; |
| 3606 | |
| 3607 | if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { |
| 3608 | selectors.push( handleObj.selector ); |
| 3609 | |
| 3610 | } else { |
| 3611 | live.splice( j--, 1 ); |
| 3612 | } |
| 3613 | } |
| 3614 | |
| 3615 | match = jQuery( event.target ).closest( selectors, event.currentTarget ); |
| 3616 | |
| 3617 | for ( i = 0, l = match.length; i < l; i++ ) { |
| 3618 | close = match[i]; |
| 3619 | |
| 3620 | for ( j = 0; j < live.length; j++ ) { |
| 3621 | handleObj = live[j]; |
| 3622 | |
| 3623 | if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { |
| 3624 | elem = close.elem; |
| 3625 | related = null; |
| 3626 | |
| 3627 | // Those two events require additional checking |
| 3628 | if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { |
| 3629 | event.type = handleObj.preType; |
| 3630 | related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; |
| 3631 | |
| 3632 | // Make sure not to accidentally match a child element with the same selector |
| 3633 | if ( related && jQuery.contains( elem, related ) ) { |
| 3634 | related = elem; |
| 3635 | } |
| 3636 | } |
| 3637 | |
| 3638 | if ( !related || related !== elem ) { |
| 3639 | elems.push({ elem: elem, handleObj: handleObj, level: close.level }); |
| 3640 | } |
| 3641 | } |
| 3642 | } |