X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=705a5bb9cfef4a067070f7a49c1d8f52dbafa292;hb=d8e9f0c616402ed1b4dab244ff5f8680ed0a415f;hp=b4202c8535390f40b7e5d11e0c6dc6112276875b;hpb=9b9a7932735d43a936c74084a613f21b250de6f9;p=jquery.git diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index b4202c8..705a5bb 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -852,9 +852,10 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Manipulation */ clone: function(deep) { + 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 - var $this = this.add(this.find("*")); $this.each(function() { this._$events = {}; for (var type in this.$events) @@ -864,23 +865,28 @@ jQuery.fn = jQuery.prototype = { // Do the clone var r = this.pushStack( jQuery.map( this, function(a){ - return a.cloneNode( deep != undefined ? deep : true ); + return a.cloneNode( deep ); }) ); if (jQuery.browser.msie) { - // Add the events back to the original and its descendants $this.each(function() { + // Add the events back to the original and its descendants var events = this._$events; for (var type in events) for (var handler in events[type]) jQuery.event.add(this, type, events[type][handler], events[type][handler].data); this._$events = null; }); - - // set selected values of select elements - var selects = r.find('select'); - $this.filter('select').each(function(i) { - selects[i].selectedIndex = this.selectedIndex; + } + + // 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; }); } @@ -1312,7 +1318,8 @@ 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; }, nodeName: function( elem, name ) { @@ -1450,7 +1457,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"); @@ -1471,15 +1487,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; 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"; @@ -1572,6 +1608,11 @@ jQuery.extend({ attr: function(elem, name, value){ var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props; + + // Safari mis-reports the default selected property of a hidden option + // Accessing the parent's selectedIndex property fixes it + if ( name == "selected" && jQuery.browser.safari ) + elem.parentNode.selectedIndex; // Certain attributes only work when accessed via the old DOM 0 way if ( fix[name] ) {