Split out the fragment-building code from domManip. Switched core.js to using that...
[jquery.git] / src / core.js
index 097ff42..6553258 100644 (file)
@@ -20,7 +20,7 @@ var jQuery = function( selector, context ) {
 
        // A simple way to check for HTML strings or ID strings
        // (both of which we optimize for)
-       quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
+       quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
 
        // Is it a simple selector
        isSimple = /^.[^:#\[\.,]*$/,
@@ -31,6 +31,9 @@ var jQuery = function( selector, context ) {
        // Used for trimming whitespace
        rtrim = /^\s+|\s+$/g,
 
+       // Match a standalone tag
+       rsingleTag = /^<(\w+)\s*\/?>$/,
+
        // Keep a UserAgent string for use with jQuery.browser
        userAgent = navigator.userAgent.toLowerCase(),
 
@@ -39,15 +42,19 @@ var jQuery = function( selector, context ) {
        push = Array.prototype.push,
        slice = Array.prototype.slice;
 
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-
 jQuery.fn = jQuery.prototype = {
        init: function( selector, context ) {
-               var match, elem, ret;
+               var match, elem, ret, doc;
 
                // Handle $(""), $(null), or $(undefined)
-               if ( !selector ) return this;
+               if ( !selector ) {
+                       return this;
+               }
+
+               // $("body"): Shortcut for quickly finding the body element
+               if ( selector === "body" && !context && document.body ) {
+                       selector = document.body;
+               }
 
                // Handle $(DOMElement)
                if ( selector.nodeType ) {
@@ -66,16 +73,30 @@ jQuery.fn = jQuery.prototype = {
 
                                // HANDLE: $(html) -> $(array)
                                if ( match[1] ) {
-                                       selector = jQuery.clean( [ match[1] ], context );
+                                       doc = (context ? context.ownerDocument || context : document);
+
+                                       // If a single string is passed in and it's a single tag
+                                       // just do a createElement and skip the rest
+                                       ret = rsingleTag.exec( selector );
+
+                                       if ( ret ) {
+                                               selector = [ doc.createElement( ret[1] ) ];
+
+                                       } else {
+                                               ret = buildFragment( [ match[1] ], [ doc ] );
+                                               selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
+                                       }
 
                                // HANDLE: $("#id")
                                } else {
-                                       elem = document.getElementById( match[3] );
+                                       elem = document.getElementById( match[2] );
 
                                        if ( elem ) {
                                                // Handle the case where IE and Opera return items
                                                // by name instead of ID
-                                               if ( elem.id !== match[3] ) return rootjQuery.find( selector );
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
 
                                                // Otherwise, we inject the element directly into the jQuery object
                                                this.length++;
@@ -315,8 +336,8 @@ jQuery.extend({
        isXMLDoc: function( elem ) {
                // documentElement is verified for cases where it doesn't yet exist
                // (such as loading iframes in IE - #4833)
-               var documentElement = (elem.ownerDocument || elem).documentElement;
-               return !!documentElement && documentElement.nodeName !== "HTML";
+               var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+               return documentElement ? documentElement.nodeName !== "HTML" : false;
        },
 
        // Evalulates a script in a global context