jquery core: Closes #3255. The div used in jQuery.clean is emptied in the end. Cleani...
[jquery.git] / src / core.js
index 7ddb2c5..0e02436 100644 (file)
@@ -81,7 +81,7 @@ jQuery.fn = jQuery.prototype = {
                // HANDLE: $(function)
                // Shortcut for document ready
                } else if ( jQuery.isFunction( selector ) )
-                       return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
+                       return jQuery( document ).ready( selector );
 
                return this.setArray(jQuery.makeArray(selector));
        },
@@ -338,6 +338,17 @@ jQuery.fn = jQuery.prototype = {
                        }) ), "filter", selector );
        },
 
+       closest: function( selector ) {
+               return this.map(function(){
+                       var cur = this;
+                       while ( cur && cur.ownerDocument ) {
+                               if ( jQuery(cur).is(selector) )
+                                       return cur;
+                               cur = cur.parentNode;
+                       }
+               });
+       },
+
        not: function( selector ) {
                if ( typeof selector === "string" )
                        // test special case where just one selector is passed in
@@ -898,13 +909,14 @@ jQuery.extend({
        },
 
        clean: function( elems, context, fragment ) {
-               var ret = [], scripts = [];
                context = context || document;
 
                // !context.createElement fails in IE with an error but returns typeof 'object'
                if ( typeof context.createElement === "undefined" )
                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
 
+               var ret = [], scripts = [], div = context.createElement("div");
+
                jQuery.each(elems, function(i, elem){
                        if ( typeof elem === "number" )
                                elem += '';
@@ -922,7 +934,7 @@ jQuery.extend({
                                });
 
                                // Trim whitespace, otherwise indexOf won't work as expected
-                               var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
+                               var tags = jQuery.trim( elem ).toLowerCase();
 
                                var wrap =
                                        // option or optgroup
@@ -998,6 +1010,9 @@ jQuery.extend({
                                ret = jQuery.merge( ret, elem );
 
                });
+
+               // Clean up
+               div.innerHTML = "";
                
                if ( fragment ) {
                        for ( var i = 0; ret[i]; i++ ) {
@@ -1138,12 +1153,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.support.getAll ) {
-                       while ( (elem = second[ i++ ]) )
+                       while ( (elem = second[ i++ ]) != null )
                                if ( elem.nodeType != 8 )
                                        first[ pos++ ] = elem;
 
                } else
-                       while ( (elem = second[ i++ ]) )
+                       while ( (elem = second[ i++ ]) != null )
                                first[ pos++ ] = elem;
 
                return first;