mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Fix #5571. Setters should treat undefined
as a no-op and be chainable.
This commit is contained in:
parent
d511613d74
commit
6c2a501de4
@ -12,7 +12,7 @@ var rclass = /[\n\t\r]/g,
|
|||||||
|
|
||||||
jQuery.fn.extend({
|
jQuery.fn.extend({
|
||||||
attr: function( name, value ) {
|
attr: function( name, value ) {
|
||||||
return jQuery.access( this, name, value, true, jQuery.attr );
|
return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
|
||||||
},
|
},
|
||||||
|
|
||||||
removeAttr: function( name ) {
|
removeAttr: function( name ) {
|
||||||
@ -22,7 +22,7 @@ jQuery.fn.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
prop: function( name, value ) {
|
prop: function( name, value ) {
|
||||||
return jQuery.access( this, name, value, true, jQuery.prop );
|
return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
|
||||||
},
|
},
|
||||||
|
|
||||||
removeProp: function( name ) {
|
removeProp: function( name ) {
|
||||||
|
56
src/core.js
56
src/core.js
@ -801,31 +801,55 @@ jQuery.extend({
|
|||||||
|
|
||||||
// Mutifunctional method to get and set values to a collection
|
// Mutifunctional method to get and set values to a collection
|
||||||
// The value/s can optionally be executed if it's a function
|
// The value/s can optionally be executed if it's a function
|
||||||
access: function( elems, key, value, exec, fn, pass ) {
|
access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
|
||||||
var length = elems.length;
|
var exec,
|
||||||
|
bulk = key == null,
|
||||||
|
i = 0,
|
||||||
|
length = elems.length;
|
||||||
|
|
||||||
// Setting many attributes
|
// Sets many values
|
||||||
if ( typeof key === "object" ) {
|
if ( key && typeof key === "object" ) {
|
||||||
for ( var k in key ) {
|
for ( i in key ) {
|
||||||
jQuery.access( elems, k, key[k], exec, fn, value );
|
jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
|
||||||
}
|
|
||||||
return elems;
|
|
||||||
}
|
}
|
||||||
|
chainable = 1;
|
||||||
|
|
||||||
// Setting one attribute
|
// Sets one value
|
||||||
if ( value !== undefined ) {
|
} else if ( value !== undefined ) {
|
||||||
// Optionally, function values get executed if exec is true
|
// Optionally, function values get executed if exec is true
|
||||||
exec = !pass && exec && jQuery.isFunction(value);
|
exec = pass === undefined && jQuery.isFunction( value );
|
||||||
|
|
||||||
for ( var i = 0; i < length; i++ ) {
|
if ( bulk ) {
|
||||||
|
// Bulk operations only iterate when executing function values
|
||||||
|
if ( exec ) {
|
||||||
|
exec = fn;
|
||||||
|
fn = function( elem, key, value ) {
|
||||||
|
return exec.call( jQuery( elem ), value );
|
||||||
|
};
|
||||||
|
|
||||||
|
// Otherwise they run against the entire set
|
||||||
|
} else {
|
||||||
|
fn.call( elems, value );
|
||||||
|
fn = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( fn ) {
|
||||||
|
for (; i < length; i++ ) {
|
||||||
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
|
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
|
||||||
}
|
}
|
||||||
|
|
||||||
return elems;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getting an attribute
|
chainable = 1;
|
||||||
return length ? fn( elems[0], key ) : undefined;
|
}
|
||||||
|
|
||||||
|
return chainable ?
|
||||||
|
elems :
|
||||||
|
|
||||||
|
// Gets
|
||||||
|
bulk ?
|
||||||
|
fn.call( elems ) :
|
||||||
|
length ? fn( elems[0], key ) : emptyGet;
|
||||||
},
|
},
|
||||||
|
|
||||||
now: function() {
|
now: function() {
|
||||||
|
@ -17,16 +17,11 @@ var ralpha = /alpha\([^)]*\)/i,
|
|||||||
currentStyle;
|
currentStyle;
|
||||||
|
|
||||||
jQuery.fn.css = function( name, value ) {
|
jQuery.fn.css = function( name, value ) {
|
||||||
// Setting 'undefined' is a no-op
|
return jQuery.access( this, function( elem, name, value ) {
|
||||||
if ( arguments.length === 2 && value === undefined ) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
return jQuery.access( this, name, value, true, function( elem, name, value ) {
|
|
||||||
return value !== undefined ?
|
return value !== undefined ?
|
||||||
jQuery.style( elem, name, value ) :
|
jQuery.style( elem, name, value ) :
|
||||||
jQuery.css( elem, name );
|
jQuery.css( elem, name );
|
||||||
});
|
}, name, value, arguments.length > 1 );
|
||||||
};
|
};
|
||||||
|
|
||||||
jQuery.extend({
|
jQuery.extend({
|
||||||
|
55
src/data.js
55
src/data.js
@ -246,62 +246,69 @@ jQuery.extend({
|
|||||||
|
|
||||||
jQuery.fn.extend({
|
jQuery.fn.extend({
|
||||||
data: function( key, value ) {
|
data: function( key, value ) {
|
||||||
var parts, attr, name,
|
var parts, part, attr, name, l,
|
||||||
|
elem = this[0],
|
||||||
|
i = 0,
|
||||||
data = null;
|
data = null;
|
||||||
|
|
||||||
if ( typeof key === "undefined" ) {
|
// Gets all values
|
||||||
|
if ( key === undefined ) {
|
||||||
if ( this.length ) {
|
if ( this.length ) {
|
||||||
data = jQuery.data( this[0] );
|
data = jQuery.data( elem );
|
||||||
|
|
||||||
if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
|
if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
|
||||||
attr = this[0].attributes;
|
attr = elem.attributes;
|
||||||
for ( var i = 0, l = attr.length; i < l; i++ ) {
|
for ( l = attr.length; i < l; i++ ) {
|
||||||
name = attr[i].name;
|
name = attr[i].name;
|
||||||
|
|
||||||
if ( name.indexOf( "data-" ) === 0 ) {
|
if ( name.indexOf( "data-" ) === 0 ) {
|
||||||
name = jQuery.camelCase( name.substring(5) );
|
name = jQuery.camelCase( name.substring(5) );
|
||||||
|
|
||||||
dataAttr( this[0], name, data[ name ] );
|
dataAttr( elem, name, data[ name ] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
jQuery._data( this[0], "parsedAttrs", true );
|
jQuery._data( elem, "parsedAttrs", true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
} else if ( typeof key === "object" ) {
|
// Sets multiple values
|
||||||
|
if ( typeof key === "object" ) {
|
||||||
return this.each(function() {
|
return this.each(function() {
|
||||||
jQuery.data( this, key );
|
jQuery.data( this, key );
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
parts = key.split(".");
|
return jQuery.access( this, function( value ) {
|
||||||
|
parts = key.split( ".", 2 ),
|
||||||
parts[1] = parts[1] ? "." + parts[1] : "";
|
parts[1] = parts[1] ? "." + parts[1] : "";
|
||||||
|
part = parts[1] + "!";
|
||||||
|
|
||||||
if ( value === undefined ) {
|
if ( value === undefined ) {
|
||||||
data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
|
data = this.triggerHandler( "getData" + part, [ parts[0] ] );
|
||||||
|
|
||||||
// Try to fetch any internally stored data first
|
// Try to fetch any internally stored data first
|
||||||
if ( data === undefined && this.length ) {
|
if ( data === undefined && elem ) {
|
||||||
data = jQuery.data( this[0], key );
|
data = jQuery.data( elem, key );
|
||||||
data = dataAttr( this[0], key, data );
|
data = dataAttr( elem, key, data );
|
||||||
}
|
}
|
||||||
|
|
||||||
return data === undefined && parts[1] ?
|
return data === undefined && parts[1] ?
|
||||||
this.data( parts[0] ) :
|
this.data( parts[0] ) :
|
||||||
data;
|
data;
|
||||||
|
|
||||||
} else {
|
|
||||||
return this.each(function() {
|
|
||||||
var self = jQuery( this ),
|
|
||||||
args = [ parts[0], value ];
|
|
||||||
|
|
||||||
self.triggerHandler( "setData" + parts[1] + "!", args );
|
|
||||||
jQuery.data( this, key, value );
|
|
||||||
self.triggerHandler( "changeData" + parts[1] + "!", args );
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parts[1] = value;
|
||||||
|
this.each(function() {
|
||||||
|
var self = jQuery( this );
|
||||||
|
|
||||||
|
self.triggerHandler( "setData" + part, parts );
|
||||||
|
jQuery.data( this, key, value );
|
||||||
|
self.triggerHandler( "changeData" + part, parts );
|
||||||
|
});
|
||||||
|
}, null, value, arguments.length > 1, null, false );
|
||||||
},
|
},
|
||||||
|
|
||||||
removeData: function( key ) {
|
removeData: function( key ) {
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
(function( jQuery ) {
|
(function( jQuery ) {
|
||||||
|
|
||||||
// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
|
// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
|
||||||
jQuery.each([ "Height", "Width" ], function( i, name ) {
|
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
|
||||||
|
var clientProp = "client" + name,
|
||||||
var type = name.toLowerCase();
|
scrollProp = "scroll" + name,
|
||||||
|
offsetProp = "offset" + name;
|
||||||
|
|
||||||
// innerHeight and innerWidth
|
// innerHeight and innerWidth
|
||||||
jQuery.fn[ "inner" + name ] = function() {
|
jQuery.fn[ "inner" + name ] = function() {
|
||||||
@ -25,50 +26,40 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
|
|||||||
null;
|
null;
|
||||||
};
|
};
|
||||||
|
|
||||||
jQuery.fn[ type ] = function( size ) {
|
jQuery.fn[ type ] = function( value ) {
|
||||||
// Get window width or height
|
return jQuery.access( this, function( elem, type, value ) {
|
||||||
var elem = this[0];
|
var doc, docElemProp, orig, ret;
|
||||||
if ( !elem ) {
|
|
||||||
return size == null ? null : this;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( jQuery.isFunction( size ) ) {
|
|
||||||
return this.each(function( i ) {
|
|
||||||
var self = jQuery( this );
|
|
||||||
self[ type ]( size.call( this, i, self[ type ]() ) );
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( jQuery.isWindow( elem ) ) {
|
if ( jQuery.isWindow( elem ) ) {
|
||||||
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
|
|
||||||
// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
|
// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
|
||||||
var docElemProp = elem.document.documentElement[ "client" + name ],
|
doc = elem.document;
|
||||||
body = elem.document.body;
|
docElemProp = doc.documentElement[ clientProp ];
|
||||||
return elem.document.compatMode === "CSS1Compat" && docElemProp ||
|
return doc.compatMode === "CSS1Compat" && docElemProp ||
|
||||||
body && body[ "client" + name ] || docElemProp;
|
doc.body && doc.body[ clientProp ] || docElemProp;
|
||||||
|
}
|
||||||
|
|
||||||
// Get document width or height
|
// Get document width or height
|
||||||
} else if ( elem.nodeType === 9 ) {
|
if ( elem.nodeType === 9 ) {
|
||||||
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
|
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
|
||||||
|
doc = elem.documentElement;
|
||||||
return Math.max(
|
return Math.max(
|
||||||
elem.documentElement["client" + name],
|
doc[ clientProp ],
|
||||||
elem.body["scroll" + name], elem.documentElement["scroll" + name],
|
elem.body[ scrollProp ], doc[ scrollProp ],
|
||||||
elem.body["offset" + name], elem.documentElement["offset" + name]
|
elem.body[ offsetProp ], doc[ offsetProp ]
|
||||||
);
|
);
|
||||||
|
|
||||||
// Get or set width or height on the element
|
|
||||||
} else if ( size === undefined ) {
|
|
||||||
var orig = jQuery.css( elem, type ),
|
|
||||||
ret = parseFloat( orig );
|
|
||||||
|
|
||||||
return jQuery.isNumeric( ret ) ? ret : orig;
|
|
||||||
|
|
||||||
// Set the width or height on the element (default to pixels if value is unitless)
|
|
||||||
} else {
|
|
||||||
return this.css( type, typeof size === "string" ? size : size + "px" );
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
|
// Get width or height on the element
|
||||||
|
if ( value === undefined ) {
|
||||||
|
orig = jQuery.css( elem, type );
|
||||||
|
ret = parseFloat( orig );
|
||||||
|
return jQuery.isNumeric( ret ) ? ret : orig;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the width or height on the element
|
||||||
|
jQuery( elem ).css( type, value );
|
||||||
|
}, type, value, arguments.length, null );
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
})( jQuery );
|
})( jQuery );
|
||||||
|
@ -51,20 +51,12 @@ if ( !jQuery.support.htmlSerialize ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
jQuery.fn.extend({
|
jQuery.fn.extend({
|
||||||
text: function( text ) {
|
text: function( value ) {
|
||||||
if ( jQuery.isFunction(text) ) {
|
return jQuery.access( this, function( value ) {
|
||||||
return this.each(function(i) {
|
return value === undefined ?
|
||||||
var self = jQuery( this );
|
jQuery.text( this ) :
|
||||||
|
this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
|
||||||
self.text( text.call(this, i, self.text()) );
|
}, null, value, arguments.length );
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( typeof text !== "object" && text !== undefined ) {
|
|
||||||
return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
return jQuery.text( this );
|
|
||||||
},
|
},
|
||||||
|
|
||||||
wrapAll: function( html ) {
|
wrapAll: function( html ) {
|
||||||
@ -216,44 +208,44 @@ jQuery.fn.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
html: function( value ) {
|
html: function( value ) {
|
||||||
|
return jQuery.access( this, function( value ) {
|
||||||
|
var elem = this[0] || {},
|
||||||
|
i = 0,
|
||||||
|
l = this.length;
|
||||||
|
|
||||||
if ( value === undefined ) {
|
if ( value === undefined ) {
|
||||||
return this[0] && this[0].nodeType === 1 ?
|
return elem.nodeType === 1 ?
|
||||||
this[0].innerHTML.replace(rinlinejQuery, "") :
|
elem.innerHTML.replace( rinlinejQuery, "" ) :
|
||||||
null;
|
null;
|
||||||
|
}
|
||||||
|
|
||||||
// See if we can take a shortcut and just use innerHTML
|
|
||||||
} else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
|
|
||||||
(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
|
|
||||||
!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
|
|
||||||
|
|
||||||
value = value.replace(rxhtmlTag, "<$1></$2>");
|
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
|
||||||
|
( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
|
||||||
|
!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
|
||||||
|
|
||||||
|
value = value.replace( rxhtmlTag, "<$1></$2>" );
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for ( var i = 0, l = this.length; i < l; i++ ) {
|
for (; i < l; i++ ) {
|
||||||
// Remove element nodes and prevent memory leaks
|
// Remove element nodes and prevent memory leaks
|
||||||
if ( this[i].nodeType === 1 ) {
|
elem = this[i] || {};
|
||||||
jQuery.cleanData( this[i].getElementsByTagName("*") );
|
if ( elem.nodeType === 1 ) {
|
||||||
this[i].innerHTML = value;
|
jQuery.cleanData( elem.getElementsByTagName( "*" ) );
|
||||||
|
elem.innerHTML = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
elem = 0;
|
||||||
|
|
||||||
// If using innerHTML throws an exception, use the fallback method
|
// If using innerHTML throws an exception, use the fallback method
|
||||||
} catch(e) {
|
} catch(e) {}
|
||||||
this.empty().append( value );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ( jQuery.isFunction( value ) ) {
|
if ( elem ) {
|
||||||
this.each(function(i){
|
|
||||||
var self = jQuery( this );
|
|
||||||
|
|
||||||
self.html( value.call(this, i, self.html()) );
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
|
||||||
this.empty().append( value );
|
this.empty().append( value );
|
||||||
}
|
}
|
||||||
|
}, null, value, arguments.length );
|
||||||
return this;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
replaceWith: function( value ) {
|
replaceWith: function( value ) {
|
||||||
|
@ -1,40 +1,22 @@
|
|||||||
(function( jQuery ) {
|
(function( jQuery ) {
|
||||||
|
|
||||||
var rtable = /^t(?:able|d|h)$/i,
|
var getOffset,
|
||||||
|
rtable = /^t(?:able|d|h)$/i,
|
||||||
rroot = /^(?:body|html)$/i;
|
rroot = /^(?:body|html)$/i;
|
||||||
|
|
||||||
if ( "getBoundingClientRect" in document.documentElement ) {
|
if ( "getBoundingClientRect" in document.documentElement ) {
|
||||||
jQuery.fn.offset = function( options ) {
|
getOffset = function( elem, doc, docElem, box ) {
|
||||||
var elem = this[0], box;
|
|
||||||
|
|
||||||
if ( options ) {
|
|
||||||
return this.each(function( i ) {
|
|
||||||
jQuery.offset.setOffset( this, options, i );
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !elem || !elem.ownerDocument ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( elem === elem.ownerDocument.body ) {
|
|
||||||
return jQuery.offset.bodyOffset( elem );
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
box = elem.getBoundingClientRect();
|
box = elem.getBoundingClientRect();
|
||||||
} catch(e) {}
|
} catch(e) {}
|
||||||
|
|
||||||
var doc = elem.ownerDocument,
|
|
||||||
docElem = doc.documentElement;
|
|
||||||
|
|
||||||
// Make sure we're not dealing with a disconnected DOM node
|
// Make sure we're not dealing with a disconnected DOM node
|
||||||
if ( !box || !jQuery.contains( docElem, elem ) ) {
|
if ( !box || !jQuery.contains( docElem, elem ) ) {
|
||||||
return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
|
return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
var body = doc.body,
|
var body = doc.body,
|
||||||
win = getWindow(doc),
|
win = getWindow( doc ),
|
||||||
clientTop = docElem.clientTop || body.clientTop || 0,
|
clientTop = docElem.clientTop || body.clientTop || 0,
|
||||||
clientLeft = docElem.clientLeft || body.clientLeft || 0,
|
clientLeft = docElem.clientLeft || body.clientLeft || 0,
|
||||||
scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
|
scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
|
||||||
@ -46,28 +28,10 @@ if ( "getBoundingClientRect" in document.documentElement ) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
jQuery.fn.offset = function( options ) {
|
getOffset = function( elem, doc, docElem ) {
|
||||||
var elem = this[0];
|
|
||||||
|
|
||||||
if ( options ) {
|
|
||||||
return this.each(function( i ) {
|
|
||||||
jQuery.offset.setOffset( this, options, i );
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !elem || !elem.ownerDocument ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( elem === elem.ownerDocument.body ) {
|
|
||||||
return jQuery.offset.bodyOffset( elem );
|
|
||||||
}
|
|
||||||
|
|
||||||
var computedStyle,
|
var computedStyle,
|
||||||
offsetParent = elem.offsetParent,
|
offsetParent = elem.offsetParent,
|
||||||
prevOffsetParent = elem,
|
prevOffsetParent = elem,
|
||||||
doc = elem.ownerDocument,
|
|
||||||
docElem = doc.documentElement,
|
|
||||||
body = doc.body,
|
body = doc.body,
|
||||||
defaultView = doc.defaultView,
|
defaultView = doc.defaultView,
|
||||||
prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
|
prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
|
||||||
@ -118,6 +82,29 @@ if ( "getBoundingClientRect" in document.documentElement ) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jQuery.fn.offset = function( options ) {
|
||||||
|
if ( arguments.length ) {
|
||||||
|
return options === undefined ?
|
||||||
|
this :
|
||||||
|
this.each(function( i ) {
|
||||||
|
jQuery.offset.setOffset( this, options, i );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var elem = this[0],
|
||||||
|
doc = elem && elem.ownerDocument;
|
||||||
|
|
||||||
|
if ( !doc ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( elem === doc.body ) {
|
||||||
|
return jQuery.offset.bodyOffset( elem );
|
||||||
|
}
|
||||||
|
|
||||||
|
return getOffset( elem, doc, doc.documentElement );
|
||||||
|
};
|
||||||
|
|
||||||
jQuery.offset = {
|
jQuery.offset = {
|
||||||
|
|
||||||
bodyOffset: function( body ) {
|
bodyOffset: function( body ) {
|
||||||
@ -223,42 +210,30 @@ jQuery.fn.extend({
|
|||||||
|
|
||||||
|
|
||||||
// Create scrollLeft and scrollTop methods
|
// Create scrollLeft and scrollTop methods
|
||||||
jQuery.each( ["Left", "Top"], function( i, name ) {
|
jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
|
||||||
var method = "scroll" + name;
|
var top = /Y/.test( prop );
|
||||||
|
|
||||||
jQuery.fn[ method ] = function( val ) {
|
jQuery.fn[ method ] = function( val ) {
|
||||||
var elem, win;
|
return jQuery.access( this, function( elem, method, val ) {
|
||||||
|
var win = getWindow( elem );
|
||||||
|
|
||||||
if ( val === undefined ) {
|
if ( val === undefined ) {
|
||||||
elem = this[ 0 ];
|
return win ? (prop in win) ? win[ prop ] :
|
||||||
|
|
||||||
if ( !elem ) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
win = getWindow( elem );
|
|
||||||
|
|
||||||
// Return the scroll offset
|
|
||||||
return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
|
|
||||||
jQuery.support.boxModel && win.document.documentElement[ method ] ||
|
jQuery.support.boxModel && win.document.documentElement[ method ] ||
|
||||||
win.document.body[ method ] :
|
win.document.body[ method ] :
|
||||||
elem[ method ];
|
elem[ method ];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the scroll offset
|
|
||||||
return this.each(function() {
|
|
||||||
win = getWindow( this );
|
|
||||||
|
|
||||||
if ( win ) {
|
if ( win ) {
|
||||||
win.scrollTo(
|
win.scrollTo(
|
||||||
!i ? val : jQuery( win ).scrollLeft(),
|
!top ? val : jQuery( win ).scrollLeft(),
|
||||||
i ? val : jQuery( win ).scrollTop()
|
top ? val : jQuery( win ).scrollTop()
|
||||||
);
|
);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
this[ method ] = val;
|
elem[ method ] = val;
|
||||||
}
|
}
|
||||||
});
|
}, method, val, arguments.length, null );
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
10
src/queue.js
10
src/queue.js
@ -100,15 +100,21 @@ jQuery.extend({
|
|||||||
|
|
||||||
jQuery.fn.extend({
|
jQuery.fn.extend({
|
||||||
queue: function( type, data ) {
|
queue: function( type, data ) {
|
||||||
|
var setter = 2;
|
||||||
|
|
||||||
if ( typeof type !== "string" ) {
|
if ( typeof type !== "string" ) {
|
||||||
data = type;
|
data = type;
|
||||||
type = "fx";
|
type = "fx";
|
||||||
|
setter--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( data === undefined ) {
|
if ( arguments.length < setter ) {
|
||||||
return jQuery.queue( this[0], type );
|
return jQuery.queue( this[0], type );
|
||||||
}
|
}
|
||||||
return this.each(function() {
|
|
||||||
|
return data === undefined ?
|
||||||
|
this :
|
||||||
|
this.each(function() {
|
||||||
var queue = jQuery.queue( this, type, data );
|
var queue = jQuery.queue( this, type, data );
|
||||||
|
|
||||||
if ( type === "fx" && queue[0] !== "inprogress" ) {
|
if ( type === "fx" && queue[0] !== "inprogress" ) {
|
||||||
|
@ -158,7 +158,7 @@ test("attr(Hash)", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test("attr(String, Object)", function() {
|
test("attr(String, Object)", function() {
|
||||||
expect(78);
|
expect(81);
|
||||||
|
|
||||||
var div = jQuery("div").attr("foo", "bar"),
|
var div = jQuery("div").attr("foo", "bar"),
|
||||||
fail = false;
|
fail = false;
|
||||||
@ -353,6 +353,12 @@ test("attr(String, Object)", function() {
|
|||||||
+ "</svg>").appendTo("body");
|
+ "</svg>").appendTo("body");
|
||||||
equal( $svg.attr("cx", 100).attr("cx"), "100", "Set attribute on svg element" );
|
equal( $svg.attr("cx", 100).attr("cx"), "100", "Set attribute on svg element" );
|
||||||
$svg.remove();
|
$svg.remove();
|
||||||
|
|
||||||
|
// undefined values are chainable
|
||||||
|
jQuery("#name").attr("maxlength", "5").removeAttr("nonexisting");
|
||||||
|
equal( typeof jQuery("#name").attr("maxlength", undefined), "object", ".attr('attribute', undefined) is chainable (#5571)" );
|
||||||
|
equal( jQuery("#name").attr("maxlength", undefined).attr("maxlength"), "5", ".attr('attribute', undefined) does not change value (#5571)" );
|
||||||
|
equal( jQuery("#name").attr("nonexisting", undefined).attr("nonexisting"), undefined, ".attr('attribute', undefined) does not create attribute (#5571)" );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("attr(jquery_method)", function(){
|
test("attr(jquery_method)", function(){
|
||||||
|
@ -222,8 +222,7 @@ test(".data(String) and .data(String, Object)", function() {
|
|||||||
div.data("test", "overwritten");
|
div.data("test", "overwritten");
|
||||||
equal( div.data("test"), "overwritten", "Check for overwritten data" );
|
equal( div.data("test"), "overwritten", "Check for overwritten data" );
|
||||||
|
|
||||||
div.data("test", undefined);
|
equal( div.data("test", undefined).data("test"), "overwritten", "Check that .data('key',undefined) does nothing but is chainable (#5571)");
|
||||||
equal( div.data("test"), "overwritten", "Check that data wasn't removed");
|
|
||||||
|
|
||||||
div.data("test", null);
|
div.data("test", null);
|
||||||
ok( div.data("test") === null, "Check for null data");
|
ok( div.data("test") === null, "Check for null data");
|
||||||
|
@ -41,11 +41,16 @@ test("width()", function() {
|
|||||||
testWidth( pass );
|
testWidth( pass );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("width() with function", function() {
|
test("width(undefined)", function() {
|
||||||
|
expect(1);
|
||||||
|
equal(jQuery("#nothiddendiv").width(30).width(undefined).width(), 30, ".width(undefined) is chainable (#5571)");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("width(Function)", function() {
|
||||||
testWidth( fn );
|
testWidth( fn );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("width() with function args", function() {
|
test("width(Function(args))", function() {
|
||||||
expect( 2 );
|
expect( 2 );
|
||||||
|
|
||||||
var $div = jQuery("#nothiddendiv");
|
var $div = jQuery("#nothiddendiv");
|
||||||
@ -90,11 +95,16 @@ test("height()", function() {
|
|||||||
testHeight( pass );
|
testHeight( pass );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("height() with function", function() {
|
test("height(undefined)", function() {
|
||||||
|
expect(1);
|
||||||
|
equal(jQuery("#nothiddendiv").height(30).height(undefined).height(), 30, ".height(undefined) is chainable (#5571)");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("height(Function)", function() {
|
||||||
testHeight( fn );
|
testHeight( fn );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("height() with function args", function() {
|
test("height(Function(args))", function() {
|
||||||
expect( 2 );
|
expect( 2 );
|
||||||
|
|
||||||
var $div = jQuery("#nothiddendiv");
|
var $div = jQuery("#nothiddendiv");
|
||||||
|
@ -16,6 +16,11 @@ test("text()", function() {
|
|||||||
notEqual( jQuery(document).text(), "", "Retrieving text for the document retrieves all text (#10724).");
|
notEqual( jQuery(document).text(), "", "Retrieving text for the document retrieves all text (#10724).");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("text(undefined)", function() {
|
||||||
|
expect(1);
|
||||||
|
equal( jQuery("#foo").text("<div").text(undefined)[0].innerHTML, "<div", ".text(undefined) is chainable (#5571)" );
|
||||||
|
});
|
||||||
|
|
||||||
var testText = function(valueObj) {
|
var testText = function(valueObj) {
|
||||||
expect(4);
|
expect(4);
|
||||||
var val = valueObj("<div><b>Hello</b> cruel world!</div>");
|
var val = valueObj("<div><b>Hello</b> cruel world!</div>");
|
||||||
@ -1207,6 +1212,11 @@ test("clone() on XML nodes", function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("html(undefined)", function() {
|
||||||
|
expect(1);
|
||||||
|
equal( jQuery("#foo").html("<i>test</i>").html(undefined).html().toLowerCase(), "<i>test</i>", ".html(undefined) is chainable (#5571)" );
|
||||||
|
});
|
||||||
|
|
||||||
var testHtml = function(valueObj) {
|
var testHtml = function(valueObj) {
|
||||||
expect(34);
|
expect(34);
|
||||||
|
|
||||||
|
@ -342,7 +342,7 @@ testoffset("table", function( jQuery ) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
testoffset("scroll", function( jQuery, win ) {
|
testoffset("scroll", function( jQuery, win ) {
|
||||||
expect(22);
|
expect(24);
|
||||||
|
|
||||||
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8;
|
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8;
|
||||||
|
|
||||||
@ -362,8 +362,9 @@ testoffset("scroll", function( jQuery, win ) {
|
|||||||
equal( jQuery("#scroll-1-1").scrollTop(), 0, "jQuery('#scroll-1-1').scrollTop()" );
|
equal( jQuery("#scroll-1-1").scrollTop(), 0, "jQuery('#scroll-1-1').scrollTop()" );
|
||||||
equal( jQuery("#scroll-1-1").scrollLeft(), 0, "jQuery('#scroll-1-1').scrollLeft()" );
|
equal( jQuery("#scroll-1-1").scrollLeft(), 0, "jQuery('#scroll-1-1').scrollLeft()" );
|
||||||
|
|
||||||
// equal( jQuery("body").scrollTop(), 0, "jQuery("body").scrollTop()" );
|
// scroll method chaining
|
||||||
// equal( jQuery("body").scrollLeft(), 0, "jQuery("body").scrollTop()" );
|
equal( jQuery("#scroll-1").scrollTop(undefined).scrollTop(), 5, ".scrollTop(undefined) is chainable (#5571)" );
|
||||||
|
equal( jQuery("#scroll-1").scrollLeft(undefined).scrollLeft(), 5, ".scrollLeft(undefined) is chainable (#5571)" );
|
||||||
|
|
||||||
win.name = "test";
|
win.name = "test";
|
||||||
|
|
||||||
@ -405,11 +406,12 @@ testoffset("body", function( jQuery ) {
|
|||||||
equal( jQuery("body").offset().left, 1, "jQuery('#body').offset().left" );
|
equal( jQuery("body").offset().left, 1, "jQuery('#body').offset().left" );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Chaining offset(coords) returns jQuery object", function() {
|
test("chaining", function() {
|
||||||
expect(2);
|
expect(3);
|
||||||
var coords = { top: 1, left: 1 };
|
var coords = { top: 1, left: 1 };
|
||||||
equal( jQuery("#absolute-1").offset(coords).selector, "#absolute-1", "offset(coords) returns jQuery object" );
|
equal( jQuery("#absolute-1").offset(coords).selector, "#absolute-1", "offset(coords) returns jQuery object" );
|
||||||
equal( jQuery("#non-existent").offset(coords).selector, "#non-existent", "offset(coords) with empty jQuery set returns jQuery object" );
|
equal( jQuery("#non-existent").offset(coords).selector, "#non-existent", "offset(coords) with empty jQuery set returns jQuery object" );
|
||||||
|
equal( jQuery("#absolute-1").offset(undefined).selector, "#absolute-1", "offset(undefined) returns jQuery object (#5571)" );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("offsetParent", function(){
|
test("offsetParent", function(){
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
module("queue", { teardown: moduleTeardown });
|
module("queue", { teardown: moduleTeardown });
|
||||||
|
|
||||||
test("queue() with other types",function() {
|
test("queue() with other types",function() {
|
||||||
expect(11);
|
expect(12);
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
@ -36,6 +36,8 @@ test("queue() with other types",function() {
|
|||||||
|
|
||||||
equal( $div.queue("foo").length, 4, "Testing queue length" );
|
equal( $div.queue("foo").length, 4, "Testing queue length" );
|
||||||
|
|
||||||
|
equal( $div.queue("foo", undefined).queue("foo").length, 4, ".queue('name',undefined) does nothing but is chainable (#5571)");
|
||||||
|
|
||||||
$div.dequeue("foo");
|
$div.dequeue("foo");
|
||||||
|
|
||||||
equal( counter, 3, "Testing previous call to dequeue" );
|
equal( counter, 3, "Testing previous call to dequeue" );
|
||||||
|
Loading…
Reference in New Issue
Block a user