|
@@ -3,10 +3,7 @@ var nodeHook, boolHook, |
|
|
rreturn = /\r/g, |
|
|
rfocusable = /^(?:input|select|textarea|button|object)$/i, |
|
|
rclickable = /^(?:a|area)$/i, |
|
|
rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i, |
|
|
ruseDefault = /^(?:checked|selected)$/i, |
|
|
getSetAttribute = jQuery.support.getSetAttribute, |
|
|
getSetInput = jQuery.support.input; |
|
|
rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i; |
|
|
|
|
|
jQuery.fn.extend({ |
|
|
attr: function( name, value ) { |
|
@@ -349,22 +346,12 @@ jQuery.extend({ |
|
|
propName = jQuery.propFix[ name ] || name; |
|
|
|
|
|
// Boolean attributes get special treatment (#10870) |
|
|
// Set corresponding property to false for boolean attributes |
|
|
if ( rboolean.test( name ) ) { |
|
|
// Set corresponding property to false for boolean attributes |
|
|
// Also clear defaultChecked/defaultSelected (if appropriate) for IE<8 |
|
|
if ( !getSetAttribute && ruseDefault.test( name ) ) { |
|
|
elem[ jQuery.camelCase( "default-" + name ) ] = |
|
|
elem[ propName ] = false; |
|
|
} else { |
|
|
elem[ propName ] = false; |
|
|
} |
|
|
|
|
|
// See #9699 for explanation of this approach (setting first, then removal) |
|
|
} else { |
|
|
jQuery.attr( elem, name, "" ); |
|
|
elem[ propName ] = false; |
|
|
} |
|
|
|
|
|
elem.removeAttribute( getSetAttribute ? name : propName ); |
|
|
elem.removeAttribute( name ); |
|
|
} |
|
|
} |
|
|
}, |
|
@@ -456,185 +443,21 @@ jQuery.extend({ |
|
|
// Hook for boolean attributes |
|
|
boolHook = { |
|
|
get: function( elem, name ) { |
|
|
var |
|
|
// Use .prop to determine if this attribute is understood as boolean |
|
|
prop = jQuery.prop( elem, name ), |
|
|
|
|
|
// Fetch it accordingly |
|
|
attr = typeof prop === "boolean" && elem.getAttribute( name ), |
|
|
detail = typeof prop === "boolean" ? |
|
|
|
|
|
getSetInput && getSetAttribute ? |
|
|
attr != null : |
|
|
// oldIE fabricates an empty string for missing boolean attributes |
|
|
// and conflates checked/selected into attroperties |
|
|
ruseDefault.test( name ) ? |
|
|
elem[ jQuery.camelCase( "default-" + name ) ] : |
|
|
!!attr : |
|
|
|
|
|
// fetch an attribute node for properties not recognized as boolean |
|
|
elem.getAttributeNode( name ); |
|
|
|
|
|
return detail && detail.value !== false ? |
|
|
return elem.getAttribute( name ) !== null ? |
|
|
name.toLowerCase() : |
|
|
undefined; |
|
|
}, |
|
|
set: function( elem, value, name ) { |
|
|
if ( value === false ) { |
|
|
// Remove boolean attributes when set to false |
|
|
jQuery.removeAttr( elem, name ); |
|
|
} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { |
|
|
// IE<8 needs the *property* name |
|
|
elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); |
|
|
|
|
|
// Use defaultChecked and defaultSelected for oldIE |
|
|
} else { |
|
|
elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; |
|
|
elem.setAttribute( name, name ); |
|
|
} |
|
|
|
|
|
return name; |
|
|
} |
|
|
}; |
|
|
|
|
|
// fix oldIE value attroperty |
|
|
if ( !getSetInput || !getSetAttribute ) { |
|
|
jQuery.attrHooks.value = { |
|
|
get: function( elem, name ) { |
|
|
var ret = elem.getAttributeNode( name ); |
|
|
return jQuery.nodeName( elem, "input" ) ? |
|
|
|
|
|
// Ignore the value *property* by using defaultValue |
|
|
elem.defaultValue : |
|
|
|
|
|
ret && ret.specified ? ret.value : undefined; |
|
|
}, |
|
|
set: function( elem, value, name ) { |
|
|
if ( jQuery.nodeName( elem, "input" ) ) { |
|
|
// Does not return so that setAttribute is also used |
|
|
elem.defaultValue = value; |
|
|
} else { |
|
|
// Use nodeHook if defined (#1954); otherwise setAttribute is fine |
|
|
return nodeHook && nodeHook.set( elem, value, name ); |
|
|
} |
|
|
} |
|
|
}; |
|
|
} |
|
|
|
|
|
// IE6/7 do not support getting/setting some attributes with get/setAttribute |
|
|
if ( !getSetAttribute ) { |
|
|
|
|
|
// Use this for any attribute in IE6/7 |
|
|
// This fixes almost every IE6/7 issue |
|
|
nodeHook = jQuery.valHooks.button = { |
|
|
get: function( elem, name ) { |
|
|
var ret = elem.getAttributeNode( name ); |
|
|
return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ? |
|
|
ret.value : |
|
|
undefined; |
|
|
}, |
|
|
set: function( elem, value, name ) { |
|
|
// Set the existing or create a new attribute node |
|
|
var ret = elem.getAttributeNode( name ); |
|
|
if ( !ret ) { |
|
|
elem.setAttributeNode( |
|
|
(ret = elem.ownerDocument.createAttribute( name )) |
|
|
); |
|
|
} |
|
|
|
|
|
ret.value = value += ""; |
|
|
|
|
|
// Break association with cloned elements by also using setAttribute (#9646) |
|
|
return name === "value" || value === elem.getAttribute( name ) ? |
|
|
value : |
|
|
undefined; |
|
|
} |
|
|
}; |
|
|
|
|
|
// Set contenteditable to false on removals(#10429) |
|
|
// Setting to empty string throws an error as an invalid value |
|
|
jQuery.attrHooks.contenteditable = { |
|
|
get: nodeHook.get, |
|
|
set: function( elem, value, name ) { |
|
|
nodeHook.set( elem, value === "" ? false : value, name ); |
|
|
} |
|
|
}; |
|
|
|
|
|
// Set width and height to auto instead of 0 on empty string( Bug #8150 ) |
|
|
// This is for removals |
|
|
jQuery.each([ "width", "height" ], function( i, name ) { |
|
|
jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { |
|
|
set: function( elem, value ) { |
|
|
if ( value === "" ) { |
|
|
elem.setAttribute( name, "auto" ); |
|
|
return value; |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
// Some attributes require a special call on IE |
|
|
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx |
|
|
if ( !jQuery.support.hrefNormalized ) { |
|
|
jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { |
|
|
jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { |
|
|
get: function( elem ) { |
|
|
var ret = elem.getAttribute( name, 2 ); |
|
|
return ret == null ? undefined : ret; |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
// href/src property should get the full normalized URL (#10299/#12915) |
|
|
jQuery.each([ "href", "src" ], function( i, name ) { |
|
|
jQuery.propHooks[ name ] = { |
|
|
get: function( elem ) { |
|
|
return elem.getAttribute( name, 4 ); |
|
|
} |
|
|
}; |
|
|
}); |
|
|
} |
|
|
|
|
|
if ( !jQuery.support.style ) { |
|
|
jQuery.attrHooks.style = { |
|
|
get: function( elem ) { |
|
|
// Return undefined in the case of empty string |
|
|
// Note: IE uppercases css property names, but if we were to .toLowerCase() |
|
|
// .cssText, that would destroy case senstitivity in URL's, like in "background" |
|
|
return elem.style.cssText || undefined; |
|
|
}, |
|
|
set: function( elem, value ) { |
|
|
return ( elem.style.cssText = value + "" ); |
|
|
} |
|
|
}; |
|
|
} |
|
|
|
|
|
// Safari mis-reports the default selected property of an option |
|
|
// Accessing the parent's selectedIndex property fixes it |
|
|
if ( !jQuery.support.optSelected ) { |
|
|
jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { |
|
|
get: function( elem ) { |
|
|
var parent = elem.parentNode; |
|
|
|
|
|
if ( parent ) { |
|
|
parent.selectedIndex; |
|
|
|
|
|
// Make sure that it also works with optgroups, see #5701 |
|
|
if ( parent.parentNode ) { |
|
|
parent.parentNode.selectedIndex; |
|
|
} |
|
|
} |
|
|
return null; |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
// IE6/7 call enctype encoding |
|
|
if ( !jQuery.support.enctype ) { |
|
|
jQuery.propFix.enctype = "encoding"; |
|
|
} |
|
|
|
|
|
// Radios and checkboxes getter/setter |
|
|
if ( !jQuery.support.checkOn ) { |
|
|
jQuery.each([ "radio", "checkbox" ], function() { |
|
|