X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=8988c5ee107617620e249b4cd36e04cb914b08ee;hb=3ae74b523ec379a1753d116bb7f1aec8db2c52d4;hp=8a2c6b2c0c2e36b88f2e8e0e2a7f9d7202a6b6d2;hpb=a65a811ce03b2f7900ae0daa18d4d9fc213acbfd;p=jquery.git diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index 8a2c6b2..8988c5e 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -9,9 +9,6 @@ * $Rev$ */ -// Global undefined variable -window.undefined = window.undefined; - /** * Create a new jQuery Object * @@ -22,7 +19,12 @@ window.undefined = window.undefined; * @param jQuery|Element|Array c context * @cat Core */ -var jQuery = function(a,c) { + +// Map over jQuery in case of overwrite +if ( typeof jQuery != "undefined" ) + var _jQuery = jQuery; + +var jQuery = window.jQuery = function(a,c) { // If the context is global, return a new object if ( window == this || !this.init ) return new jQuery(a,c); @@ -32,10 +34,12 @@ var jQuery = function(a,c) { // Map over the $ in case of overwrite if ( typeof $ != "undefined" ) - jQuery._$ = $; + var _$ = $; // Map the jQuery namespace to the '$' one -var $ = jQuery; +window.$ = jQuery; + +var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/; /** * This function accepts a string containing a CSS or @@ -153,22 +157,39 @@ jQuery.fn = jQuery.prototype = { // Make sure that a selection was provided a = a || document; - // HANDLE: $(function) - // Shortcut for document ready - if ( jQuery.isFunction(a) ) - return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a ); - // Handle HTML strings if ( typeof a == "string" ) { - // HANDLE: $(html) -> $(array) - var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a); - if ( m ) - a = jQuery.clean( [ m[1] ] ); + var m = quickExpr.exec(a); + if ( m && (m[1] || !c) ) { + // HANDLE: $(html) -> $(array) + if ( m[1] ) + a = jQuery.clean( [ m[1] ] ); + + // HANDLE: $("#id") + else { + var tmp = document.getElementById( m[3] ); + if ( tmp ) + // Handle the case where IE and Opera return items + // by name instead of ID + if ( tmp.id != m[3] ) + return jQuery().find( a ); + else { + this[0] = tmp; + this.length = 1; + return this; + } + else + a = []; + } // HANDLE: $(expr) - else + } else return new jQuery( c ).find( a ); - } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction(a) ) + return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a ); return this.setArray( // HANDLE: $(array) @@ -301,7 +322,7 @@ jQuery.fn = jQuery.prototype = { */ setArray: function( a ) { this.length = 0; - [].push.apply( this, a ); + Array.prototype.push.apply( this, a ); return this; }, @@ -852,7 +873,7 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Manipulation */ clone: function(deep) { - deep = deep != undefined ? deep : true + deep = deep != undefined ? deep : true; var $this = this.add(this.find("*")); if (jQuery.browser.msie) { // Need to remove events on the element and its descendants @@ -938,7 +959,7 @@ jQuery.fn = jQuery.prototype = { return this.pushStack( jQuery.isFunction( t ) && jQuery.grep(this, function(el, index){ - return t.apply(el, [index]) + return t.apply(el, [index]); }) || jQuery.multiFilter(t,this) ); @@ -1160,6 +1181,14 @@ jQuery.fn = jQuery.prototype = { ( this.length ? this[0].innerHTML : null ) : this.empty().append( val ); }, + + replaceWith: function( val ) { + return this.after( val ).remove(); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); + }, /** * @private @@ -1191,7 +1220,7 @@ jQuery.fn = jQuery.prototype = { if ( this.src ) jQuery.ajax({ url: this.src, async: false, dataType: "script" }); else - (new Function( this.text || this.textContent || this.innerHTML || "" ))(); + jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" ); } else fn.apply( obj, [ clone ? this.cloneNode(true) : this ] ); }); @@ -1252,17 +1281,39 @@ jQuery.fn = jQuery.prototype = { */ jQuery.extend = jQuery.fn.extend = function() { // copy reference to target object - var target = arguments[0], a = 1; + var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false; + + // Handle a deep copy situation + if ( target.constructor == Boolean ) { + deep = target; + target = arguments[1] || {}; + } // extend jQuery itself if only one argument is passed - if ( arguments.length == 1 ) { + if ( al == 1 ) { target = this; a = 0; } + var prop; - while ( (prop = arguments[a++]) != null ) - // Extend the base object - for ( var i in prop ) target[i] = prop[i]; + + for ( ; a < al; a++ ) + // Only deal with non-null/undefined values + if ( (prop = arguments[a]) != null ) + // Extend the base object + for ( var i in prop ) { + // Prevent never-ending loop + if ( target == prop[i] ) + continue; + + // Recurse if we're merging object values + if ( deep && typeof prop[i] == 'object' && target[i] ) + jQuery.extend( target[i], prop[i] ); + + // Don't bring in undefined values + else if ( prop[i] != undefined ) + target[i] = prop[i]; + } // Return the modified object return target; @@ -1303,9 +1354,10 @@ jQuery.extend({ * @type undefined * @cat Core */ - noConflict: function() { - if ( jQuery._$ ) - $ = jQuery._$; + noConflict: function(deep) { + window.$ = _$; + if ( deep ) + window.jQuery = _jQuery; return jQuery; }, @@ -1318,7 +1370,23 @@ jQuery.extend({ // check if an element is in a XML document isXMLDoc: function(elem) { - return elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + return elem.documentElement && !elem.body || + elem.tagName && elem.ownerDocument && !elem.ownerDocument.body; + }, + + // Evalulates a script in a global context + // Evaluates Async. in Safari 2 :-( + globalEval: function( data ) { + data = jQuery.trim( data ); + if ( data ) { + if ( window.execScript ) + window.execScript( data ); + else if ( jQuery.browser.safari ) + // safari doesn't provide a synchronous global eval + window.setTimeout( data, 0 ); + else + eval.call( window, data ); + } }, nodeName: function( elem, name ) { @@ -1355,12 +1423,24 @@ jQuery.extend({ */ // args is for internal usage only each: function( obj, fn, args ) { - if ( obj.length == undefined ) - for ( var i in obj ) - fn.apply( obj[i], args || [i, obj[i]] ); - else - for ( var i = 0, ol = obj.length; i < ol; i++ ) - if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break; + if ( args ) { + if ( obj.length == undefined ) + for ( var i in obj ) + fn.apply( obj[i], args ); + else + for ( var i = 0, ol = obj.length; i < ol; i++ ) + if ( fn.apply( obj[i], args ) === false ) break; + + // A special, fast, case for the most common use of each + } else { + if ( obj.length == undefined ) + for ( var i in obj ) + fn.call( obj[i], i, obj[i] ); + else + for ( var i = 0, ol = obj.length, val = obj[0]; + i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){} + } + return obj; }, @@ -1456,7 +1536,16 @@ jQuery.extend({ }, curCSS: function(elem, prop, force) { - var ret; + var ret, stack = [], swap = []; + + // A helper method for determining if an element's values are broken + function color(a){ + if ( !jQuery.browser.safari ) + return false; + + var ret = document.defaultView.getComputedStyle(a,null); + return !ret || ret.getPropertyValue("color") == ""; + } if (prop == "opacity" && jQuery.browser.msie) { ret = jQuery.attr(elem.style, "opacity"); @@ -1464,7 +1553,7 @@ jQuery.extend({ } if (prop.match(/float/i)) - prop = jQuery.styleFloat; + prop = styleFloat; if (!force && elem.style[prop]) ret = elem.style[prop]; @@ -1477,15 +1566,35 @@ jQuery.extend({ prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase(); var cur = document.defaultView.getComputedStyle(elem, null); - if ( cur ) + if ( cur && !color(elem) ) ret = cur.getPropertyValue(prop); - else if ( prop == "display" ) - ret = "none"; - else - jQuery.swap(elem, { display: "block" }, function() { - var c = document.defaultView.getComputedStyle(this, ""); - ret = c && c.getPropertyValue(prop) || ""; - }); + + // If the element isn't reporting its values properly in Safari + // then some display: none elements are involved + else { + // Locate all of the parent display: none elements + for ( var a = elem; a && color(a); a = a.parentNode ) + stack.unshift(a); + + // Go through and make them visible, but in reverse + // (It would be better if we knew the exact display type that they had) + for ( a = 0; a < stack.length; a++ ) + if ( color(stack[a]) ) { + swap[a] = stack[a].style.display; + stack[a].style.display = "block"; + } + + // Since we flip the display style, we have to handle that + // one special, otherwise get the value + ret = prop == "display" && swap[stack.length-1] != null ? + "none" : + document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || ""; + + // Finally, revert the display styles back + for ( a = 0; a < swap.length; a++ ) + if ( swap[a] != null ) + stack[a].style.display = swap[a]; + } if ( prop == "opacity" && ret == "" ) ret = "1"; @@ -1521,7 +1630,7 @@ jQuery.extend({ !s.indexOf("", ""] || - (!s.indexOf("", ""] || !s.indexOf("", ""] || !s.indexOf("", ""] || + [2, "", "
"] || + + // IE can't serialize and