*/
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> ]
* 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> ]
* to the set of matched elements.
*
* @example $("p").add("span")
- * @before <p>Hello</p><span>Hello Again</span>
- * @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
* @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;
},
/**
* @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 && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
// is the only cross-browser way to do this. --John
isFunction: function( fn ) {
return !!fn && typeof fn != "string" && !fn.nodeName &&
- typeof fn[0] == "undefined" && /function/i.test( fn + "" );
+ fn.constructor != Array && /function/i.test( fn + "" );
},
// check if an element is in a XML document
},
/**
- * 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.
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];
});
} 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;
jQuery.each( a, function(i,arg){
if ( !arg ) return;
// 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]-- )
}
- arg = div.childNodes;
+ arg = jQuery.makeArray( div.childNodes );
}
if ( arg.length === 0 && !jQuery.nodeName(arg, "form") )
};
// 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;
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
* 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>
*/
/**
- * 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);