| 1090 | }); |
| 1091 | |
| 1092 | function liveHandler( event ) { |
| 1093 | var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, |
| 1094 | elems = [], |
| 1095 | selectors = [], |
| 1096 | events = jQuery._data( this, "events" ); |
| 1097 | |
| 1098 | // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) |
| 1099 | if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { |
| 1100 | return; |
| 1101 | } |
| 1102 | |
| 1103 | if ( event.namespace ) { |
| 1104 | namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); |
| 1105 | } |
| 1106 | |
| 1107 | event.liveFired = this; |
| 1108 | |
| 1109 | var live = events.live.slice(0); |
| 1110 | |
| 1111 | for ( j = 0; j < live.length; j++ ) { |
| 1112 | handleObj = live[j]; |
| 1113 | |
| 1114 | if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { |
| 1115 | selectors.push( handleObj.selector ); |
| 1116 | |
| 1117 | } else { |
| 1118 | live.splice( j--, 1 ); |
| 1119 | } |
| 1120 | } |
| 1121 | |
| 1122 | match = jQuery( event.target ).closest( selectors, event.currentTarget ); |
| 1123 | |
| 1124 | for ( i = 0, l = match.length; i < l; i++ ) { |
| 1125 | close = match[i]; |
| 1126 | |
| 1127 | for ( j = 0; j < live.length; j++ ) { |
| 1128 | handleObj = live[j]; |
| 1129 | |
| 1130 | if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { |
| 1131 | elem = close.elem; |
| 1132 | related = null; |
| 1133 | |
| 1134 | // Those two events require additional checking |
| 1135 | if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { |
| 1136 | event.type = handleObj.preType; |
| 1137 | related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; |
| 1138 | |
| 1139 | // Make sure not to accidentally match a child element with the same selector |
| 1140 | if ( related && jQuery.contains( elem, related ) ) { |
| 1141 | related = elem; |
| 1142 | } |
| 1143 | } |
| 1144 | |
| 1145 | if ( !related || related !== elem ) { |
| 1146 | elems.push({ elem: elem, handleObj: handleObj, level: close.level }); |
| 1147 | } |
| 1148 | } |
| 1149 | } |