X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fevent.js;h=a32f0339c8d9829e7b97b4f888fa9d682e8db588;hb=a5f8a1441158b66efb76de1d15f061f87f7bdc17;hp=26f23409c65dede33f4867263ff961fc0deedb43;hpb=97323d192f368fb8fa4ab8c77fbd7da99b049800;p=jquery.git diff --git a/src/event.js b/src/event.js index 26f2340..a32f033 100644 --- a/src/event.js +++ b/src/event.js @@ -37,11 +37,11 @@ jQuery.event = { // Init the element's event structure var events = jQuery.data( elem, "events" ) || jQuery.data( elem, "events", {} ), - handle = jQuery.data( elem, "handle" ) || jQuery.data( elem, "handle", function() { + handle = jQuery.data( elem, "handle" ) || jQuery.data( elem, "handle", function eventHandle() { // Handle the second event of a trigger and when // an event is called after a page has unloaded return typeof jQuery !== "undefined" && !jQuery.event.triggered ? - jQuery.event.handle.apply( arguments.callee.elem, arguments ) : + jQuery.event.handle.apply( eventHandle.elem, arguments ) : undefined; }); // Add elem as a property of the handle function @@ -253,8 +253,10 @@ jQuery.event = { var nativeFn, nativeHandler; try { - nativeFn = elem[ type ]; - nativeHandler = elem[ "on" + type ]; + if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { + nativeFn = elem[ type ]; + nativeHandler = elem[ "on" + type ]; + } // prevent IE from throwing an error for some elements with some event types, see #3533 } catch (e) {} @@ -264,12 +266,12 @@ jQuery.event = { if ( !bubbling && nativeFn && !event.isDefaultPrevented() && !isClick ) { this.triggered = true; try { - nativeFn(); + elem[ type ](); // prevent IE from throwing an error for some hidden elements } catch (e) {} // Handle triggering native .onfoo handlers - } else if ( nativeHandler && nativeHandler.apply( elem, data ) === false ) { + } else if ( nativeHandler && elem[ "on" + type ].apply( elem, data ) === false ) { event.result = false; } @@ -405,7 +407,7 @@ jQuery.event = { special: { ready: { // Make sure the ready event is setup - setup: bindReady, + setup: jQuery.bindReady, teardown: function() {} }, @@ -797,24 +799,6 @@ jQuery.fn.extend({ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); }, - ready: function( fn ) { - // Attach the listeners - bindReady(); - - // If the DOM is already ready - if ( jQuery.isReady ) { - // Execute the function immediately - fn.call( document, jQuery ); - - // Otherwise, remember the function for later - } else { - // Add the function to the wait list - jQuery.readyList.push( fn ); - } - - return this; - }, - live: function( type, data, fn, thisObject ) { if ( jQuery.isFunction( data ) ) { if ( fn !== undefined ) { @@ -890,106 +874,7 @@ function liveHandler( event ) { } function liveConvert( type, selector ) { - return ["live", type, selector//.replace(/[^\w\s\.]/g, function(ch){ return "\\"+ch}) - .replace(/\./g, "`") - .replace(/ /g, "|")].join("."); -} - -jQuery.extend({ - isReady: false, - readyList: [], - // Handle when the DOM is ready - ready: function() { - // Make sure that the DOM is not already loaded - if ( !jQuery.isReady ) { - if ( !document.body ) { - return setTimeout( jQuery.ready, 13 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If there are functions bound, to execute - if ( jQuery.readyList ) { - // Execute all of them - var fn, i = 0; - while ( (fn = jQuery.readyList[ i++ ]) ) { - fn.call( document, jQuery ); - } - - // Reset the list of functions - jQuery.readyList = null; - } - - // Trigger any bound ready events - jQuery( document ).triggerHandler( "ready" ); - } - } -}); - -var readyBound = false; - -function bindReady() { - if ( readyBound ) { return; } - readyBound = true; - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - return jQuery.ready(); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", function() { - document.removeEventListener( "DOMContentLoaded", arguments.callee, false ); - jQuery.ready(); - }, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent("onreadystatechange", function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", arguments.callee ); - jQuery.ready(); - } - }); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e){} - - if ( document.documentElement.doScroll && toplevel ) { - (function() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch( error ) { - setTimeout( arguments.callee, 0 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); - })(); - } - } - - // A fallback to window.onload, that will always work - jQuery.event.add( window, "load", jQuery.ready ); + return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "&")].join("."); } jQuery.each( ("blur focus load resize scroll unload click dblclick " + @@ -1000,6 +885,10 @@ jQuery.each( ("blur focus load resize scroll unload click dblclick " + jQuery.fn[ name ] = function( fn ) { return fn ? this.bind( name, fn ) : this.trigger( name ); }; + + if ( jQuery.fnAttr ) { + jQuery.fnAttr[ name ] = true; + } }); // Prevent memory leaks in IE @@ -1011,7 +900,10 @@ jQuery( window ).bind( 'unload', function() { for ( var id in jQuery.cache ) { // Skip the window if ( id != 1 && jQuery.cache[ id ].handle ) { - jQuery.event.remove( jQuery.cache[ id ].handle.elem ); + // Try/Catch is to handle iframes being unloaded, see #4280 + try { + jQuery.event.remove( jQuery.cache[ id ].handle.elem ); + } catch(e) {} } } });