X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=edd108906c9721b6eced51eb9809d67e9e597ab5;hb=8e53f7b5d6716e60d8c8ea7e167f2b187aae9d89;hp=0c0d5a2e1d291c1e451abcc3352e76bfdf0c514e;hpb=d40083c866738727aa7ffd7f13d2955bc9575d5e;p=jquery.git diff --git a/src/core.js b/src/core.js index 0c0d5a2..edd1089 100644 --- a/src/core.js +++ b/src/core.js @@ -33,7 +33,10 @@ var jQuery = function( selector, context ) { rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent.toLowerCase(), + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, // Has the ready events already been bound? readyBound = false, @@ -164,7 +167,7 @@ jQuery.fn = jQuery.prototype = { return this.length; }, - toArray: function(){ + toArray: function() { return slice.call( this, 0 ); }, @@ -258,7 +261,7 @@ jQuery.fn = jQuery.prototype = { }, map: function( callback ) { - return this.pushStack( jQuery.map(this, function(elem, i){ + return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, @@ -313,10 +316,10 @@ jQuery.extend = jQuery.fn.extend = function() { continue; } - // Recurse if we're merging object literal values - if ( deep && copy && jQuery.isPlainObject(copy) ) { - // Don't extend not object literals - var clone = src && jQuery.isPlainObject(src) ? src : {}; + // Recurse if we're merging object literal values or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) { + var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src + : jQuery.isArray(copy) ? [] : {}; // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); @@ -379,7 +382,10 @@ jQuery.extend({ }, bindReady: function() { - if ( readyBound ) { return; } + if ( readyBound ) { + return; + } + readyBound = true; // Catch cases where $(document).ready() is called after the @@ -411,7 +417,7 @@ jQuery.extend({ try { toplevel = window.frameElement == null; - } catch(e){} + } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); @@ -433,7 +439,8 @@ jQuery.extend({ isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. - if ( !obj || toString.call(obj) !== "[object Object]" || !("constructor" in obj) ) { + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { return false; } @@ -460,6 +467,8 @@ jQuery.extend({ return true; }, + noop: function() {}, + // Evalulates a script in a global context globalEval: function( data ) { if ( data && rnotwhite.test(data) ) { @@ -610,19 +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: /version/.test( ua ) ? /version[\/ ]([\w.]+)/ : /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 ) { @@ -707,10 +772,10 @@ function access( elems, key, value, exec, fn, pass ) { // Setting one attribute if ( value !== undefined ) { // Optionally, function values get executed if exec is true - exec = exec && jQuery.isFunction(value); + exec = !pass && exec && jQuery.isFunction(value); for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i ) : value, pass ); + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } return elems;