trigger: function(type, data, elem, donative, extra) {
// Clone the incoming data, if any
- data = jQuery.makeArray(data || []);
+ data = jQuery.makeArray(data);
if ( type.indexOf("!") >= 0 ) {
type = type.slice(0, -1);
// Pass along a fake event
if ( event )
- data.unshift( this.fix({ type: type, target: elem }) );
+ data.unshift( { type: type, target: elem } );
// Enforce the right trigger type
data[0].type = type;
handle: function(event) {
// returned undefined or false
- var val, namespace, all, handlers;
+ var val, ret, namespace, all, handlers;
event = arguments[0] = jQuery.event.fix( event || window.event );
event.handler = handler;
event.data = handler.data;
- val = handler.apply( this, arguments );
+ ret = handler.apply( this, arguments );
+
+ if ( val !== false )
+ val = ret;
+
+ if ( ret === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
}
}
-
- if ( val === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
// Clean up added properties in IE to prevent memory leak
if (jQuery.browser.msie)
event.target = event.preventDefault = event.stopPropagation =
- event.handler = event.data = null;
+ event.handler = event.data = event[expando] = null;
return val;
},
fix: function(event) {
+ if ( event[expando] == true )
+ return event;
+
// store a copy of the original event object
// and clone to set read-only properties
var originalEvent = event;
event = jQuery.extend({}, originalEvent);
+ // Mark it as fixed
+ event[expando] = true;
+
// add preventDefault and stopPropagation since
// they will not work on the clone
event.preventDefault = function() {