X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=d27dcb9fd19506ff07cedb2913aeba337b099bbd;hb=32b3ac4f063571257b36477cc5dcb659cac2c357;hp=3b0c46567edfcd1aa58421d2f4765042a7573606;hpb=92a9e73bbef6f995c4b4fc6fb6c566432f2d0671;p=jquery.git diff --git a/src/core.js b/src/core.js index 3b0c465..d27dcb9 100644 --- a/src/core.js +++ b/src/core.js @@ -10,8 +10,8 @@ */ // Map over jQuery in case of overwrite -if ( typeof jQuery != "undefined" ) - var _jQuery = jQuery; +if ( window.jQuery ) + var _jQuery = window.jQuery; var jQuery = window.jQuery = function( selector, context ) { // If the context is a namespace object, return a new object @@ -21,8 +21,8 @@ var jQuery = window.jQuery = function( selector, context ) { }; // Map over the $ in case of overwrite -if ( typeof $ != "undefined" ) - var _$ = $; +if ( window.$ ) + var _$ = window.$; // Map the jQuery namespace to the '$' one window.$ = jQuery; @@ -331,7 +331,12 @@ jQuery.fn = jQuery.prototype = { }, add: function( selector ) { - return this.pushStack( jQuery.merge( this.get(), jQuery( selector ) ) ); + return this.pushStack( jQuery.merge( + this.get(), + selector.constructor == String ? + jQuery( selector ).get() : + selector.length != undefined && (!selector.nodeName || jQuery.nodeName(selector, "form")) ? + selector : [selector] ) ); }, is: function( selector ) { @@ -402,7 +407,7 @@ jQuery.fn = jQuery.prototype = { jQuery.inArray( this.text, values ) >= 0); }); - if ( !tmp.length ) + if ( !values.length ) this.selectedIndex = -1; } else @@ -456,39 +461,51 @@ jQuery.fn = jQuery.prototype = { if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) obj = this.getElementsByTagName("tbody")[0] || this.appendChild( document.createElement("tbody") ); + var scripts = jQuery( [] ); + jQuery.each(elems, function(){ var elem = clone ? this.cloneNode( true ) : this; - if ( !evalScript( 0, elem ) ) + if ( jQuery.nodeName( elem, "script" ) ) { + + // If scripts are waiting to be executed, wait on this script as well + if ( scripts.length ) + scripts = scripts.add( elem ); + + // If nothing is waiting to be executed, run immediately + else + evalScript( 0, elem ); + + } else { + // Remove any inner scripts for later evaluation + if ( elem.nodeType == 1 ) + scripts = scripts.add( jQuery( "script", elem ).remove() ); + + // Inject the elements into the document callback.call( obj, elem ); + } }); + + scripts.each( evalScript ); }); } }; function evalScript( i, elem ) { - var script = jQuery.nodeName( elem, "script" ); - - if ( script ) { - if ( elem.src ) - jQuery.ajax({ - url: elem.src, - async: false, - dataType: "script" - }); - - else - jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); - - if ( elem.parentNode ) - elem.parentNode.removeChild( elem ); + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); - } else if ( elem.nodeType == 1 ) - jQuery( "script", elem ).each( evalScript ); + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); - return script; + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); } jQuery.extend = jQuery.fn.extend = function() { @@ -499,8 +516,14 @@ jQuery.extend = jQuery.fn.extend = function() { if ( target.constructor == Boolean ) { deep = target; target = arguments[1] || {}; + // skip the boolean and the target + i = 2; } + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target != "object" ) + target = {}; + // extend jQuery itself if only one argument is passed if ( length == 1 ) { target = this; @@ -513,12 +536,12 @@ jQuery.extend = jQuery.fn.extend = function() { // Extend the base object for ( var name in options ) { // Prevent never-ending loop - if ( target == options[ name ] ) + if ( target === options[ name ] ) continue; // Recurse if we're merging object values - if ( deep && typeof options[ name ] == "object" && target[ name ] ) - jQuery.extend( target[ name ], options[ name ] ); + if ( deep && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType ) + target[ name ] = jQuery.extend( target[ name ], options[ name ] ); // Don't bring in undefined values else if ( options[ name ] != undefined ) @@ -564,15 +587,19 @@ jQuery.extend({ 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 ); - + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.browser.msie ) + script.text = data; else - eval.call( window, data ); + script.appendChild( document.createTextNode( data ) ); + + head.appendChild( script ); + head.removeChild( script ); } }, @@ -744,7 +771,7 @@ jQuery.extend({ // Otherwise, we need to flip out more values } else { elem = jQuery( elem.cloneNode(true) ) - .find(":radio").removeAttr("checked").end() + .find(":radio").removeAttr("checked").removeAttr("defaultChecked").end() .css({ visibility: "hidden", position: "absolute", @@ -837,7 +864,7 @@ jQuery.extend({ // one special, otherwise get the value ret = name == "display" && swap[ stack.length - 1 ] != null ? "none" : - document.defaultView.getComputedStyle( elem, null ).getPropertyValue( name ) || ""; + ( getComputedStyle && getComputedStyle.getPropertyValue( name ) ) || ""; // Finally, revert the display styles back for ( var i = 0; i < swap.length; i++ ) @@ -944,18 +971,18 @@ jQuery.extend({ div.firstChild && div.firstChild.childNodes : // String was a bare or - wrap[1] == "" && s.indexOf("" && tags.indexOf("= 0 ; --i ) if ( jQuery.nodeName( tbody[ i ], "tbody" ) && !tbody[ i ].childNodes.length ) tbody[ i ].parentNode.removeChild( tbody[ i ] ); - + // IE completely kills leading whitespace when innerHTML is used if ( /^\s/.test( elem ) ) div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild ); - + } elem = jQuery.makeArray( div.childNodes ); @@ -1178,7 +1205,8 @@ jQuery.extend({ readonly: "readOnly", selected: "selected", maxlength: "maxLength", - selectedIndex: "selectedIndex" + selectedIndex: "selectedIndex", + defaultValue: "defaultValue" } }); @@ -1242,17 +1270,21 @@ jQuery.each({ remove: function( selector ) { if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) { - jQuery.removeData( this ); - this.parentNode.removeChild( this ); + // Prevent memory leaks + jQuery( "*", this ).add(this).each(function(){ + jQuery.event.remove(this); + jQuery.removeData(this); + }); + if (this.parentNode) + this.parentNode.removeChild( this ); } }, empty: function() { - // Clean up the cache - jQuery( "*", this ).each(function(){ - jQuery.removeData(this); - }); - + // Remove element nodes and prevent memory leaks + jQuery( ">*", this ).remove(); + + // Remove any remaining nodes while ( this.firstChild ) this.removeChild( this.firstChild ); } @@ -1272,7 +1304,7 @@ jQuery.each([ "Height", "Width" ], function(i, name){ jQuery.browser.opera && document.body[ "client" + name ] || // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths) - jQuery.browser.safari && self[ "inner" + name ] || + jQuery.browser.safari && window[ "inner" + name ] || // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :