X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=537b4e2bec7a6b250e435ad4cf97ac827d45c3a6;hb=902554a38da6c9e2d0c115bc189634d56f9b4d34;hp=338df7f9601c2714388d07783268f10f4611aad1;hpb=139393fe0978e79c427ad13f1a03a10431ef95e5;p=jquery.git diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index 338df7f..537b4e2 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -228,8 +228,7 @@ jQuery.fn = jQuery.prototype = { jQuery.unique( data ) : data ); }, - clone: function(deep) { - deep = deep != undefined ? deep : true; + clone: function() { var $this = this.add(this.find("*")); if (jQuery.browser.msie) { // Need to remove events on the element and its descendants @@ -242,7 +241,7 @@ jQuery.fn = jQuery.prototype = { // Do the clone var r = this.pushStack( jQuery.map( this, function(a){ - return a.cloneNode( deep ); + return a.cloneNode( true ); }) ); if (jQuery.browser.msie) { @@ -257,15 +256,13 @@ jQuery.fn = jQuery.prototype = { } // copy form values over - if (deep) { - var inputs = r.add(r.find('*')).filter('select,input[@type=checkbox]'); - $this.filter('select,input[@type=checkbox]').each(function(i) { - if (this.selectedIndex) - inputs[i].selectedIndex = this.selectedIndex; - if (this.checked) - inputs[i].checked = true; - }); - } + var inputs = r.add(r.find('*')).filter('select,input[@type=checkbox]'); + $this.filter('select,input[@type=checkbox]').each(function(i) { + if (this.selectedIndex) + inputs[i].selectedIndex = this.selectedIndex; + if (this.checked) + inputs[i].checked = true; + }); // Return the cloned set return r; @@ -309,9 +306,32 @@ jQuery.fn = jQuery.prototype = { }, val: function( val ) { - return val == undefined ? - ( this.length ? this[0].value : null ) : - this.attr( "value", val ); + if ( val == undefined ) { + if ( this.length ) { + var elem = this[0]; + + // We need to handle select boxes special if ( jQuery.nodeName(elem, "select") ) { var index = elem.selectedIndex, + a = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected if ( index < 0 ) + return null; + + // Loop through all the selected options for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[i]; if ( option.selected ) { // Get the specifc value for the option var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value; + + // We don't need an array for one selects if ( one ) + return val; + + // Multi-Selects return an array a.push(val); } } + return a; + + // Everything else, we just grab the value } else + return this[0].value.replace(/\r/g, ""); + } + } else + return this.attr( "value", val ); }, html: function( val ) { @@ -328,13 +348,17 @@ jQuery.fn = jQuery.prototype = { return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); }, - map: function(fn){ + map: function(fn) { return this.pushStack(jQuery.map( this, function(elem,i){ return fn.call( elem, i, elem ); })); }, + + andSelf: function() { + return this.add( this.prevObject ); + }, - domManip: function(args, table, dir, fn){ + domManip: function(args, table, dir, fn) { var clone = this.length > 1, a; return this.each(function(){ @@ -619,6 +643,21 @@ jQuery.extend({ } else if (elem.currentStyle) { var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();}); ret = elem.currentStyle[prop] || elem.currentStyle[newProp]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test(ret) && /^\d/.test(ret) ) { + var style = elem.style.left; + var runtimeStyle = elem.runtimeStyle.left; + elem.runtimeStyle.left = elem.currentStyle.left; + elem.style.left = ret || 0; + ret = elem.style.pixelLeft + "px"; + elem.style.left = style; + elem.runtimeStyle.left = runtimeStyle; + } } return ret; @@ -636,6 +675,11 @@ jQuery.extend({ // Convert html string into DOM nodes if ( typeof arg == "string" ) { + // Fix "XHTML"-style tags in all browsers + arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+">"; + }); + // Trim whitespace, otherwise indexOf won't work as expected var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = []; @@ -731,9 +775,15 @@ jQuery.extend({ // IE elem.getAttribute passes even for style else if ( elem.tagName ) { - if ( value != undefined ) elem.setAttribute( name, value ); + if ( value != undefined ) { + if ( name == "type" && jQuery.nodeName(elem,"input") && elem.parentNode ) + throw "type property can't be changed"; + elem.setAttribute( name, value ); + } + if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) return elem.getAttribute( name, 2 ); + return elem.getAttribute( name ); // elem is actually elem.style ... set the style @@ -955,13 +1005,6 @@ jQuery.each( { }; }); -// DEPRECATED -jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){ - jQuery.fn[ n ] = function(num,fn) { - return this.filter( ":" + n + "(" + num + ")", fn ); - }; -}); - jQuery.each( [ "height", "width" ], function(i,n){ jQuery.fn[ n ] = function(h) { return h == undefined ?