Added a fix for .append( Number )
[jquery.git] / src / jquery / jquery.js
index 4543b72..70a16e6 100644 (file)
@@ -154,10 +154,18 @@ var $ = jQuery;
  * });
  * @desc Executes the function when the DOM is ready to be used.
  *
+ * @example jQuery(function($) {
+ *   // Your code using failsafe $ alias here...
+ * });
+ * @desc Uses both the shortcut for $(document).ready() and the argument
+ * to write failsafe jQuery code using the $ alias, without relying on the
+ * global alias.
+ *
  * @name $
  * @param Function fn The function to execute when the DOM is ready.
  * @cat Core
  * @type jQuery
+ * @see ready(Function)
  */
 
 jQuery.fn = jQuery.prototype = {
@@ -432,7 +440,7 @@ jQuery.fn = jQuery.prototype = {
                        for ( var prop in obj )
                                jQuery.attr(
                                        type ? this.style : this,
-                                       prop, jQuery.prop(this, obj[prop])
+                                       prop, jQuery.prop(this, obj[prop], type)
                                );
                });
        },
@@ -477,16 +485,22 @@ jQuery.fn = jQuery.prototype = {
 
        /**
         * Set a single style property to a value, on all matched elements.
+        * If a number is provided, it is automatically converted into a pixel value.
         *
         * @example $("p").css("color","red");
         * @before <p>Test Paragraph.</p>
         * @result <p style="color:red;">Test Paragraph.</p>
         * @desc Changes the color of all paragraphs to red
         *
+        * @example $("p").css("left",30);
+        * @before <p>Test Paragraph.</p>
+        * @result <p style="left:30px;">Test Paragraph.</p>
+        * @desc Changes the left of all paragraphs to "30px"
+        *
         * @name css
         * @type jQuery
         * @param String key The name of the property to set.
-        * @param Object value The value to set the property to.
+        * @param String|Number value The value to set the property to.
         * @cat CSS
         */
        css: function( key, value ) {
@@ -534,7 +548,7 @@ jQuery.fn = jQuery.prototype = {
                        "textContent" : "innerText";
                        
                return e == undefined ?
-                       this.length && this[0][ type ] :
+                       jQuery.map(this, function(a){ return a[ type ]; }).join('') :
                        this.each(function(){ this[ type ] = e; });
        },
 
@@ -799,6 +813,7 @@ jQuery.fn = jQuery.prototype = {
         *
         * @name clone
         * @type jQuery
+        * @param Boolean deep (Optional) Set to false if you don't want to clone all descendant nodes, in addition to the element itself.
         * @cat DOM/Manipulation
         */
        clone: function(deep) {
@@ -812,21 +827,21 @@ jQuery.fn = jQuery.prototype = {
         * match the specified expression(s). This method is used to narrow down
         * the results of a search.
         *
-        * Provide a String array of expressions to apply multiple filters at once.
+        * Provide a comma-separated list of expressions to apply multiple filters at once.
         *
         * @example $("p").filter(".selected")
         * @before <p class="selected">Hello</p><p>How are you?</p>
         * @result [ <p class="selected">Hello</p> ]
         * @desc Selects all paragraphs and removes those without a class "selected".
         *
-        * @example $("p").filter([".selected", ":first"])
+        * @example $("p").filter(".selected, :first")
         * @before <p>Hello</p><p>Hello Again</p><p class="selected">And Again</p>
         * @result [ <p>Hello</p>, <p class="selected">And Again</p> ]
         * @desc Selects all paragraphs and removes those without class "selected" and being the first one.
         *
         * @name filter
         * @type jQuery
-        * @param String|Array<String> expression Expression(s) to search with.
+        * @param String expression Expression(s) to search with.
         * @cat DOM/Traversing
         */
         
@@ -849,21 +864,12 @@ jQuery.fn = jQuery.prototype = {
         */
        filter: function(t) {
                return this.pushStack(
-                       t.constructor == Array &&
-                       jQuery.map(this,function(a){
-                               for ( var i = 0, tl = t.length; i < tl; i++ )
-                                       if ( jQuery.filter(t[i],[a]).r.length )
-                                               return a;
-                               return null;
+                       t.constructor == Function &&
+                       jQuery.grep(this, function(el, index){
+                               return t.apply(el, [index])
                        }) ||
 
-                       t.constructor == Boolean &&
-                       ( t ? this.get() : [] ) ||
-
-                       typeof t == "function" &&
-                       jQuery.grep( this, function(el, index) { return t.apply(el, [index]) }) ||
-
-                       jQuery.filter(t,this).r );
+                       jQuery.multiFilter(t,this) );
        },
 
        /**
@@ -896,10 +902,33 @@ jQuery.fn = jQuery.prototype = {
         * @param String expr An expression with which to remove matching elements
         * @cat DOM/Traversing
         */
+
+       /**
+        * Removes any elements inside the array of elements from the set
+        * of matched elements. This method is used to remove one or more
+        * elements from a jQuery object.
+        *
+        * @example $("p").not( $("div p.selected") )
+        * @before <div><p>Hello</p><p class="selected">Hello Again</p></div>
+        * @result [ <p>Hello</p> ]
+        * @desc Removes all elements that match "div p.selected" from the total set of all paragraphs.
+        *
+        * @name not
+        * @type jQuery
+        * @param Array|jQuery elems A set of elements to remove from the jQuery set of matched elements.
+        * @cat DOM/Traversing
+        */
        not: function(t) {
-               return this.pushStack( typeof t == "string" ?
-                       jQuery.filter(t,this,true).r :
-                       jQuery.grep(this,function(a){ return a != t; }) );
+               return this.pushStack(
+                       t.constructor == String &&
+                       jQuery.multiFilter(t,this,true) ||
+
+                       jQuery.grep(this,function(a){
+                                       if ( t.constructor == Array || t.jquery )
+                                               return jQuery.inArray( t, a ) < 0;
+                                       else
+                                               return a != t;
+                       }) );
        },
 
        /**
@@ -1007,7 +1036,9 @@ jQuery.fn = jQuery.prototype = {
         * @cat DOM/Attributes
         */
        val: function( val ) {
-               return val == undefined ?\r                      ( this.length ? this[0].value : null ) :\r                       this.attr( "value", val );
+               return val == undefined ?
+                       ( this.length ? this[0].value : null ) :
+                       this.attr( "value", val );
        },
        
        /**
@@ -1037,7 +1068,9 @@ jQuery.fn = jQuery.prototype = {
         * @cat DOM/Attributes
         */
        html: function( val ) {
-               return val == undefined ?\r                      ( this.length ? this[0].innerHTML : null ) :\r                   this.empty().append( val );
+               return val == undefined ?
+                       ( this.length ? this[0].innerHTML : null ) :
+                       this.empty().append( val );
        },
        
        /**
@@ -1218,10 +1251,16 @@ jQuery.extend({
                return obj;
        },
        
-       prop: function(elem, value){
-               // Handle executable functions
-               return value.constructor == Function &&
-                       value.call( elem ) || value;
+       prop: function(elem, value, type){
+                       // Handle executable functions
+                       if ( value.constructor == Function )
+                               return value.call( elem );
+
+                       // Handle passing in a number to a CSS property
+                       if ( value.constructor == Number && type == "css" )
+                               return value + "px";
+
+                       return value;
        },
 
        className: {
@@ -1344,9 +1383,14 @@ jQuery.extend({
        
        clean: function(a) {
                var r = [];
-               
+
                for ( var i = 0, al = a.length; i < al; i++ ) {
                        var arg = a[i];
+
+                       if ( !arg ) continue;
+
+                       if ( arg.constructor == Number )
+                               arg = arg.toString();
                        
                         // Convert html string into DOM nodes
                        if ( typeof arg == "string" ) {
@@ -1397,7 +1441,7 @@ jQuery.extend({
                                arg = div.childNodes;
                        }
                        
-                       if ( arg.nodeType )
+                       if ( arg[0] == undefined )
                                r.push( arg );
                        else
                                r = jQuery.merge( r, arg );
@@ -1828,7 +1872,7 @@ jQuery.each({
        jQuery.fn[ i ] = function(a) {
                var ret = jQuery.map(this,n);
                if ( a && typeof a == "string" )
-                       ret = jQuery.filter(a,ret).r;
+                       ret = jQuery.multiFilter(a,ret);
                return this.pushStack( ret );
        };
 });
@@ -2109,3 +2153,71 @@ jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){
                return this.filter( ":" + n + "(" + num + ")", fn );
        };
 });
+
+/**
+ * Get the current computed, pixel, width of the first matched element.
+ *
+ * @example $("p").width();
+ * @before <p>This is just a test.</p>
+ * @result 300
+ *
+ * @name width
+ * @type String
+ * @cat CSS
+ */
+
+/**
+ * Set the CSS width of every matched element. If no explicit unit
+ * was specified (like 'em' or '%') then "px" is added to the width.
+ *
+ * @example $("p").width(20);
+ * @before <p>This is just a test.</p>
+ * @result <p style="width:20px;">This is just a test.</p>
+ *
+ * @example $("p").width("20em");
+ * @before <p>This is just a test.</p>
+ * @result <p style="width:20em;">This is just a test.</p>
+ *
+ * @name width
+ * @type jQuery
+ * @param Number|String val Set the CSS property to the specified value.
+ * @cat CSS
+ */
+/**
+ * Get the current computed, pixel, height of the first matched element.
+ *
+ * @example $("p").height();
+ * @before <p>This is just a test.</p>
+ * @result 300
+ *
+ * @name height
+ * @type String
+ * @cat CSS
+ */
+
+/**
+ * Set the CSS width of every matched element. If no explicit unit
+ * was specified (like 'em' or '%') then "px" is added to the width.
+ *
+ * @example $("p").height(20);
+ * @before <p>This is just a test.</p>
+ * @result <p style="height:20px;">This is just a test.</p>
+ *
+ * @example $("p").height("20em");
+ * @before <p>This is just a test.</p>
+ * @result <p style="height:20em;">This is just a test.</p>
+ *
+ * @name height
+ * @type jQuery
+ * @param Number|String val Set the CSS property to the specified value.
+ * @cat CSS
+ */
+
+jQuery.each( [ "height", "width" ], function(i,n){
+       jQuery.fn[ n ] = function(h) {
+               return h == undefined ?
+                       ( this.length ? jQuery.css( this[0], n ) : null ) :
+                       this.css( n, h.constructor == String ? h : h + "px" );
+       };
+});