X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=bc4bcd1e7972de9d6faa7449fcbc9202049ee175;hb=05d401dd8439d8a2137d3fb69a70d671c0d3a69d;hp=8e370f8ed8ca6fd0ecca6bff00327bc836a54d6b;hpb=42f30dd1812fc0ee262eaa43f0a354d8e439938c;p=jquery.git diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index 8e370f8..bc4bcd1 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -852,27 +852,43 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Manipulation */ clone: function(deep) { - // Need to remove events on the element and its descendants + deep = deep != undefined ? deep : true; var $this = this.add(this.find("*")); - $this.each(function() { - this._$events = {}; - for (var type in this.$events) - this._$events[type] = jQuery.extend({},this.$events[type]); - }).unbind(); + if (jQuery.browser.msie) { + // Need to remove events on the element and its descendants + $this.each(function() { + this._$events = {}; + for (var type in this.$events) + this._$events[type] = jQuery.extend({},this.$events[type]); + }).unbind(); + } // Do the clone var r = this.pushStack( jQuery.map( this, function(a){ - return a.cloneNode( deep != undefined ? deep : true ); + return a.cloneNode( deep ); }) ); - // Add the events back to the original and its descendants - $this.each(function() { - 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; - }); + if (jQuery.browser.msie) { + $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; + }); + } + + // 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; + }); + } // Return the cloned set return r; @@ -922,7 +938,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) ); @@ -1171,9 +1187,14 @@ jQuery.fn = jQuery.prototype = { obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody")); jQuery.each( a, function(){ - fn.apply( obj, [ clone ? this.cloneNode(true) : this ] ); + if ( jQuery.nodeName(this, "script") ) { + if ( this.src ) + jQuery.ajax({ url: this.src, async: false, dataType: "script" }); + else + jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" ); + } else + fn.apply( obj, [ clone ? this.cloneNode(true) : this ] ); }); - }); } }; @@ -1297,7 +1318,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 ) { @@ -1360,7 +1397,7 @@ jQuery.extend({ className: { // internal only, use addClass("class") add: function( elem, c ){ - jQuery.each( c.split(/\s+/), function(i, cur){ + jQuery.each( (c || "").split(/\s+/), function(i, cur){ if ( !jQuery.className.has( elem.className, cur ) ) elem.className += ( elem.className ? " " : "" ) + cur; }); @@ -1435,7 +1472,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"); @@ -1456,15 +1502,38 @@ 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"; } else if (elem.currentStyle) { var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();}); @@ -1497,7 +1566,7 @@ jQuery.extend({ !s.indexOf("", ""] || - (!s.indexOf("", ""] || !s.indexOf("= 0 ; --n ) if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length ) tb[n].parentNode.removeChild(tb[n]); - + + // IE completely kills leading whitespace when innerHTML is used + if ( /^\s/.test(arg) ) + div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild ); + } arg = jQuery.makeArray( div.childNodes ); @@ -1554,18 +1627,24 @@ 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] ) { if ( value != undefined ) elem[fix[name]] = value; return elem[fix[name]]; + } else if ( jQuery.browser.msie && name == "style" ) + return jQuery.attr( elem.style, "cssText", value ); - } else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") ) + else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") ) return elem.getAttributeNode(name).nodeValue; // IE elem.getAttribute passes even for style else if ( elem.tagName ) { - if ( value != undefined ) elem.setAttribute( name, value ); if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) @@ -1607,7 +1686,7 @@ jQuery.extend({ * @cat JavaScript */ trim: function(t){ - return t.replace(/^\s+|\s+$/g, ""); + return (t||"").replace(/^\s+|\s+$/g, ""); }, makeArray: function( a ) { @@ -1825,7 +1904,7 @@ new function() { // Check to see if the W3C box model is being used jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat"; - jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat", + jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat"; jQuery.props = { "for": "htmlFor", @@ -1842,6 +1921,7 @@ new function() { selected: "selected", maxlength: "maxLength" }; + }; /** @@ -1993,7 +2073,7 @@ jQuery.each({ var ret = jQuery.map(this,n); if ( a && typeof a == "string" ) ret = jQuery.multiFilter(a,ret); - return this.pushStack( ret ); + return this.pushStack( jQuery.unique(ret) ); }; });