Fixed typo from commit 542099a278e79dce38e814e7e7b448a1b73df82f.
[jquery.git] / src / event.js
index e070cb2..018d4d9 100644 (file)
@@ -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) {}
 
@@ -678,7 +680,7 @@ function trigger( type, elem, args ) {
 if ( !jQuery.support.focusBubbles ) {
 
 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ){
-       event.special[ orig ] = {
+       jQuery.event.special[ orig ] = {
                setup: function() {
                        jQuery.event.add( this, fix, ieHandler );
                }, 
@@ -695,13 +697,12 @@ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ){
 
 }
 
-jQuery.fn.extend({
-       // TODO: make bind(), unbind() and one() DRY!
-       bind: function( type, data, fn, thisObject ) {
+jQuery.each(["bind", "one"], function(i, name) {
+       jQuery.fn[ name ] = function( type, data, fn, thisObject ) {
                // Handle object literals
                if ( typeof type === "object" ) {
                        for ( var key in type ) {
-                               this.bind(key, data, type[key], fn);
+                               this[ name ](key, data, type[key], fn);
                        }
                        return this;
                }
@@ -712,35 +713,17 @@ jQuery.fn.extend({
                        data = undefined;
                }
                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 );
-               });
-       },
-
-       one: function( type, data, fn, thisObject ) {
-               // Handle object literals
-               if ( typeof type === "object" ) {
-                       for ( var key in type ) {
-                               this.one(key, data, type[key], fn);
-                       }
-                       return this;
-               }
-               
-               if ( jQuery.isFunction( data ) ) {
-                       thisObject = fn;
-                       fn = data;
-                       data = undefined;
-               }
-               fn = thisObject === undefined ? fn : jQuery.event.proxy( fn, thisObject );
-               var one = jQuery.event.proxy( fn, function( event ) {
-                       jQuery( this ).unbind( event, one );
+               var handler = name == "one" ? jQuery.event.proxy( fn, function( event ) {
+                       jQuery( this ).unbind( event, handler );
                        return fn.apply( this, arguments );
+               }) : fn;
+               return type === "unload" ? this.one(type, data, handler, thisObject) : this.each(function() {
+                       jQuery.event.add( this, type, handler, data );
                });
-               return this.each(function() {
-                       jQuery.event.add( this, type, one, data );
-               });
-       },
+       };
+});
 
+jQuery.fn.extend({
        unbind: function( type, fn ) {
                // Handle object literals
                if ( typeof type === "object" && !type.preventDefault ) {
@@ -749,12 +732,11 @@ jQuery.fn.extend({
                        }
                        return this;
                }
-               
+
                return this.each(function() {
                        jQuery.event.remove( this, type, fn );
                });
        },
-
        trigger: function( type, data ) {
                return this.each(function() {
                        jQuery.event.trigger( type, data, this );
@@ -883,6 +865,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
@@ -894,7 +880,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) {}
                }
        }
 });