mirror of
https://github.com/jquery/jquery.git
synced 2026-02-11 19:17:23 -05:00
2.0: Remove getSetAttribute and getSetInput and oldIE attroperties hooks
This commit is contained in:
committed by
Rick Waldron
parent
d50c18e61f
commit
3f66e928c8
@@ -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,26 +443,7 @@ 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;
|
||||
},
|
||||
@@ -483,96 +451,13 @@ boolHook = {
|
||||
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;
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Radios and checkboxes getter/setter
|
||||
if ( !jQuery.support.checkOn ) {
|
||||
jQuery.each([ "radio", "checkbox" ], function() {
|
||||
|
||||
Reference in New Issue
Block a user