X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=f40318b5dcbc0ea83e0a06dbfef60e46d3d0d695;hb=eabac3f6a189342cf8bb615de904f9f125374c67;hp=ebe1f8c5feb13ef9ed28df0551ea981c34f205fd;hpb=ed1e3f7e0501be92411bb7d9fd6c25ab1e81cc73;p=jquery.git diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index ebe1f8c..f40318b 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -176,7 +176,7 @@ jQuery.fn = jQuery.prototype = { // HANDLE: $(arraylike) // Watch for when an array-like object is passed as the selector - (a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) || + (a.jquery || a.length && a != window && (!a.nodeType || (jQuery.browser.msie && a.elements)) && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) || // HANDLE: $(*) [ a ] ); @@ -852,11 +852,30 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Manipulation */ clone: function(deep) { - return this.pushStack( jQuery.map( this, function(a){ - a = a.cloneNode( deep != undefined ? deep : true ); - a.$events = null; // drop $events expando to avoid firing incorrect events - return a; + // 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) + 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 ); }) ); + + // 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; + }); + + // Return the cloned set + return r; }, /** @@ -1349,7 +1368,7 @@ jQuery.extend({ // internal only, use removeClass("class") remove: function( elem, c ){ - elem.className = c ? + elem.className = c != undefined ? jQuery.grep( elem.className.split(/\s+/), function(cur){ return !jQuery.className.has( c, cur ); }).join(" ") : ""; @@ -1423,7 +1442,7 @@ jQuery.extend({ return ret == "" ? "1" : ret; } - if (prop == "float" || prop == "cssFloat") + if (prop.match(/float/i)) prop = jQuery.browser.msie ? "styleFloat" : "cssFloat"; if (!force && elem.style[prop]) @@ -1431,7 +1450,7 @@ jQuery.extend({ else if (document.defaultView && document.defaultView.getComputedStyle) { - if (prop == "cssFloat" || prop == "styleFloat") + if (prop.match(/float/i)) prop = "float"; prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase(); @@ -1465,13 +1484,13 @@ jQuery.extend({ if ( arg.constructor == Number ) arg = arg.toString(); - // Convert html string into DOM nodes + // Convert html string into DOM nodes if ( typeof arg == "string" ) { // Trim whitespace, otherwise indexOf won't work as expected var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = []; var wrap = - // option or optgroup + // option or optgroup !s.indexOf("", ""] || @@ -1523,7 +1542,7 @@ jQuery.extend({ if ( 0 === arg.length && !jQuery(arg).is("form, select") ) return; - if ( arg[0] == undefined || jQuery(arg).is("form, select") ) + if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options ) r.push( arg ); else r = jQuery.merge( r, arg ); @@ -1539,13 +1558,15 @@ jQuery.extend({ "class": "className", "float": jQuery.browser.msie ? "styleFloat" : "cssFloat", cssFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat", + styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat", innerHTML: "innerHTML", className: "className", value: "value", disabled: "disabled", checked: "checked", readonly: "readOnly", - selected: "selected" + selected: "selected", + maxlength: "maxLength" }; // IE actually uses filters for opacity ... elem is actually elem.style @@ -1799,7 +1820,7 @@ new function() { // Figure out what browser is being used jQuery.browser = { - version: b.match(/.+[xiae][\/ ]([\d.]+)/)[1], + version: b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)[1], safari: /webkit/.test(b), opera: /opera/.test(b), msie: /msie/.test(b) && !/opera/.test(b),