X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fcore.js;h=0f274255f811dbc72b20e71dcd571657166bf23b;hb=74a132d944886379456d562990c8fb217ab332e3;hp=3cfabe3a044fda67fc46e79fd8a0fc053c820453;hpb=92aac3abd6bc493a0c5f216e2e51359024b90af1;p=jquery.git diff --git a/src/core.js b/src/core.js index 3cfabe3..0f27425 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; @@ -36,8 +36,14 @@ jQuery.fn = jQuery.prototype = { // Make sure that a selection was provided selector = selector || document; + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + return this; + // Handle HTML strings - if ( typeof selector == "string" ) { + } else if ( typeof selector == "string" ) { // Are we dealing with HTML string or an ID? var match = quickExpr.exec( selector ); @@ -188,12 +194,15 @@ jQuery.fn = jQuery.prototype = { }, css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; return this.attr( key, value, "curCSS" ); }, text: function( text ) { if ( typeof text != "object" && text != null ) - return this.empty().append( document.createTextNode( text ) ); + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); var ret = ""; @@ -354,7 +363,7 @@ jQuery.fn = jQuery.prototype = { if ( this.length ) { var elem = this[0]; - + // We need to handle select boxes special if ( jQuery.nodeName( elem, "select" ) ) { var index = elem.selectedIndex, @@ -387,7 +396,7 @@ jQuery.fn = jQuery.prototype = { // Everything else, we just grab the value } else - return this[0].value.replace(/\r/g, ""); + return (this[0].value || "").replace(/\r/g, ""); } @@ -407,7 +416,7 @@ jQuery.fn = jQuery.prototype = { jQuery.inArray( this.text, values ) >= 0); }); - if ( !tmp.length ) + if ( !values.length ) this.selectedIndex = -1; } else @@ -459,41 +468,53 @@ jQuery.fn = jQuery.prototype = { var obj = this; if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) - obj = this.getElementsByTagName("tbody")[0] || this.appendChild( document.createElement("tbody") ); + obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.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() { @@ -504,8 +525,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" && typeof target != "function" ) + target = {}; + // extend jQuery itself if only one argument is passed if ( length == 1 ) { target = this; @@ -518,12 +545,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 && options[ name ] && 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,7 +591,6 @@ jQuery.extend({ }, // Evalulates a script in a global context - // Evaluates Async. in Safari 2 :-( globalEval: function( data ) { data = jQuery.trim( data ); @@ -731,7 +757,7 @@ jQuery.extend({ elem.style[ name ] = elem.style[ "old" + name ]; }, - css: function( elem, name ) { + css: function( elem, name, force ) { if ( name == "height" || name == "width" ) { var old = {}, height, width; @@ -753,7 +779,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", @@ -781,7 +807,7 @@ jQuery.extend({ width; } - return jQuery.curCSS( elem, name ); + return jQuery.curCSS( elem, name, force ); }, curCSS: function( elem, name, force ) { @@ -846,7 +872,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++ ) @@ -891,6 +917,8 @@ jQuery.extend({ clean: function( elems, context ) { var ret = []; context = context || document; + if (!context.createElement) + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; jQuery.each(elems, function(i, elem){ if ( !elem ) @@ -914,7 +942,7 @@ jQuery.extend({ var wrap = // option or optgroup !tags.indexOf("", "" ] || + [ 1, "" ] || !tags.indexOf("", "" ] || @@ -1015,7 +1043,8 @@ jQuery.extend({ if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode ) throw "type property can't be changed"; - elem.setAttribute( name, value ); + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); } if ( jQuery.browser.msie && /href|src/.test( name ) && !jQuery.isXMLDoc( elem ) ) @@ -1037,7 +1066,7 @@ jQuery.extend({ (parseFloat( value ).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); } - return elem.filter ? + return elem.filter && elem.filter.indexOf("opacity=") >= 0 ? (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : ""; } @@ -1187,7 +1216,10 @@ jQuery.extend({ readonly: "readOnly", selected: "selected", maxlength: "maxLength", - selectedIndex: "selectedIndex" + selectedIndex: "selectedIndex", + defaultValue: "defaultValue", + tagName: "tagName", + nodeName: "nodeName" } }); @@ -1256,7 +1288,8 @@ jQuery.each({ jQuery.event.remove(this); jQuery.removeData(this); }); - this.parentNode.removeChild( this ); + if (this.parentNode) + this.parentNode.removeChild( this ); } }, @@ -1284,7 +1317,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 ] : @@ -1293,7 +1326,7 @@ jQuery.each([ "Height", "Width" ], function(i, name){ this[0] == document ? // Either scroll[Width/Height] or offset[Width/Height], whichever is greater (Mozilla reports scrollWidth the same as offsetWidth) Math.max( document.body[ "scroll" + name ], document.body[ "offset" + name ] ) : - + // Get or set width or height on the element size == undefined ? // Get width or height on the element