X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=4543b7228fb3dc4755d0af8c8a377917943b605d;hb=62303ad5efa11f0524dde236c91e8cb33ca87b3e;hp=f6e2adec48a593f38caabd46bd077e810f1427ac;hpb=789f0e1093beb559bb2acef708cc4b27c00f557d;p=jquery.git diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index f6e2ade..4543b72 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -160,21 +160,6 @@ var $ = jQuery; * @type jQuery */ -/** - * A means of creating a cloned copy of a jQuery object. This function - * copies the set of matched elements from one jQuery object and creates - * another, new, jQuery object containing the same elements. - * - * @example var div = $("div"); - * $( div ).find("p"); - * @desc Locates all p elements with all div elements, without disrupting the original jQuery object contained in 'div' (as would normally be the case if a simple div.find("p") was done). - * - * @name $ - * @param jQuery obj The jQuery object to be cloned. - * @cat Core - * @type jQuery - */ - jQuery.fn = jQuery.prototype = { /** * The current version of jQuery. @@ -260,16 +245,16 @@ jQuery.fn = jQuery.prototype = { * Set the jQuery object to an array of elements, while maintaining * the stack. * - * @example $("img").set([ document.body ]); - * @result $("img").set() == [ document.body ] + * @example $("img").pushStack([ document.body ]); + * @result $("img").pushStack() == [ document.body ] * * @private - * @name set + * @name pushStack * @type jQuery * @param Elements elems An array of elements * @cat Core */ - set: function( a ) { + pushStack: function( a ) { var ret = jQuery(this); ret.prevObject = this; return ret.setArray( a ); @@ -277,7 +262,7 @@ jQuery.fn = jQuery.prototype = { /** * Set the jQuery object to an array of elements. This operation is - * completely destructive - be sure to use .set() if you wish to maintain + * completely destructive - be sure to use .pushStack() if you wish to maintain * the jQuery stack. * * @example $("img").setArray([ document.body ]); @@ -430,28 +415,26 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Attributes */ attr: function( key, value, type ) { + var obj = key; + + // Look for the case where we're accessing a style value + if ( key.constructor == String ) + if ( value == undefined ) + return jQuery[ type || "attr" ]( this[0], key ); + else { + obj = {}; + obj[ key ] = value; + } + // Check to see if we're setting style values - return typeof key != "string" || value != undefined ? - this.each(function(){ - // See if we're setting a hash of styles - if ( value == undefined ) - // Set all the styles - for ( var prop in key ) - jQuery.attr( - type ? this.style : this, - prop, jQuery.prop(this, prop, key[prop], type) - ); - - // See if we're setting a single key/value style - else - jQuery.attr( - type ? this.style : this, - key, jQuery.prop(this, key, value, type) - ); - }) : - - // Look for the case where we're accessing a style value - jQuery[ type || "attr" ]( this[0], key ); + return this.each(function(){ + // Set all the styles + for ( var prop in obj ) + jQuery.attr( + type ? this.style : this, + prop, jQuery.prop(this, obj[prop]) + ); + }); }, /** @@ -798,7 +781,7 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Traversing */ find: function(t) { - return this.set( jQuery.map( this, function(a){ + return this.pushStack( jQuery.map( this, function(a){ return jQuery.find(t,a); }) ); }, @@ -819,7 +802,7 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Manipulation */ clone: function(deep) { - return this.set( jQuery.map( this, function(a){ + return this.pushStack( jQuery.map( this, function(a){ return a.cloneNode( deep != undefined ? deep : true ); }) ); }, @@ -865,7 +848,7 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Traversing */ filter: function(t) { - return this.set( + return this.pushStack( t.constructor == Array && jQuery.map(this,function(a){ for ( var i = 0, tl = t.length; i < tl; i++ ) @@ -914,7 +897,7 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Traversing */ not: function(t) { - return this.set( typeof t == "string" ? + return this.pushStack( typeof t == "string" ? jQuery.filter(t,this,true).r : jQuery.grep(this,function(a){ return a != t; }) ); }, @@ -932,6 +915,19 @@ jQuery.fn = jQuery.prototype = { * @param String expr An expression whose matched elements are added * @cat DOM/Traversing */ + + /** + * Adds the on the fly created elements to the jQuery object. + * + * @example $("p").add("Again") + * @before

Hello

+ * @result [

Hello

, Again ] + * + * @name add + * @type jQuery + * @param String html A string of HTML to create on the fly. + * @cat DOM/Traversing + */ /** * Adds one or more Elements to the set of matched elements. @@ -952,10 +948,10 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Traversing */ add: function(t) { - return this.set( jQuery.merge( - this.get(), typeof t == "string" ? - jQuery.find(t) : - t.constructor == Array ? t : [t] ) ); + return this.pushStack( jQuery.merge( + this.get(), + typeof t == "string" ? jQuery(t).get() : t ) + ); }, /** @@ -1041,7 +1037,7 @@ jQuery.fn = jQuery.prototype = { * @cat DOM/Attributes */ html: function( val ) { - return val == undefined ? ( this.length ? this[0].innerHTML : null ) : this.attr( "innerHTML", val ); + return val == undefined ? ( this.length ? this[0].innerHTML : null ) : this.empty().append( val ); }, /** @@ -1222,27 +1218,33 @@ jQuery.extend({ return obj; }, - prop: function(elem, key, value){ + prop: function(elem, value){ // Handle executable functions return value.constructor == Function && value.call( elem ) || value; }, className: { + // internal only, use addClass("class") add: function( elem, c ){ jQuery.each( c.split(/\s+/), function(i, cur){ if ( !jQuery.className.has( elem.className, cur ) ) elem.className += ( elem.className ? " " : "" ) + cur; }); }, + + // internal only, use removeClass("class") remove: function( elem, c ){ - elem.className = c ? - jQuery.grep( elem.className.split(/\s+/), function(cur){ - return !jQuery.className.has( c, cur ); - }).join(' ') : ""; + elem.className = c ? + jQuery.grep( elem.className.split(/\s+/), function(cur){ + return !jQuery.className.has( c, cur ); + }).join(' ') : ""; }, - has: function( classes, c ){ - return classes && new RegExp("(^|\\s)" + c + "(\\s|$)").test( classes ); + + // internal only, use is(".class") + has: function( t, c ) { + t = t.className || t; + return t && new RegExp("(^|\\s)" + c + "(\\s|$)").test( t ); } }, @@ -1309,11 +1311,10 @@ jQuery.extend({ if (prop == "float" || prop == "cssFloat") prop = jQuery.browser.msie ? "styleFloat" : "cssFloat"; - if (!force && elem.style[prop]) { - + if (!force && elem.style[prop]) ret = elem.style[prop]; - } else if (document.defaultView && document.defaultView.getComputedStyle) { + else if (document.defaultView && document.defaultView.getComputedStyle) { if (prop == "cssFloat" || prop == "styleFloat") prop = "float"; @@ -1343,51 +1344,64 @@ jQuery.extend({ clean: function(a) { var r = []; + for ( var i = 0, al = a.length; i < al; i++ ) { var arg = a[i]; - if ( typeof arg == "string" ) { // Convert html string into DOM nodes + + // Convert html string into DOM nodes + if ( typeof arg == "string" ) { // Trim whitespace, otherwise indexOf won't work as expected - var s = jQuery.trim(arg), s3 = s.substring(0,3), s6 = s.substring(0,6), - div = document.createElement("div"), wrap = [0,"",""]; - - if ( s.substring(0,4) == "", ""]; - else if ( s6 == "", ""]; - else if ( s3 == "", ""]; - else if ( s3 == " matched above - wrap = [3, "", "
"]; + var s = jQuery.trim(arg), div = document.createElement("div"), tb = []; + + var wrap = + // option or optgroup + !s.indexOf("", ""] || + + (!s.indexOf("", ""] || + + !s.indexOf("", ""] || + + // matched above + (!s.indexOf("", ""] || + + [0,"",""]; // Go to html and back, then peel off extra wrappers div.innerHTML = wrap[1] + s + wrap[2]; - while ( wrap[0]-- ) div = div.firstChild; + + // Move to the right depth + while ( wrap[0]-- ) + div = div.firstChild; // Remove IE's autoinserted from table fragments if ( jQuery.browser.msie ) { - var tb = null; + // String was a , *may* have spurious - if ( s6 == " or else if ( wrap[1] == "
" && s.indexOf("= 0 ; --n ) - if ( tb[n].nodeName.toUpperCase() == "TBODY" && !tb[n].childNodes.length ) - tb[n].parentNode.removeChild(tb[n]); - } + + for ( var n = tb.length-1; n >= 0 ; --n ) + if ( tb[n].nodeName.toUpperCase() == "TBODY" && !tb[n].childNodes.length ) + tb[n].parentNode.removeChild(tb[n]); + } arg = div.childNodes; - } - + } - if ( arg.length != undefined && ( (jQuery.browser.safari && typeof arg == 'function') || !arg.nodeType ) ) // Safari reports typeof on a DOM NodeList to be a function - for ( var n = 0, argl = arg.length; n < argl; n++ ) // Handles Array, jQuery, DOM NodeList collections - r.push(arg[n]); + if ( arg.nodeType ) + r.push( arg ); else - r.push( arg.nodeType ? arg : document.createTextNode(arg.toString()) ); + r = jQuery.merge( r, arg ); + } return r; @@ -1418,10 +1432,9 @@ jQuery.extend({ return elem.filter = elem.filter.replace(/alpha\([^\)]*\)/gi,"") + ( value == 1 ? "" : "alpha(opacity=" + value * 100 + ")" ); - } else if ( name == "opacity" && jQuery.browser.msie ) { + } else if ( name == "opacity" && jQuery.browser.msie ) return elem.filter ? parseFloat( elem.filter.match(/alpha\(opacity=(.*)\)/)[1] ) / 100 : 1; - } // Mozilla doesn't play well with opacity 1 if ( name == "opacity" && jQuery.browser.mozilla && value == 1 ) @@ -1432,11 +1445,11 @@ jQuery.extend({ if ( value != undefined ) elem[fix[name]] = value; return elem[fix[name]]; - } else if ( value == undefined && jQuery.browser.msie && elem.nodeName && elem.nodeName.toUpperCase() == 'FORM' && (name == 'action' || name == 'method') ) { + } else if ( value == undefined && jQuery.browser.msie && elem.nodeName && elem.nodeName.toUpperCase() == 'FORM' && (name == 'action' || name == 'method') ) return elem.getAttributeNode(name).nodeValue; // IE elem.getAttribute passes even for style - } else if ( elem.tagName ) { + else if ( elem.tagName ) { if ( value != undefined ) elem.setAttribute( name, value ); return elem.getAttribute( name ); @@ -1465,10 +1478,10 @@ jQuery.extend({ makeArray: function( a ) { var r = []; - if ( a.constructor != Array ) { + if ( a.constructor != Array ) for ( var i = 0, al = a.length; i < al; i++ ) r.push( a[i] ); - } else + else r = a.slice( 0 ); return r; @@ -1506,12 +1519,11 @@ jQuery.extend({ // Now check for duplicates between the two arrays // and only add the unique items - for ( var i = 0, sl = second.length; i < sl; i++ ) { + for ( var i = 0, sl = second.length; i < sl; i++ ) // Check for duplicates if ( jQuery.inArray( second[i], r ) == -1 ) // The item is unique, add it first.push( second[i] ); - } return first; }, @@ -1807,9 +1819,9 @@ new function() { */ jQuery.each({ parent: "a.parentNode", - parents: jQuery.parents, - next: "jQuery.nth(a,1,'nextSibling')", - prev: "jQuery.nth(a,1,'previousSibling')", + parents: "jQuery.parents(a)", + next: "jQuery.nth(a,2,'nextSibling')", + prev: "jQuery.nth(a,2,'previousSibling')", siblings: "jQuery.sibling(a.parentNode.firstChild,a)", children: "jQuery.sibling(a.firstChild)" }, function(i,n){ @@ -1817,7 +1829,7 @@ jQuery.each({ var ret = jQuery.map(this,n); if ( a && typeof a == "string" ) ret = jQuery.filter(a,ret).r; - return this.set( ret ); + return this.pushStack( ret ); }; }); @@ -1834,8 +1846,9 @@ jQuery.each({ * * @name appendTo * @type jQuery - * @param String expr A jQuery expression of elements to match. + * @param content Content to append to the selected element to. * @cat DOM/Manipulation + * @see append() */ /** @@ -1851,8 +1864,9 @@ jQuery.each({ * * @name prependTo * @type jQuery - * @param String expr A jQuery expression of elements to match. + * @param content Content to prepend to the selected element to. * @cat DOM/Manipulation + * @see prepend() */ /** @@ -1868,8 +1882,9 @@ jQuery.each({ * * @name insertBefore * @type jQuery - * @param String expr A jQuery expression of elements to match. + * @param content Content to insert the selected element before. * @cat DOM/Manipulation + * @see before() */ /** @@ -1885,8 +1900,9 @@ jQuery.each({ * * @name insertAfter * @type jQuery - * @param String expr A jQuery expression of elements to match. + * @param content Content to insert the selected element after. * @cat DOM/Manipulation + * @see after() */ jQuery.each({ @@ -1918,65 +1934,25 @@ jQuery.each({ */ /** - * Displays each of the set of matched elements if they are hidden. - * - * @example $("p").show() - * @before

Hello

- * @result [

Hello

] - * - * @name show - * @type jQuery - * @cat Effects - */ - -/** - * Hides each of the set of matched elements if they are shown. - * - * @example $("p").hide() - * @before

Hello

- * @result [

Hello

] - * - * var pass = true, div = $("div"); - * div.hide().each(function(){ - * if ( this.style.display != "none" ) pass = false; - * }); - * ok( pass, "Hide" ); - * - * @name hide - * @type jQuery - * @cat Effects - */ - -/** - * Toggles each of the set of matched elements. If they are shown, - * toggle makes them hidden. If they are hidden, toggle - * makes them shown. - * - * @example $("p").toggle() - * @before

Hello

Hello Again

- * @result [

Hello

,

Hello Again

] - * - * @name toggle - * @type jQuery - * @cat Effects - */ - -/** - * Adds the specified class to each of the set of matched elements. + * Adds the specified class(es) to each of the set of matched elements. * * @example $("p").addClass("selected") * @before

Hello

* @result [

Hello

] * + * @example $("p").addClass("selected highlight") + * @before

Hello

+ * @result [

Hello

] + * * @name addClass * @type jQuery - * @param String class A CSS class to add to the elements + * @param String class One or more CSS classes to add to the elements * @cat DOM/Attributes * @see removeClass(String) */ /** - * Removes all or the specified class from the set of matched elements. + * Removes all or the specified class(es) from the set of matched elements. * * @example $("p").removeClass() * @before

Hello

@@ -1986,9 +1962,13 @@ jQuery.each({ * @before

Hello

* @result [

Hello

] * + * @example $("p").removeClass("selected highlight") + * @before

Hello

+ * @result [

Hello

] + * * @name removeClass * @type jQuery - * @param String class (optional) A CSS class to remove from the elements + * @param String class (optional) One or more CSS classes to remove from the elements * @cat DOM/Attributes * @see addClass(String) */ @@ -2044,20 +2024,6 @@ jQuery.each( { jQuery.attr( this, key, "" ); this.removeAttribute( key ); }, - show: function(){ - this.style.display = this.oldblock ? this.oldblock : ""; - if ( jQuery.css(this,"display") == "none" ) - this.style.display = "block"; - }, - hide: function(){ - this.oldblock = this.oldblock || jQuery.css(this,"display"); - if ( this.oldblock == "none" ) - this.oldblock = "block"; - this.style.display = "none"; - }, - toggle: function(){ - jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ].apply( jQuery(this), arguments ); - }, addClass: function(c){ jQuery.className.add(this,c); }, @@ -2068,7 +2034,7 @@ jQuery.each( { jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c); }, remove: function(a){ - if ( !a || jQuery.filter( a, [this] ).r ) + if ( !a || jQuery.filter( a, [this] ).r.length ) this.parentNode.removeChild( this ); }, empty: function() {