X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fevent.js;h=d949d0f0f8f5c5bae27ad6cb65fbcddd30c04d52;hb=1df5084c9748a8d38516266063344f145bc428c0;hp=fb78bfeedfa9218f2eae431b2571c678f7fc4334;hpb=69994211b078b8711220eaef33cc1bd6a63c5772;p=jquery.git diff --git a/src/event.js b/src/event.js index fb78bfe..d949d0f 100644 --- a/src/event.js +++ b/src/event.js @@ -54,8 +54,25 @@ jQuery.event = { return; } - var events = elemData.events = elemData.events || {}, + var events = elemData.events, eventHandle = elemData.handle; + + if ( typeof events === "function" ) { + // On plain objects events is a fn that holds the the data + // which prevents this data from being JSON serialized + // the function does not need to be called, it just contains the data + eventHandle = events.handle; + events = events.events; + + } else if ( !events ) { + if ( !elem.nodeType ) { + // On plain objects, create a fn that acts as the holder + // of the values to avoid JSON serialization of event data + elemData.events = elemData = function(){}; + } + + elemData.events = events = {}; + } if ( !eventHandle ) { elemData.handle = eventHandle = function() { @@ -159,6 +176,11 @@ jQuery.event = { if ( !elemData || !events ) { return; } + + if ( typeof events === "function" ) { + elemData = events; + events = events.events; + } // types is actually an event object here if ( types && types.type ) { @@ -259,7 +281,10 @@ jQuery.event = { delete elemData.events; delete elemData.handle; - if ( jQuery.isEmptyObject( elemData ) ) { + if ( typeof elemData === "function" ) { + jQuery.removeData( elem, "events" ); + + } else if ( jQuery.isEmptyObject( elemData ) ) { jQuery.removeData( elem ); } } @@ -319,7 +344,10 @@ jQuery.event = { event.currentTarget = elem; // Trigger the event, it is assumed that "handle" is a function - var handle = jQuery.data( elem, "handle" ); + var handle = elem.nodeType ? + jQuery.data( elem, "handle" ) : + (jQuery.data( elem, "events" ) || {}).handle; + if ( handle ) { handle.apply( elem, data ); } @@ -331,6 +359,7 @@ jQuery.event = { if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { event.result = false; + event.preventDefault(); } } @@ -392,6 +421,11 @@ jQuery.event = { event.namespace = event.namespace || namespace_sort.join("."); events = jQuery.data(this, "events"); + + if ( typeof events === "function" ) { + events = events.events; + } + handlers = (events || {})[ event.type ]; if ( events && handlers ) { @@ -469,8 +503,8 @@ jQuery.event = { } // Add which for key events - if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) { - event.which = event.charCode || event.keyCode; + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; } // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) @@ -672,6 +706,7 @@ if ( !jQuery.support.submitBubbles ) { var elem = e.target, type = elem.type; if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + e.liveFired = undefined; return trigger( "submit", this, arguments ); } }); @@ -680,6 +715,7 @@ if ( !jQuery.support.submitBubbles ) { var elem = e.target, type = elem.type; if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + e.liveFired = undefined; return trigger( "submit", this, arguments ); } }); @@ -742,6 +778,7 @@ if ( !jQuery.support.changeBubbles ) { if ( data != null || val ) { e.type = "change"; + e.liveFired = undefined; return jQuery.event.trigger( e, arguments[1], elem ); } }; @@ -772,7 +809,7 @@ if ( !jQuery.support.changeBubbles ) { // Beforeactivate happens also before the previous element is blurred // with this event you can't trigger a change event, but you can store - // information/focus[in] is not needed anymore + // information beforeactivate: function( e ) { var elem = e.target; jQuery.data( elem, "_change_data", getVal(elem) ); @@ -799,6 +836,9 @@ if ( !jQuery.support.changeBubbles ) { }; changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; } function trigger( type, elem, args ) { @@ -1006,6 +1046,10 @@ function liveHandler( event ) { related, match, handleObj, elem, j, i, l, data, close, namespace, ret, events = jQuery.data( this, "events" ); + if ( typeof events === "function" ) { + events = events.events; + } + // Make sure we avoid non-left-click bubbling in Firefox (#3861) if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) { return; @@ -1110,7 +1154,7 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl // More info: // - http://isaacschlueter.com/2006/10/msie-memory-leaks/ if ( window.attachEvent && !window.addEventListener ) { - window.attachEvent("onunload", function() { + jQuery(window).bind("unload", function() { for ( var id in jQuery.cache ) { if ( jQuery.cache[ id ].handle ) { // Try/Catch is to handle iframes being unloaded, see #4280