X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=edcaee20d3e7b0bcb99f30c952b8125b65847f78;hb=610149fd19c087e51ccd5975ba2c2e5c3bfe49a8;hp=1d96eacf61990c6ffb75fe5dac0022e651d1c778;hpb=6850c4b29017bcb31e16f0d6c94110a8b8a82304;p=jquery.git
diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js
index 1d96eac..edcaee2 100644
--- a/src/jquery/jquery.js
+++ b/src/jquery/jquery.js
@@ -614,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);
@@ -768,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 [...
] @@ -809,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 ); }, /** @@ -924,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
] @@ -952,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
@@ -1026,7 +1041,7 @@ 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;
},
/**
@@ -1109,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") )
@@ -1159,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" };
@@ -1172,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
@@ -1181,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;
@@ -1243,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
@@ -1256,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.
@@ -1327,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;
}
},
@@ -1358,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 {
@@ -1368,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);
@@ -1390,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];
@@ -1419,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;
@@ -1440,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
@@ -1897,7 +1937,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
@@ -2250,7 +2291,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);