Ticket #2655: handle-fix.3.diff
File handle-fix.3.diff, 3.2 KB (added by , 14 years ago) |
---|
-
src/event.js
41 41 // Init the element's event structure 42 42 var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}), 43 43 handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){ 44 // returned undefined or false45 var val;46 47 44 // Handle the second event of a trigger and when 48 45 // an event is called after a page has unloaded 49 if ( typeof jQuery == "undefined" || jQuery.event.triggered ) 50 return val; 51 52 val = jQuery.event.handle.apply(arguments.callee.elem, arguments); 53 54 return val; 46 if ( typeof jQuery != "undefined" && !jQuery.event.triggered ) 47 return jQuery.event.handle.apply(arguments.callee.elem, arguments); 55 48 }); 56 49 // Add elem as a property of the handle function 57 50 // This is to prevent a memory leak with non-native … … 240 233 var val; 241 234 242 235 // Empty object is for triggered events with no data 243 event = jQuery.event.fix( event || window.event || {});236 event = arguments[0] = jQuery.event.fix( event || window.event ); 244 237 245 238 // Namespaced event handlers 246 var parts = event.type.split("."); 247 event.type = parts[0]; 239 var ns = event.type.split("."); 240 event.type = ns[0]; 241 ns = ns[1];//ns is the namespace 242 var all = !ns && !event.exclusive;//cache this now, all = true means, any handler 248 243 249 var handlers = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 ); 250 args.unshift( event ); 244 var handlers = ( jQuery.data(this, "events") || {} )[event.type];//don't use 2 jQuery.data, they are slow 251 245 252 246 for ( var j in handlers ) { 253 247 var handler = handlers[j]; 254 // Pass in a reference to the handler function itself255 // So that we can later remove it256 args[0].handler = handler;257 args[0].data = handler.data;258 248 259 249 // Filter the functions by class 260 if ( !parts[1] && !event.exclusive || handler.type == parts[1] ) { 261 var ret = handler.apply( this, args ); 250 if ( all || handler.type == ns ) { 262 251 263 if ( val !== false ) 264 val = ret; 265 266 if ( ret === false ) { 267 event.preventDefault(); 268 event.stopPropagation(); 269 } 252 // Pass in a reference to the handler function itself 253 // So that we can later remove it 254 event.handler = handler; 255 event.data = handler.data; 256 257 val = handler.apply( this, arguments ) !== false && val; 270 258 } 271 259 } 272 260 261 if ( val === false ) {//check after the loop 262 event.preventDefault(); 263 event.stopPropagation(); 264 } 265 273 266 // Clean up added properties in IE to prevent memory leak 274 267 if (jQuery.browser.msie) 275 268 event.target = event.preventDefault = event.stopPropagation = … … 279 272 }, 280 273 281 274 fix: function(event) { 275 if( event._fixed_ )//already fixed 276 return event; 277 282 278 // store a copy of the original event object 283 279 // and clone to set read-only properties 284 280 var originalEvent = event; 285 event = jQuery.extend({ }, originalEvent);281 event = jQuery.extend({ _fixed_:true }, originalEvent); 286 282 287 283 // add preventDefault and stopPropagation since 288 284 // they will not work on the clone