X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=fbd569629ce8946dff0d5fe1abd0b9fc246e16a6;hb=108f308eaae62a78bd4dc8863f8c026f8828ef48;hp=d04aa6199a0ec381b72f8420f78d556566db60ac;hpb=74a8e206231162b005d95b667343678f786ae272;p=jquery.git diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index d04aa61..fbd5696 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -26,37 +26,8 @@ var jQuery = function(a,c) { // If the context is global, return a new object if ( window == this ) return new jQuery(a,c); - - // Make sure that a selection was provided - a = a || document; - - // HANDLE: $(function) - // Shortcut for document ready - if ( jQuery.isFunction(a) ) - return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a ); - // Handle HTML strings - if ( typeof a == "string" ) { - // HANDLE: $(html) -> $(array) - var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a); - if ( m ) - a = jQuery.clean( [ m[1] ] ); - - // HANDLE: $(expr) - else - return new jQuery( c ).find( a ); - } - - return this.setArray( - // HANDLE: $(array) - a.constructor == Array && a || - - // 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 ) || - - // HANDLE: $(*) - [ a ] ); + return this.init(a,c); }; // Map over the $ in case of overwrite @@ -170,6 +141,48 @@ var $ = jQuery; jQuery.fn = jQuery.prototype = { /** + * Initialize a new jQuery object + * + * @private + * @name init + * @param String|Function|Element|Array|jQuery a selector + * @param jQuery|Element|Array c context + * @cat Core + */ + init: function(a,c) { + // Make sure that a selection was provided + a = a || document; + + // HANDLE: $(function) + // Shortcut for document ready + if ( jQuery.isFunction(a) ) + return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a ); + + // Handle HTML strings + if ( typeof a == "string" ) { + // HANDLE: $(html) -> $(array) + var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a); + if ( m ) + a = jQuery.clean( [ m[1] ] ); + + // HANDLE: $(expr) + else + return new jQuery( c ).find( a ); + } + + return this.setArray( + // HANDLE: $(array) + a.constructor == Array && a || + + // HANDLE: $(arraylike) + // Watch for when an array-like object is passed as the selector + (a.jquery || a.length && a != window && (!a.nodeType || (jQuery.browser.msie && a.elements)) && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) || + + // HANDLE: $(*) + [ a ] ); + }, + + /** * The current version of jQuery. * * @private @@ -839,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; }, /** @@ -1336,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(" ") : ""; @@ -1465,7 +1497,7 @@ jQuery.extend({ !s.indexOf("", ""] || - (!s.indexOf("", ""] || !s.indexOf("", ""] || + !s.indexOf("", ""] || + [0,"",""]; // Go to html and back, then peel off extra wrappers @@ -1507,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 ); @@ -1529,7 +1564,8 @@ jQuery.extend({ disabled: "disabled", checked: "checked", readonly: "readOnly", - selected: "selected" + selected: "selected", + maxlength: "maxLength" }; // IE actually uses filters for opacity ... elem is actually elem.style @@ -1783,7 +1819,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),