X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=7b7218540f20d90559a9c5708adcf7cab63e4926;hb=5fae496933cf4cad5826fbd871d0db455dc2947e;hp=64ade0a6830cf9d999ba83ad99b193be1cf83e59;hpb=68d8e53d8751c095fcc148cb52aae472a6e60c26;p=jquery.git
diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js
index 64ade0a..7b72185 100644
--- a/src/jquery/jquery.js
+++ b/src/jquery/jquery.js
@@ -356,6 +356,9 @@ jQuery.fn = jQuery.prototype = {
* 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
* @result test.jpg
@@ -387,8 +390,6 @@ jQuery.fn = jQuery.prototype = {
/**
* 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.
@@ -398,11 +399,6 @@ jQuery.fn = jQuery.prototype = {
* @result
* @desc Sets src attribute to all images.
*
- * @example $("img").attr("title", "${this.src}");
- * @before
- * @result
- * @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.
@@ -413,7 +409,9 @@ jQuery.fn = jQuery.prototype = {
/**
* 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
@@ -616,10 +614,13 @@ jQuery.fn = jQuery.prototype = {
*/
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);
@@ -770,12 +771,17 @@ jQuery.fn = jQuery.prototype = {
},
/**
- * 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: add
,
+ * children
, clone
, filter
,
+ * find
, not
, next
,
+ * parent
, parents
, prev
and siblings
.
+ *
* @example $("p").find("span").end();
* @before
Hello, how are you?
* @result [...
] @@ -811,9 +817,9 @@ jQuery.fn = jQuery.prototype = { * @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 ); + }) ), t ); }, /** @@ -926,6 +932,9 @@ jQuery.fn = jQuery.prototype = { * 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") ) * @beforeHello
Hello Again
Hello
] @@ -954,8 +963,12 @@ jQuery.fn = jQuery.prototype = { * to the set of matched elements. * * @example $("p").add("span") - * @beforeHello
Hello Again - * @result [Hello
, Hello Again ] + * @before (HTML)Hello
Hello Again + * @result (jQuery object matching 2 elements) [Hello
, Hello Again ] + * @desc Compare the above result to the result of$('p')
,
+ * which would just result in [ Hello
]
.
+ * Using add(), matched elements of $('span')
are simply
+ * added to the returned jQuery-object.
*
* @name add
* @type jQuery
@@ -1028,11 +1041,18 @@ jQuery.fn = jQuery.prototype = {
* @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
@@ -1044,7 +1064,7 @@ jQuery.fn = jQuery.prototype = {
*/
/**
- * Set the value of every matched element.
+ * Set the value attribute of every matched element.
*
* @example $("input").val("test");
* @before
@@ -1104,12 +1124,15 @@ jQuery.fn = jQuery.prototype = {
* @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") )
@@ -1154,6 +1177,10 @@ jQuery.fn = jQuery.prototype = {
/**
* Extend one object with one or more others, returning the original,
* modified, object. This is a great utility for simple inheritance.
+ *
+ * There is also an optional collision resolution function. Any time the target and
+ * merged object both contain a key this function is called. This may be used to create
+ * a recursive merge. (See example) Unless you know what this is, you probably don't care.
*
* @example var settings = { validate: false, limit: 5, name: "foo" };
* var options = { validate: true, name: "bar" };
@@ -1167,8 +1194,19 @@ jQuery.fn = jQuery.prototype = {
* @result settings == { validate: true, limit: 5, name: "bar" }
* @desc Merge defaults and options, without modifying the defaults
*
+ * @example var defaults = { validate: false, limit: 5, name: "foo", nested: {depth: false} };
+ * var options = { validate: true, name: "bar", nested: {depth: true} };
+ * var collision_resolver_fn = function(target, mergee) {
+ * // combine nested Objects, in this case the object being merged takes priority
+ * return jQuery.extend({}, target, mergee);
+ * }
+ * var settings = jQuery.extend({}, collision_resolver_fn, defaults, options);
+ * @result settings == { validate: true, limit: 5, name: "bar" }
+ * @desc Recursively merge defaults and options, without modifying the defaults
+ *
* @name $.extend
* @param Object target The object to extend
+ * @param Function (optional) collision resolution function. Hook to extend the merging behavior of $.extend(). See example.
* @param Object prop1 The object that will be merged into the first.
* @param Object propN (optional) More objects to merge into the first
* @type Object
@@ -1176,18 +1214,26 @@ jQuery.fn = jQuery.prototype = {
*/
jQuery.extend = jQuery.fn.extend = function() {
// copy reference to target object
- var target = arguments[0],
+ var resolver, prop, target = arguments[0],
a = 1;
-
+
// extend jQuery itself if only one argument is passed
if ( arguments.length == 1 ) {
target = this;
a = 0;
+ } else if (jQuery.isFunction(arguments[a])) {
+ resolver = arguments[a++];
}
- var prop;
+
while (prop = arguments[a++])
// Extend the base object
- for ( var i in prop ) target[i] = prop[i];
+ for ( var i in prop ) {
+ if (resolver && target[i] && prop[i]) {
+ target[i] = resolver(target[i], prop[i]);
+ } else {
+ target[i] = prop[i];
+ }
+ }
// Return the modified object
return target;
@@ -1238,7 +1284,7 @@ jQuery.extend({
// 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
@@ -1251,7 +1297,7 @@ jQuery.extend({
},
/**
- * 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.
@@ -1322,10 +1368,7 @@ jQuery.extend({
// internal only, use is(".class")
has: function( t, c ) {
- t = t.className || t;
- // escape regex characters
- c = c.replace(/([\.\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1");
- return t && new RegExp("(^|\\s)" + c + "(\\s|$)").test( t );
+ return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1;
}
},
@@ -1353,7 +1396,7 @@ jQuery.extend({
});
jQuery.swap( e, old, function() {
- if (jQuery.css(e,"display") != "none") {
+ if ( jQuery(e).is(':visible') ) {
oHeight = e.offsetHeight;
oWidth = e.offsetWidth;
} else {
@@ -1363,14 +1406,14 @@ jQuery.extend({
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);
@@ -1385,12 +1428,14 @@ jQuery.extend({
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];
@@ -1414,17 +1459,16 @@ jQuery.extend({
});
} 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;
@@ -1435,13 +1479,16 @@ jQuery.extend({
// 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).toLowerCase(), div = doc.createElement("div"), tb = [];
var wrap =
// option or optgroup
!s.indexOf("Hello
Hello
Hello
Hello AgainHello
Hello Again
Hello
And Again
@@ -1892,7 +1936,8 @@ new function() { * 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() * @beforeHello
And Again
@@ -2245,7 +2290,7 @@ jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){ */ /** - * 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);