Merging in jQuery.proxy() branch.
authorjeresig <jeresig@gmail.com>
Wed, 6 Jan 2010 00:18:39 +0000 (19:18 -0500)
committerjeresig <jeresig@gmail.com>
Wed, 6 Jan 2010 00:18:39 +0000 (19:18 -0500)
1  2 
src/core.js
src/event.js
test/unit/core.js

diff --cc src/core.js
@@@ -619,44 -614,50 +619,75 @@@ jQuery.extend(
                return ret.concat.apply( [], ret );
        },
  
+       // A global GUID counter for objects
+       guid: 1,
+       proxy: function( fn, proxy, thisObject ) {
+               if ( arguments.length === 2 ) {
+                       if ( typeof proxy === "string" ) {
+                               thisObject = fn;
+                               fn = thisObject[ proxy ];
+                               proxy = undefined;
+                       } else if ( proxy && !jQuery.isFunction( proxy ) ) {
+                               thisObject = proxy;
+                               proxy = undefined;
+                       }
+               }
+               if ( !proxy && fn ) {
+                       proxy = function() {
+                               return fn.apply( thisObject || this, arguments );
+                       };
+               }
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               if ( fn ) {
+                       proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+               }
+               // So proxy can be declared as an argument
+               return proxy;
+       },
        // Use of jQuery.browser is frowned upon.
        // More details: http://docs.jquery.com/Utilities/jQuery.browser
 -      browser: {
 -              version: (/.*?(?:firefox|safari|opera|msie)[\/ ]([\d.]+)/.exec(userAgent) || [0,"0"])[1],
 -              safari: /safari/.test( userAgent ),
 -              opera: /opera/.test( userAgent ),
 -              msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
 -              firefox: /firefox/.test( userAgent )
 -      }
 +      uaMatch: function( ua ) {
 +              var ret = { browser: "" };
 +
 +              ua = ua.toLowerCase();
 +
 +              if ( /webkit/.test( ua ) ) {
 +                      ret = { browser: "webkit", version: /webkit[\/ ]([\w.]+)/ };
 +
 +              } else if ( /opera/.test( ua ) ) {
 +                      ret = { browser: "opera", version: /opera[\/ ]([\w.]+)/ };
 +
 +              } else if ( /msie/.test( ua ) ) {
 +                      ret = { browser: "msie", version: /msie ([\w.]+)/ };
 +
 +              } else if ( /mozilla/.test( ua ) && !/compatible/.test( ua ) ) {
 +                      ret = { browser: "mozilla", version: /rv:([\w.]+)/ };
 +              }
 +
 +              ret.version = (ret.version && ret.version.exec( ua ) || [0, "0"])[1];
 +
 +              return ret;
 +      },
 +
 +      browser: {}
  });
  
 -// Deprecated
 -jQuery.browser.mozilla = /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent );
 +browserMatch = jQuery.uaMatch( userAgent );
 +if ( browserMatch.browser ) {
 +      jQuery.browser[ browserMatch.browser ] = true;
 +      jQuery.browser.version = browserMatch.version;
 +}
 +
 +// Deprecated, use jQuery.browser.webkit instead
 +if ( jQuery.browser.webkit ) {
 +      jQuery.browser.safari = true;
 +}
  
  if ( indexOf ) {
        jQuery.inArray = function( elem, array ) {
diff --cc src/event.js
@@@ -778,11 -765,10 +765,12 @@@ jQuery.each(["bind", "one"], function( 
                        jQuery( this ).unbind( event, handler );
                        return fn.apply( this, arguments );
                }) : fn;
 -              return type === "unload" ? this.one(type, data, handler) : this.each(function() {
 -                      jQuery.event.add( this, type, handler, data );
 -              });
 +              return type === "unload" && name !== "one" ?
 +                      this.one( type, data, fn, thisObject ) :
 +                      this.each(function() {
 +                              jQuery.event.add( this, type, handler, data );
 +                      });
        };
  });
  
Simple merge