X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fevent.js;h=e911f29612c4a6d49362c14c7373922943a99d70;hb=6a85898d131f9921f2d8e885a892fbdcf4d9c5c6;hp=1aafcfa28a4b02aa7fab26cab3b84aa8c08d3179;hpb=811891785f5bfa3f42ec9cb18e68fc3a114935e9;p=jquery.git diff --git a/src/event.js b/src/event.js index 1aafcfa..e911f29 100644 --- a/src/event.js +++ b/src/event.js @@ -57,7 +57,7 @@ jQuery.event = { // Namespaced event handlers var namespaces = type.split("."); type = namespaces.shift(); - handler.type = namespaces.slice().sort().join("."); + handler.type = namespaces.slice(0).sort().join("."); // Get the current list of functions bound to this event var handlers = events[ type ], @@ -133,7 +133,7 @@ jQuery.event = { var namespaces = type.split("."); type = namespaces.shift(); var all = !namespaces.length, - namespace = new RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"), + namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join(".*\\.") + "(\\.|$)"), special = this.special[ type ] || {}; if ( events[ type ] ) { @@ -190,9 +190,10 @@ jQuery.event = { }, // bubbling is internal - trigger: function( event, data, elem, bubbling ) { + trigger: function( event, data, elem /*, bubbling */ ) { // Event object or event type - var type = event.type || event; + var type = event.type || event, + bubbling = arguments[3]; if ( !bubbling ) { event = typeof event === "object" ? @@ -246,16 +247,22 @@ jQuery.event = { handle.apply( elem, data ); } + var nativeFn, nativeHandler; + try { + nativeFn = elem[ type ]; + nativeHandler = elem[ "on" + type ]; + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (e) {} // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) - if ( (!elem[ type ] || (jQuery.nodeName(elem, 'a') && type === "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) { + if ( (!nativeFn || (jQuery.nodeName(elem, 'a') && type === "click")) && nativeHandler && nativeHandler.apply( elem, data ) === false ) { event.result = false; } // Trigger the native events (except for clicks on links) - if ( !bubbling && elem[ type ] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type === "click") ) { + if ( !bubbling && nativeFn && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type === "click") ) { this.triggered = true; try { - elem[ type ](); + nativeFn(); // prevent IE from throwing an error for some hidden elements } catch (e) {} } @@ -284,7 +291,7 @@ jQuery.event = { // Cache this now, all = true means, any handler all = !namespaces.length && !event.exclusive; - var namespace = new RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"); + var namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join(".*\\.") + "(\\.|$)"); handlers = ( jQuery.data(this, "events") || {} )[ event.type ]; @@ -367,7 +374,7 @@ jQuery.event = { // Add which for click: 1 == left; 2 == middle; 3 == right // Note: button is not normalized, so don't use it - if ( !event.which && event.button ) { + if ( !event.which && event.button !== undefined ) { event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); } @@ -401,8 +408,20 @@ jQuery.event = { jQuery.event.add( this, data.live, liveHandler ); }, - teardown: function( namespaces ) { - jQuery.event.remove( this, namespaces[0], liveHandler ); + remove: function( namespaces ) { + if ( namespaces.length ) { + var remove = 0, name = new RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)"); + + jQuery.each( (jQuery.data(this, "events").live || {}), function() { + if ( name.test(this.type) ) { + remove++; + } + }); + + if ( remove < 1 ) { + jQuery.event.remove( this, namespaces[0], liveHandler ); + } + } } } } @@ -524,7 +543,7 @@ jQuery.fn.extend({ } fn = thisObject === undefined ? fn : jQuery.event.proxy( fn, thisObject ); return type === "unload" ? this.one(type, data, fn, thisObject) : this.each(function() { - jQuery.event.add( this, type, fn, data, thisObject ); + jQuery.event.add( this, type, fn, data ); }); }, @@ -542,7 +561,7 @@ jQuery.fn.extend({ return fn.apply( this, arguments ); }); return this.each(function() { - jQuery.event.add( this, type, one, data, thisObject ); + jQuery.event.add( this, type, one, data ); }); }, @@ -696,6 +715,12 @@ 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