/*
* jQuery @VERSION - New Wave Javascript
*
- * Copyright (c) 2006 John Resig (jquery.com)
+ * Copyright (c) 2007 John Resig (jquery.com)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
// HANDLE: $(function)
// Shortcut for document ready
- // Safari reports typeof on DOM NodeLists as a function
- if ( typeof a == "function" && !a.nodeType && a[0] == undefined )
+ if ( jQuery.isFunction(a) )
return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
// Handle HTML strings
if ( typeof a == "string" ) {
// HANDLE: $(html) -> $(array)
- var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
+ var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a);
if ( m )
a = jQuery.clean( [ m[1] ] );
* (usually consisting of CSS or XPath), which then finds all matching
* elements.
*
- * By default, $() looks for DOM elements within the context of the
- * current HTML document.
+ * By default, if no context is specified, $() looks for DOM elements within the context of the
+ * current HTML document. If you do specify a context, such as a DOM
+ * element or jQuery object, the expression will be matched against
+ * the contents of that context.
+ *
+ * See [[DOM/Traversing/Selectors]] for the allowed CSS/XPath syntax for expressions.
*
* @example $("div > p")
* @desc Finds all p elements that are children of a div element.
/**
* Create DOM elements on-the-fly from the provided String of raw HTML.
*
- * @example $("<div><p>Hello</p></div>").appendTo("#body")
+ * @example $("<div><p>Hello</p></div>").appendTo("body")
* @desc Creates a div element (and all of its contents) dynamically,
- * and appends it to the element with the ID of body. Internally, an
- * element is created and it's innerHTML property set to the given markup.
+ * and appends it to the body element. Internally, an
+ * element is created and its innerHTML property set to the given markup.
* It is therefore both quite flexible and limited.
*
* @name $
* This function also accepts XML Documents and Window objects
* as valid arguments (even though they are not DOM Elements).
*
- * @example $(document).find("div > p")
- * @before <p>one</p> <div><p>two</p></div> <p>three</p>
- * @result [ <p>two</p> ]
- * @desc Same as $("div > p") because the document
- *
- * @example $(document.body).background( "black" );
+ * @example $(document.body).css( "background", "black" );
* @desc Sets the background color of the page to black.
*
* @example $( myForm.elements ).hide()
* A shorthand for $(document).ready(), allowing you to bind a function
* to be executed when the DOM document has finished loading. This function
* behaves just like $(document).ready(), in that it should be used to wrap
- * all of the other $() operations on your page. While this function is,
- * technically, chainable - there really isn't much use for chaining against it.
+ * other $() operations on your page that depend on the DOM being ready to be
+ * operated on. While this function is, technically, chainable - there really
+ * isn't much use for chaining against it.
+ *
* You can have as many $(document).ready events on your page as you like.
*
* See ready(Function) for details about the ready event.
jquery: "@VERSION",
/**
- * The number of elements currently matched.
+ * The number of elements currently matched. The size function will return the same value.
*
* @example $("img").length;
* @before <img src="test1.jpg"/> <img src="test2.jpg"/>
*/
/**
- * The number of elements currently matched.
+ * Get the number of elements currently matched. This returns the same
+ * number as the 'length' property of the jQuery object.
*
* @example $("img").size();
* @before <img src="test1.jpg"/> <img src="test2.jpg"/>
length: 0,
/**
- * Access all matched elements. This serves as a backwards-compatible
+ * Access all matched DOM elements. This serves as a backwards-compatible
* way of accessing all matched elements (other than the jQuery object
* itself, which is, in fact, an array of elements).
*
+ * It is useful if you need to operate on the DOM elements themselves instead of using built-in jQuery functions.
+ *
* @example $("img").get();
* @before <img src="test1.jpg"/> <img src="test2.jpg"/>
* @result [ <img src="test1.jpg"/> <img src="test2.jpg"/> ]
*/
/**
- * Access a single matched element. num is used to access the
- * Nth element matched.
+ * Access a single matched DOM element at a specified index in the matched set.
+ * This allows you to extract the actual DOM element and operate on it
+ * directly without necessarily using jQuery functionality on it.
*
* @example $("img").get(0);
* @before <img src="test1.jpg"/> <img src="test2.jpg"/>
- * @result [ <img src="test1.jpg"/> ]
+ * @result <img src="test1.jpg"/>
* @desc Selects all images in the document and returns the first one
*
* @name get
* @cat Core
*/
pushStack: function( a ) {
- var ret = jQuery(this);
+ var ret = jQuery(a);
ret.prevObject = this;
- return ret.setArray( a );
+ return ret;
},
/**
* Execute a function within the context of every matched element.
* This means that every time the passed-in function is executed
* (which is once for every element matched) the 'this' keyword
- * points to the specific element.
+ * points to the specific DOM element.
*
* Additionally, the function, when executed, is passed a single
* argument representing the position of the element in the matched
- * set.
+ * set (integer, zero-index).
*
* @example $("img").each(function(i){
* this.src = "test" + i + ".jpg";
* Returns -1 if the object wasn't found.
*
* @example $("*").index( $('#foobar')[0] )
- * @before <div id="foobar"></div><b></b><span id="foo"></span>
+ * @before <div id="foobar"><b></b><span id="foo"></span></div>
* @result 0
* @desc Returns the index for the element with ID foobar
*
- * @example $("*").index( $('#foo'))
- * @before <div id="foobar"></div><b></b><span id="foo"></span>
+ * @example $("*").index( $('#foo')[0] )
+ * @before <div id="foobar"><b></b><span id="foo"></span></div>
* @result 2
- * @desc Returns the index for the element with ID foo
+ * @desc Returns the index for the element with ID foo within another element
*
- * @example $("*").index( $('#bar'))
- * @before <div id="foobar"></div><b></b><span id="foo"></span>
+ * @example $("*").index( $('#bar')[0] )
+ * @before <div id="foobar"><b></b><span id="foo"></span></div>
* @result -1
* @desc Returns -1, as there is no element with ID bar
*
* This method makes it easy to retrieve a property value
* from the first matched element.
*
+ * If the element does not have an attribute with such a
+ * name, undefined is returned.
+ *
* @example $("img").attr("src");
* @before <img src="test.jpg"/>
* @result test.jpg
/**
* Set a single property to a value, on all matched elements.
*
- * Can compute values provided as ${formula}, see second example.
- *
* Note that you can't set the name property of input elements in IE.
* Use $(html) or .append(html) or .html(html) to create elements
* on the fly including the name property.
* @result <img src="test.jpg"/>
* @desc Sets src attribute to all images.
*
- * @example $("img").attr("title", "${this.src}");
- * @before <img src="test.jpg" />
- * @result <img src="test.jpg" title="test.jpg" />
- * @desc Sets title attribute from src attribute, a shortcut for attr(String,Function)
- *
* @name attr
* @type jQuery
* @param String key The name of the property to set.
/**
* Set a single property to a computed value, on all matched elements.
*
- * Instead of a value, a function is provided, that computes the value.
+ * Instead of supplying a string value as described
+ * [[DOM/Attributes#attr.28_key.2C_value_.29|above]],
+ * a function is provided that computes the value.
*
* @example $("img").attr("title", function() { return this.src });
* @before <img src="test.jpg" />
* @result <img src="test.jpg" title="test.jpg" />
* @desc Sets title attribute from src attribute.
*
+ * @example $("img").attr("title", function(index) { return this.title + (i + 1); });
+ * @before <img title="pic" /><img title="pic" /><img title="pic" />
+ * @result <img title="pic1" /><img title="pic2" /><img title="pic3" />
+ * @desc Enumerate title attribute.
+ *
* @name attr
* @type jQuery
* @param String key The name of the property to set.
* @param Function value A function returning the value to set.
+ * Scope: Current element, argument: Index of current element
* @cat DOM/Attributes
*/
attr: function( key, value, type ) {
// 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 );
+ return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
else {
obj = {};
obj[ key ] = value;
}
// Check to see if we're setting style values
- return this.each(function(){
+ return this.each(function(index){
// Set all the styles
for ( var prop in obj )
jQuery.attr(
type ? this.style : this,
- prop, jQuery.prop(this, obj[prop], type)
+ prop, jQuery.prop(this, obj[prop], type, index, prop)
);
});
},
* @cat DOM/Attributes
*/
text: function(e) {
- var type = this.length && this[0].innerText == undefined ?
- "textContent" : "innerText";
-
- return e == undefined ?
- jQuery.map(this, function(a){ return a[ type ]; }).join('') :
- this.each(function(){ this[ type ] = e; });
+ if ( typeof e == "string" )
+ return this.empty().append( document.createTextNode( e ) );
+
+ var t = "";
+ jQuery.each( e || this, function(){
+ jQuery.each( this.childNodes, function(){
+ if ( this.nodeType != 8 )
+ t += this.nodeType != 1 ?
+ this.nodeValue : jQuery.fn.text([ this ]);
+ });
+ });
+ return t;
},
/**
*/
wrap: function() {
// The elements to wrap the target around
- var a = jQuery.clean(arguments);
+ var a, args = arguments;
// Wrap each of the matched elements individually
return this.each(function(){
+ if ( !a )
+ a = jQuery.clean(args, this.ownerDocument);
+
// Clone the structure that we're using to wrap
var b = a[0].cloneNode(true);
},
/**
- * End the most recent 'destructive' operation, reverting the list of matched elements
- * back to its previous state. After an end operation, the list of matched elements will
- * revert to the last state of matched elements.
+ * Revert the most recent 'destructive' operation, changing the set of matched elements
+ * to its previous state (right before the destructive operation).
*
* If there was no destructive operation before, an empty set is returned.
*
+ * A 'destructive' operation is any operation that changes the set of
+ * matched jQuery elements. These functions are: <code>add</code>,
+ * <code>children</code>, <code>clone</code>, <code>filter</code>,
+ * <code>find</code>, <code>not</code>, <code>next</code>,
+ * <code>parent</code>, <code>parents</code>, <code>prev</code> and <code>siblings</code>.
+ *
* @example $("p").find("span").end();
* @before <p><span>Hello</span>, how are you?</p>
* @result [ <p>...</p> ]
* @cat DOM/Traversing
*/
find: function(t) {
- return this.pushStack( jQuery.map( this, function(a){
+ return this.pushStack( jQuery.unique( jQuery.map( this, function(a){
return jQuery.find(t,a);
- }) );
+ }) ), t );
},
/**
*/
clone: function(deep) {
return this.pushStack( jQuery.map( this, function(a){
- return a.cloneNode( deep != undefined ? deep : true );
+ var a = a.cloneNode( deep != undefined ? deep : true );
+ a.$events = null; // drop $events expando to avoid firing incorrect events
+ return a;
}) );
},
*/
filter: function(t) {
return this.pushStack(
- t.constructor == Function &&
+ jQuery.isFunction( t ) &&
jQuery.grep(this, function(el, index){
return t.apply(el, [index])
}) ||
* of matched elements. This method is used to remove one or more
* elements from a jQuery object.
*
+ * Please note: the expression cannot use a reference to the
+ * element name. See the two examples below.
+ *
* @example $("p").not( $("div p.selected") )
* @before <div><p>Hello</p><p class="selected">Hello Again</p></div>
* @result [ <p>Hello</p> ]
*
* @name not
* @type jQuery
- * @param Array|jQuery elems A set of elements to remove from the jQuery set of matched elements.
+ * @param jQuery elems A set of elements to remove from the jQuery set of matched elements.
* @cat DOM/Traversing
*/
not: function(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 );
- else
- return a != t;
- }) );
+ jQuery.multiFilter(t, this, true) ||
+
+ jQuery.grep(this, function(a) {
+ return ( t.constructor == Array || t.jquery )
+ ? jQuery.inArray( a, t ) < 0
+ : a != t;
+ })
+ );
},
/**
- * Adds the elements matched by the expression to the jQuery object. This
- * can be used to concatenate the result sets of two expressions.
+ * Adds more elements, matched by the given expression,
+ * to the set of matched elements.
*
* @example $("p").add("span")
- * @before <p>Hello</p><p><span>Hello Again</span></p>
- * @result [ <p>Hello</p>, <span>Hello Again</span> ]
+ * @before (HTML) <p>Hello</p><span>Hello Again</span>
+ * @result (jQuery object matching 2 elements) [ <p>Hello</p>, <span>Hello Again</span> ]
+ * @desc Compare the above result to the result of <code>$('p')</code>,
+ * which would just result in <code><nowiki>[ <p>Hello</p> ]</nowiki></code>.
+ * Using add(), matched elements of <code>$('span')</code> are simply
+ * added to the returned jQuery-object.
*
* @name add
* @type jQuery
*/
/**
- * Adds the on the fly created elements to the jQuery object.
+ * Adds more elements, created on the fly, to the set of
+ * matched elements.
*
* @example $("p").add("<span>Again</span>")
* @before <p>Hello</p>
/**
* Adds one or more Elements to the set of matched elements.
*
- * This is used to add a set of Elements to a jQuery object.
- *
* @example $("p").add( document.getElementById("a") )
* @before <p>Hello</p><p><span id="a">Hello Again</span></p>
* @result [ <p>Hello</p>, <span id="a">Hello Again</span> ]
*
- * @example $("p").add([document.getElementById("a"), document.getElementById("b")])
- * @before <p>Hello</p><p><span id="a">Hello Again</span><span id="b">And Again</span></p>
- * @result [ <p>Hello</p>, <span id="a">Hello Again</span>, <span id="b">And Again</span> ]
+ * @example $("p").add( document.forms[0].elements )
+ * @before <p>Hello</p><p><form><input/><button/></form>
+ * @result [ <p>Hello</p>, <input/>, <button/> ]
*
* @name add
* @type jQuery
add: function(t) {
return this.pushStack( jQuery.merge(
this.get(),
- typeof t == "string" ? jQuery(t).get() : t )
+ t.constructor == String ?
+ jQuery(t).get() :
+ t.length != undefined && (!t.nodeName || t.nodeName == "FORM") ?
+ t : [t] )
);
},
* @cat DOM/Traversing
*/
is: function(expr) {
- return expr ? jQuery.filter(expr,this).r.length > 0 : false;
+ return expr ? jQuery.multiFilter(expr,this).length > 0 : false;
},
/**
- * Get the current value of the first matched element.
+ * Get the content of the value attribute of the first matched element.
+ *
+ * Use caution when relying on this function to check the value of
+ * multiple-select elements and checkboxes in a form. While it will
+ * still work as intended, it may not accurately represent the value
+ * the server will receive because these elements may send an array
+ * of values. For more robust handling of field values, see the
+ * [http://www.malsup.com/jquery/form/#fields fieldValue function of the Form Plugin].
*
* @example $("input").val();
* @before <input type="text" value="some text"/>
*/
/**
- * Set the value of every matched element.
+ * Set the value attribute of every matched element.
*
* @example $("input").val("test");
* @before <input type="text" value="some text"/>
* @cat Core
*/
domManip: function(args, table, dir, fn){
- var clone = this.length > 1;
- var a = jQuery.clean(args);
- if ( dir < 0 )
- a.reverse();
+ var clone = this.length > 1, a;
return this.each(function(){
+ if ( !a ) {
+ a = jQuery.clean(args, this.ownerDocument);
+ if ( dir < 0 )
+ a.reverse();
+ }
+
var obj = this;
- if ( table && this.nodeName.toUpperCase() == "TABLE" && a[0].nodeName.toUpperCase() == "TR" )
+ if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
- for ( var i = 0, al = a.length; i < al; i++ )
- fn.apply( obj, [ clone ? a[i].cloneNode(true) : a[i] ] );
+ jQuery.each( a, function(){
+ fn.apply( obj, [ clone ? this.cloneNode(true) : this ] );
+ });
});
}
/**
* Extends the jQuery object itself. Can be used to add functions into
- * the jQuery namespace and to add plugin methods (plugins).
+ * the jQuery namespace and to [[Plugins/Authoring|add plugin methods]] (plugins).
*
* @example jQuery.fn.extend({
* check: function() {
noConflict: function() {
if ( jQuery._$ )
$ = jQuery._$;
+ return jQuery;
+ },
+
+ // This may seem like some crazy code, but trust me when I say that this
+ // is the only cross-browser way to do this. --John
+ isFunction: function( fn ) {
+ return !!fn && typeof fn != "string" && !fn.nodeName &&
+ fn.constructor != Array && /function/i.test( fn + "" );
+ },
+
+ // check if an element is in a XML document
+ isXMLDoc: function(elem) {
+ return elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
},
/**
- * A generic iterator function, which can be used to seemlessly
+ * A generic iterator function, which can be used to seamlessly
* iterate over both objects and arrays. This function is not the same
* as $().each() - which is used to iterate, exclusively, over a jQuery
* object. This function can be used to iterate over anything.
return obj;
},
- prop: function(elem, value, type){
+ prop: function(elem, value, type, index, prop){
// Handle executable functions
- if ( value.constructor == Function )
- return value.call( elem )
+ if ( jQuery.isFunction( value ) )
+ value = value.call( elem, [index] );
+
+ // exclude the following css properties to add px
+ var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
// Handle passing in a number to a CSS property
- if ( value.constructor == Number && type == "css" )
- return value + "px";
-
- return value;
+ return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
+ value + "px" :
+ value;
},
className: {
elem.className = c ?
jQuery.grep( elem.className.split(/\s+/), function(cur){
return !jQuery.className.has( c, cur );
- }).join(' ') : "";
+ }).join(" ") : "";
},
// internal only, use is(".class")
has: function( t, c ) {
- t = t.className || t;
- return t && new RegExp("(^|\\s)" + c + "(\\s|$)").test( t );
+ return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1;
}
},
if ( p == "height" || p == "width" ) {
var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
- for ( var i = 0, dl = d.length; i < dl; i++ ) {
- old["padding" + d[i]] = 0;
- old["border" + d[i] + "Width"] = 0;
- }
+ jQuery.each( d, function(){
+ old["padding" + this] = 0;
+ old["border" + this + "Width"] = 0;
+ });
jQuery.swap( e, old, function() {
- if (jQuery.css(e,"display") != "none") {
+ if ( jQuery(e).is(':visible') ) {
oHeight = e.offsetHeight;
oWidth = e.offsetWidth;
} else {
visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
}).appendTo(e.parentNode)[0];
- var parPos = jQuery.css(e.parentNode,"position");
- if ( parPos == "" || parPos == "static" )
+ var parPos = jQuery.css(e.parentNode,"position") || "static";
+ if ( parPos == "static" )
e.parentNode.style.position = "relative";
oHeight = e.clientHeight;
oWidth = e.clientWidth;
- if ( parPos == "" || parPos == "static" )
+ if ( parPos == "static" )
e.parentNode.style.position = "static";
e.parentNode.removeChild(e);
curCSS: function(elem, prop, force) {
var ret;
+
+ if (prop == "opacity" && jQuery.browser.msie) {
+ ret = jQuery.attr(elem.style, "opacity");
+ return ret == "" ? "1" : ret;
+ }
- if (prop == 'opacity' && jQuery.browser.msie)
- return jQuery.attr(elem.style, 'opacity');
-
if (prop == "float" || prop == "cssFloat")
- prop = jQuery.browser.msie ? "styleFloat" : "cssFloat";
+ prop = jQuery.browser.msie ? "styleFloat" : "cssFloat";
if (!force && elem.style[prop])
ret = elem.style[prop];
if ( cur )
ret = cur.getPropertyValue(prop);
- else if ( prop == 'display' )
- ret = 'none';
+ else if ( prop == "display" )
+ ret = "none";
else
- jQuery.swap(elem, { display: 'block' }, function() {
- var c = document.defaultView.getComputedStyle(this, '');
- ret = c && c.getPropertyValue(prop) || '';
+ jQuery.swap(elem, { display: "block" }, function() {
+ var c = document.defaultView.getComputedStyle(this, "");
+ ret = c && c.getPropertyValue(prop) || "";
});
} else if (elem.currentStyle) {
-
var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
-
}
return ret;
},
- clean: function(a) {
+ clean: function(a, doc) {
var r = [];
+ doc = doc || document;
- for ( var i = 0, al = a.length; i < al; i++ ) {
- var arg = a[i];
+ jQuery.each( a, function(i,arg){
+ if ( !arg ) return;
+
+ if ( arg.constructor == Number )
+ arg = arg.toString();
// Convert html string into DOM nodes
if ( typeof arg == "string" ) {
// Trim whitespace, otherwise indexOf won't work as expected
- var s = jQuery.trim(arg), div = document.createElement("div"), tb = [];
+ var s = jQuery.trim(arg), div = doc.createElement("div"), tb = [];
var wrap =
// option or optgroup
[0,"",""];
// Go to html and back, then peel off extra wrappers
- div.innerHTML = wrap[1] + s + wrap[2];
+ div.innerHTML = wrap[1] + arg + wrap[2];
// Move to the right depth
while ( wrap[0]-- )
tb = div.childNodes;
for ( var n = tb.length-1; n >= 0 ; --n )
- if ( tb[n].nodeName.toUpperCase() == "TBODY" && !tb[n].childNodes.length )
+ if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
tb[n].parentNode.removeChild(tb[n]);
}
- arg = div.childNodes;
+ arg = jQuery.makeArray( div.childNodes );
}
+
+ if ( arg.length === 0 && !jQuery.nodeName(arg, "form") )
+ return;
- if ( arg[0] == undefined )
+ if ( arg[0] == undefined || jQuery.nodeName(arg, "form") )
r.push( arg );
else
r = jQuery.merge( r, arg );
- }
+ });
return r;
},
attr: function(elem, name, value){
- var fix = {
+ var fix = jQuery.isXMLDoc(elem) ? {} : {
"for": "htmlFor",
"class": "className",
"float": jQuery.browser.msie ? "styleFloat" : "cssFloat",
};
// IE actually uses filters for opacity ... elem is actually elem.style
- if ( name == "opacity" && jQuery.browser.msie && value != undefined ) {
- // IE has trouble with opacity if it does not have layout
- // Force it by setting the zoom level
- elem.zoom = 1;
-
- // Set the alpha filter to set the opacity
- return elem.filter = elem.filter.replace(/alpha\([^\)]*\)/gi,"") +
- ( value == 1 ? "" : "alpha(opacity=" + value * 100 + ")" );
+ if ( name == "opacity" && jQuery.browser.msie ) {
+ if ( value != undefined ) {
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ elem.zoom = 1;
+
+ // Set the alpha filter to set the opacity
+ elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
+ (parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+ }
- } else if ( name == "opacity" && jQuery.browser.msie )
return elem.filter ?
- parseFloat( elem.filter.match(/alpha\(opacity=(.*)\)/)[1] ) / 100 : 1;
+ (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
+ }
- // Mozilla doesn't play well with opacity 1
- if ( name == "opacity" && jQuery.browser.mozilla && value == 1 )
- value = 0.9999;
-
// Certain attributes only work when accessed via the old DOM 0 way
if ( fix[name] ) {
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 && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
return elem.getAttributeNode(name).nodeValue;
// IE elem.getAttribute passes even for style
else if ( elem.tagName ) {
if ( value != undefined ) elem.setAttribute( name, value );
+ if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) )
+ return elem.getAttribute( name, 2 );
return elem.getAttribute( name );
+ // elem is actually elem.style ... set the style
} else {
name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
if ( value != undefined ) elem[name] = value;
makeArray: function( a ) {
var r = [];
- if ( a.constructor != Array )
+ // Need to use typeof to fight Safari childNodes crashes
+ if ( typeof a != "array" )
for ( var i = 0, al = a.length; i < al; i++ )
r.push( a[i] );
else
/**
* Merge two arrays together, removing all duplicates.
*
- * The new array is: All the results from the first array, followed
- * by the unique results from the second array.
+ * The result is the altered first argument with
+ * the unique elements from the second array added.
*
* @example $.merge( [0,1,2], [2,3,4] )
* @result [0,1,2,3,4]
* @desc Merges two arrays, removing the duplicate 2
*
- * @example $.merge( [3,2,1], [4,3,2] )
- * @result [3,2,1,4]
+ * @example var array = [3,2,1];
+ * $.merge( array, [4,3,2] )
+ * @result array == [3,2,1,4]
* @desc Merges two arrays, removing the duplicates 3 and 2
*
* @name $.merge
* @type Array
- * @param Array first The first array to merge.
- * @param Array second The second array to merge.
+ * @param Array first The first array to merge, the unique elements of second added.
+ * @param Array second The second array to merge into the first, unaltered.
* @cat JavaScript
*/
merge: function(first, second) {
- var r = [].slice.call( first, 0 );
+ // We have to loop this way because IE & Opera overwrite the length
+ // expando of getElementsByTagName
+ for ( var i = 0; second[i]; i++ )
+ first.push(second[i]);
+ return first;
+ },
- // Now check for duplicates between the two arrays
- // and only add the unique items
- 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] );
+ unique: function(first) {
+ var r = [], num = jQuery.mergeNum++;
- return first;
+ for ( var i = 0, fl = first.length; i < fl; i++ )
+ if ( first[i].mergeNum != num ) {
+ first[i].mergeNum = num;
+ r.push(first[i]);
+ }
+
+ return r;
},
+ mergeNum: 0,
+
/**
* Filter items out of an array, by using a filter function.
*
}
}
- var r = result.length ? [ result[0] ] : [];
-
- check: for ( var i = 1, rl = result.length; i < rl; i++ ) {
- for ( var j = 0; j < i; j++ )
- if ( result[i] == r[j] )
- continue check;
-
- r.push( result[i] );
- }
-
- return r;
+ return result;
}
});
*/
/*
- * Wheather the W3C compliant box model is being used.
+ * Whether the W3C compliant box model is being used.
*
* @property
* @name $.boxModel
* Get a set of elements containing the unique parents of the matched
* set of elements.
*
- * Can be filtered with an optional expressions.
+ * You may use an optional expression to filter the set of parent elements that will match.
*
* @example $("p").parent()
* @before <div><p>Hello</p><p>Hello</p></div>
* Get a set of elements containing the unique ancestors of the matched
* set of elements (except for the root element).
*
- * Can be filtered with an optional expressions.
+ * The matched elements can be filtered with an optional expression.
*
* @example $("span").parents()
* @before <html><body><div><p><span>Hello</span></p><span>Hello Again</span></div></body></html>
* Get a set of elements containing the unique next siblings of each of the
* matched set of elements.
*
- * It only returns the very next sibling, not all next siblings.
+ * It only returns the very next sibling for each element, not all
+ * next siblings.
*
- * Can be filtered with an optional expressions.
+ * You may provide an optional expression to filter the match.
*
* @example $("p").next()
* @before <p>Hello</p><p>Hello Again</p><div><span>And Again</span></div>
* Get a set of elements containing the unique previous siblings of each of the
* matched set of elements.
*
- * Can be filtered with an optional expressions.
+ * Use an optional expression to filter the matched set.
*
- * It only returns the immediately previous sibling, not all previous siblings.
+ * Only the immediately previous sibling is returned, not all previous siblings.
*
* @example $("p").prev()
* @before <p>Hello</p><div><span>Hello Again</span></div><p>And Again</p>
* Get a set of elements containing all of the unique children of each of the
* matched set of elements.
*
- * Can be filtered with an optional expressions.
+ * This set can be filtered with an optional expression that will cause
+ * only elements matching the selector to be collected.
*
* @example $("div").children()
* @before <p>Hello</p><div><span>Hello Again</span></div><p>And Again</p>
*
* @name width
* @type jQuery
- * @param Number|String val Set the CSS property to the specified value.
+ * @param String|Number val Set the CSS property to the specified value.
* @cat CSS
*/
*/
/**
- * Set the CSS width of every matched element. If no explicit unit
+ * Set the CSS height of every matched element. If no explicit unit
* was specified (like 'em' or '%') then "px" is added to the width.
*
* @example $("p").height(20);
*
* @name height
* @type jQuery
- * @param Number|String val Set the CSS property to the specified value.
+ * @param String|Number val Set the CSS property to the specified value.
* @cat CSS
*/