Fixed an issue with how .data() was expecting output (trigger now returns exact outpu...
[jquery.git] / src / core.js
index 1d27616..685ca2b 100644 (file)
@@ -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,14 @@ jQuery.fn = jQuery.prototype = {
                                return selector.call( elem, i );
                        }) ||
 
-                       jQuery.multiFilter( selector, this ) );
+                       jQuery.multiFilter( selector, this ), "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 +364,7 @@ jQuery.fn = jQuery.prototype = {
        },
 
        hasClass: function( selector ) {
-               return this.is( "." + selector );
+               return !!selector && this.is( "." + selector );
        },
 
        val: function( value ) {
@@ -444,7 +458,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 +482,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 +497,28 @@ 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;
+                       
+                       if ( first )
+                               for ( var i = 0, l = this.length; i < l; i++ )
+                                       callback.call( root(this[i], first), this.length > 1 ? fragment.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 +679,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 +939,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 +1021,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 +1181,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 +1290,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 );
        };
 });