// (both of which we optimize for)
var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
+// Is it a simple selector
+var isSimple = /^.[^:#\[\.]*$/;
+
jQuery.fn = jQuery.prototype = {
init: function( selector, context ) {
// Make sure that a selection was provided
// Copy the events from the original to the clone
if ( events === true )
this.find("*").andSelf().each(function(i){
+ if (this.nodeType == 3)
+ return;
var events = jQuery.data( this, "events" );
for ( var type in events )
},
not: function( selector ) {
- return this.pushStack(
- selector.constructor == String &&
- jQuery.multiFilter( selector, this, true ) ||
-
- jQuery.grep(this, function(elem) {
- return selector.constructor == Array || selector.jquery ?
- jQuery.inArray( elem, selector ) < 0 :
- elem != selector;
- }) );
+ if ( selector.constructor == String )
+ // test special case where just one selector is passed in
+ if ( isSimple.test( selector ) )
+ return this.pushStack( jQuery.multiFilter( selector, this, true ) );
+ else
+ selector = jQuery.multiFilter( selector, this );
+
+ var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
+ return this.filter(function() {
+ return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
+ });
},
add: function( selector ) {
}
- } else
- return this.each(function(){
- if ( this.nodeType != 1 )
- return;
+ return undefined;
+ }
- if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
- this.checked = (jQuery.inArray(this.value, value) >= 0 ||
- jQuery.inArray(this.name, value) >= 0);
+ return this.each(function(){
+ if ( this.nodeType != 1 )
+ return;
- else if ( jQuery.nodeName( this, "select" ) ) {
- var values = value.constructor == Array ?
- value :
- [ value ];
+ if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
+ this.checked = (jQuery.inArray(this.value, value) >= 0 ||
+ jQuery.inArray(this.name, value) >= 0);
- jQuery( "option", this ).each(function(){
- this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
- jQuery.inArray( this.text, values ) >= 0);
- });
+ else if ( jQuery.nodeName( this, "select" ) ) {
+ var values = value.constructor == Array ?
+ value :
+ [ value ];
- if ( !values.length )
- this.selectedIndex = -1;
+ jQuery( "option", this ).each(function(){
+ this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
+ jQuery.inArray( this.text, values ) >= 0);
+ });
- } else
- this.value = value;
- });
+ if ( !values.length )
+ this.selectedIndex = -1;
+
+ } else
+ this.value = value;
+ });
},
html: function( value ) {
jQuery.each(elems, function(){
var elem = clone ?
- this.cloneNode( true ) :
+ jQuery( this ).clone( true )[0] :
this;
// execute all scripts after the elements have been injected
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
+ // See test/unit/core.js for details concerning this function.
isFunction: function( fn ) {
return !!fn && typeof fn != "string" && !fn.nodeName &&
fn.constructor != Array && /function/i.test( fn + "" );
// args is for internal usage only
each: function( object, callback, args ) {
if ( args ) {
- if ( object.length == undefined )
+ if ( object.length == undefined ) {
for ( var name in object )
- callback.apply( object[ name ], args );
- else
+ if ( callback.apply( object[ name ], args ) === false )
+ break;
+ } else
for ( var i = 0, length = object.length; i < length; i++ )
if ( callback.apply( object[ i ], args ) === false )
break;
// A special, fast, case for the most common use of each
} else {
- if ( object.length == undefined )
+ if ( object.length == undefined ) {
for ( var name in object )
- callback.call( object[ name ], name, object[ name ] );
- else
+ if ( callback.call( object[ name ], name, object[ name ] ) === false )
+ break;
+ } else
for ( var i = 0, length = object.length, value = object[0];
i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
}
// A method for quickly swapping in/out CSS properties to get correct calculations
swap: function( elem, options, callback ) {
+ var old = {};
// Remember the old values, and insert the new ones
for ( var name in options ) {
- elem.style[ "old" + name ] = elem.style[ name ];
+ old[ name ] = elem.style[ name ];
elem.style[ name ] = options[ name ];
}
// Revert the old values
for ( var name in options )
- elem.style[ name ] = elem.style[ "old" + name ];
+ elem.style[ name ] = old[ name ];
},
css: function( elem, name, force ) {
if ( name == "width" || name == "height" ) {
- var width, height, props = { position: "absolute", visibility: "hidden", display:"block" };
+ var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
function getWH() {
- width = elem.clientWidth;
- height = elem.clientHeight;
+ val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
+ var padding = 0, border = 0;
+ jQuery.each( which, function() {
+ padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
+ border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
+ });
+ val -= Math.round(padding + border);
}
if ( jQuery(elem).is(":visible") )
getWH();
else
jQuery.swap( elem, props, getWH );
-
- return name == "width" ? width : height;
+
+ return Math.max(0, val);
}
return jQuery.curCSS( elem, name, force );
"1" :
ret;
}
+ // Opera sometimes will give the wrong display answer, this fixes it, see #2037
+ if ( jQuery.browser.opera && name == "display" ) {
+ var save = elem.style.display;
+ elem.style.display = "block";
+ elem.style.display = save;
+ }
// Make sure we're using the right name for getting the float value
if ( name.match( /float/i ) )
name = styleFloat;
- if ( !force && elem.style[ name ] )
+ if ( !force && elem.style && elem.style[ name ] )
ret = elem.style[ name ];
else if ( document.defaultView && document.defaultView.getComputedStyle ) {
if ( typeof elem == "string" ) {
// Fix "XHTML"-style tags in all browsers
elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
- return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i) ?
+ return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
all :
front + "></" + tag + ">";
});
div.childNodes :
[];
- for ( var i = tbody.length - 1; i >= 0 ; --i )
- if ( jQuery.nodeName( tbody[ i ], "tbody" ) && !tbody[ i ].childNodes.length )
- tbody[ i ].parentNode.removeChild( tbody[ i ] );
+ for ( var j = tbody.length - 1; j >= 0 ; --j )
+ if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
+ tbody[ j ].parentNode.removeChild( tbody[ j ] );
// IE completely kills leading whitespace when innerHTML is used
if ( /^\s/.test( elem ) )
// Get document width or height
this[0] == document ?
- // Either scroll[Width/Height] or offset[Width/Height], whichever is greater (Mozilla reports scrollWidth the same as offsetWidth)
- Math.max( document.body[ "scroll" + name ], document.body[ "offset" + name ] ) :
+ // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+ Math.max(
+ Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
+ Math.max(document.body["offset" + name], document.documentElement["offset" + name])
+ ) :
// Get or set width or height on the element
size == undefined ?