X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fcore.js;h=c712cc28b91a3229a61b98b4288cd7da7bc83552;hb=6f2f1830a4cbf8c9a6a74e80e920915f87673119;hp=1d27616ddc0e8bf10f6c4b0f0aa58da1410f2897;hpb=615a4ce1b4c20e5b538332d0a6e19157243a9471;p=jquery.git diff --git a/src/core.js b/src/core.js index 1d27616..c712cc2 100644 --- a/src/core.js +++ b/src/core.js @@ -38,6 +38,7 @@ jQuery.fn = jQuery.prototype = { if ( selector.nodeType ) { this[0] = selector; this.length = 1; + this.context = selector; return this; } // Handle HTML strings @@ -64,7 +65,10 @@ jQuery.fn = jQuery.prototype = { return jQuery().find( selector ); // Otherwise, we inject the element directly into the jQuery object - return jQuery( elem ); + var ret = jQuery( elem ); + ret.context = document; + ret.selector = selector; + return ret; } selector = []; } @@ -82,6 +86,9 @@ jQuery.fn = jQuery.prototype = { return this.setArray(jQuery.makeArray(selector)); }, + // Start with an empty selector + selector: "", + // The current version of jQuery being used jquery: "@VERSION", @@ -104,13 +111,20 @@ jQuery.fn = jQuery.prototype = { // Take an array of elements and push it onto the stack // (returning the new matched element set) - pushStack: function( elems ) { + pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = jQuery( elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; + ret.context = this.context; + + if ( name === "find" ) + ret.selector = this.selector + (this.selector ? " " : "") + selector; + else if ( name ) + ret.selector = this.selector + "." + name + "(" + selector + ")"; + // Return the newly-formed element set return ret; }, @@ -229,27 +243,27 @@ jQuery.fn = jQuery.prototype = { }, append: function() { - return this.domManip(arguments, true, false, function(elem){ + return this.domManip(arguments, true, function(elem){ if (this.nodeType == 1) this.appendChild( elem ); }); }, prepend: function() { - return this.domManip(arguments, true, true, function(elem){ + return this.domManip(arguments, true, function(elem){ if (this.nodeType == 1) this.insertBefore( elem, this.firstChild ); }); }, before: function() { - return this.domManip(arguments, false, false, function(elem){ + return this.domManip(arguments, false, function(elem){ this.parentNode.insertBefore( elem, this ); }); }, after: function() { - return this.domManip(arguments, false, true, function(elem){ + return this.domManip(arguments, false, function(elem){ this.parentNode.insertBefore( elem, this.nextSibling ); }); }, @@ -265,7 +279,7 @@ jQuery.fn = jQuery.prototype = { return this.pushStack( /[^+>] [^+>]/.test( selector ) ? jQuery.unique( elems ) : - elems ); + elems, "find", selector ); }, clone: function( events ) { @@ -319,14 +333,16 @@ jQuery.fn = jQuery.prototype = { return selector.call( elem, i ); }) || - jQuery.multiFilter( selector, this ) ); + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ + return elem.nodeType === 1; + }) ), "filter", selector ); }, not: function( selector ) { if ( typeof selector === "string" ) // test special case where just one selector is passed in if ( isSimple.test( selector ) ) - return this.pushStack( jQuery.multiFilter( selector, this, true ) ); + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); else selector = jQuery.multiFilter( selector, this ); @@ -350,7 +366,7 @@ jQuery.fn = jQuery.prototype = { }, hasClass: function( selector ) { - return this.is( "." + selector ); + return !!selector && this.is( "." + selector ); }, val: function( value ) { @@ -444,7 +460,8 @@ jQuery.fn = jQuery.prototype = { }, slice: function() { - return this.pushStack( Array.prototype.slice.apply( this, arguments ) ); + return this.pushStack( Array.prototype.slice.apply( this, arguments ), + "slice", Array.prototype.slice.call(arguments).join(",") ); }, map: function( callback ) { @@ -467,7 +484,7 @@ jQuery.fn = jQuery.prototype = { if ( data === undefined && this.length ) data = jQuery.data( this[0], key ); - return data === undefined && parts[1] ? + return data == null && parts[1] ? this.data( parts[0] ) : data; } else @@ -482,44 +499,29 @@ jQuery.fn = jQuery.prototype = { }); }, - domManip: function( args, table, reverse, callback ) { - var clone = this.length > 1, elems; - - return this.each(function(){ - if ( !elems ) { - elems = jQuery.clean( args, this.ownerDocument ); - - if ( reverse ) - elems.reverse(); - } - - var obj = this; - - if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) ) - obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") ); - - var scripts = jQuery( [] ); - - jQuery.each(elems, function(){ - var elem = clone ? - jQuery( this ).clone( true )[0] : - this; - - // execute all scripts after the elements have been injected - if ( jQuery.nodeName( elem, "script" ) ) - scripts = scripts.add( elem ); - else { - // Remove any inner scripts for later evaluation - if ( elem.nodeType == 1 ) - scripts = scripts.add( jQuery( "script", elem ).remove() ); - - // Inject the elements into the document - callback.call( obj, elem ); - } - }); + domManip: function( args, table, callback ) { + if ( this[0] ) { + var fragment = document.createDocumentFragment(), + scripts = jQuery.clean( args, this[0].ownerDocument, fragment ), + first = fragment.firstChild, + extra = this.length > 1 ? fragment.cloneNode(true) : fragment; + + if ( first ) + for ( var i = 0, l = this.length; i < l; i++ ) + callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment ); + + if ( scripts ) + jQuery.each( scripts, evalScript ); + } - scripts.each( evalScript ); - }); + return this; + + function root( elem, cur ) { + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; + } } }; @@ -680,7 +682,7 @@ jQuery.extend({ // Return the named cache data, or the ID for the element return name ? - jQuery.cache[ id ][ name ] : + jQuery.cache[ id ][ name ] || null : id; }, @@ -940,8 +942,8 @@ jQuery.extend({ return ret; }, - clean: function( elems, context ) { - var ret = []; + clean: function( elems, context, fragment ) { + var ret = [], scripts = []; context = context || document; // !context.createElement fails in IE with an error but returns typeof 'object' @@ -1022,20 +1024,39 @@ jQuery.extend({ div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild ); } + + if ( fragment ) { + var found = div.getElementsByTagName("script"); + + while ( found.length ) { + scripts.push( found[0] ); + found[0].parentNode.removeChild( found[0] ); + } + } elem = jQuery.makeArray( div.childNodes ); } - if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) ) - return; - - if ( elem[0] === undefined || jQuery.nodeName( elem, "form" ) || elem.options ) + if ( elem.nodeType ) ret.push( elem ); - else ret = jQuery.merge( ret, elem ); }); + + if ( fragment ) { + for ( var i = 0; ret[i]; i++ ) { + if ( jQuery.nodeName( ret[i], "script" ) ) { + ret[i].parentNode.removeChild( ret[i] ); + } else { + if ( ret[i].nodeType === 1 ) + ret = jQuery.merge( ret, ret[i].getElementsByTagName("script")); + fragment.appendChild( ret[i] ); + } + } + + return scripts; + } return ret; }, @@ -1163,12 +1184,12 @@ jQuery.extend({ // Also, we need to make sure that the correct elements are being returned // (IE returns comment nodes in a '*' query) if ( jQuery.browser.msie ) { - while ( elem = second[ i++ ] ) + while ( (elem = second[ i++ ]) ) if ( elem.nodeType != 8 ) first[ pos++ ] = elem; } else - while ( elem = second[ i++ ] ) + while ( (elem = second[ i++ ]) ) first[ pos++ ] = elem; return first; @@ -1272,7 +1293,7 @@ jQuery.each({ if ( selector && typeof selector == "string" ) ret = jQuery.multiFilter( selector, ret ); - return this.pushStack( jQuery.unique( ret ) ); + return this.pushStack( jQuery.unique( ret ), name, selector ); }; }); @@ -1313,7 +1334,7 @@ jQuery.each({ }, remove: function( selector ) { - if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) { + if ( !selector || jQuery.filter( selector, [ this ] ).length ) { // Prevent memory leaks jQuery( "*", this ).add([this]).each(function(){ jQuery.event.remove(this);