X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=efdc4570ffb2e13cdc9bdd5febe648fbee746042;hb=76236a15062aa82a4841748e9071eb3c9535ef62;hp=8bd8044db29dfc2447e1f2dcebf4e09f0e0ac609;hpb=ffb1867a4364ea65e60dad3469e8c8eb420ebcac;p=jquery.git diff --git a/src/core.js b/src/core.js index 8bd8044..efdc457 100644 --- a/src/core.js +++ b/src/core.js @@ -35,7 +35,7 @@ var jQuery = function( selector, context ) { // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, - // For matching the engine and version of thte browser + // For matching the engine and version of the browser browserMatch, // Has the ready events already been bound? @@ -316,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 ); @@ -466,6 +466,31 @@ jQuery.extend({ } return true; }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") + .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) { + + // Try to use the native JSON parser first + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + + } else { + jQuery.error( "Invalid JSON: " + data ); + } + }, noop: function() {}, @@ -619,29 +644,49 @@ jQuery.extend({ return ret.concat.apply( [], ret ); }, - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - var ret = { browser: "" }; - - ua = ua.toLowerCase(); + // A global GUID counter for objects + guid: 1, - if ( /webkit/.test( ua ) ) { - ret = { browser: "webkit", version: /webkit[\/ ]([\w.]+)/ }; + proxy: function( fn, proxy, thisObject ) { + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; - } else if ( /opera/.test( ua ) ) { - ret = { browser: "opera", version: /opera[\/ ]([\w.]+)/ }; + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } + } - } else if ( /msie/.test( ua ) ) { - ret = { browser: "msie", version: /msie ([\w.]+)/ }; + if ( !proxy && fn ) { + proxy = function() { + return fn.apply( thisObject || this, arguments ); + }; + } - } else if ( /mozilla/.test( ua ) && !/compatible/.test( ua ) ) { - ret = { browser: "mozilla", version: /rv:([\w.]+)/ }; + // 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++; } - ret.version = (ret.version && ret.version.exec( ua ) || [0, "0"])[1]; + // So proxy can be declared as an argument + return proxy; + }, - return ret; + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) || + /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) || + /(msie) ([\w.]+)/.exec( ua ) || + !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; }, browser: {} @@ -703,12 +748,6 @@ function doScrollCheck() { jQuery.ready(); } -if ( indexOf ) { - jQuery.inArray = function( elem, array ) { - return indexOf.call( array, elem ); - }; -} - function evalScript( i, elem ) { if ( elem.src ) { jQuery.ajax({ @@ -741,10 +780,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;