speed: committing a failing experiment of concat vs slice
[jquery.git] / src / event.js
index cac56bd..e911f29 100644 (file)
@@ -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 ] ) {
@@ -247,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) {}
                }
@@ -285,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 ];
 
@@ -368,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 ) ));
                }
 
@@ -709,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