issue is whether to use property or attribute.
have not found this documented, so have run some tests (chromium 12):
property <=> attribute
accept, alt, formMethod, formTarget, id, name, placeholder, type, maxlength, size form: method, name, target, action, enctype
property <= attribute
value, autofocus, checked, disabled, formNoValidate, multiple, required
property => attribute
indeterminate
propetry >< attribute
defaultValue, validity, defaultChecked, readOnly form: novalidate
given a random attribute/value to apply to an element, here are the best rules I have come up with (modified as per Tim Down (thanks!) below):
if class, write with classList
, read with className
property
if a form, always read using attribute (and be a little careful)
if typeof element[propName] != "undefined"
, use property, ie, element[attr]=val
otherwise, use attribute, ie, element.setAttribute(attr,val)
is this even close to being right?
note: interestingly, if you have a form with an element named "novalidate", is it even possible to access the novalidate
property of the form itself?
The attributes have a data type of string. So no matter the value of the attribute, it will always return a string. Property: In contrast to the attributes, which are defined in HTML, properties belong to the DOM. Since DOM is an object in JavaScript, we can get and set properties.
The HTML attribute value specifies the initial value; the DOM value property is the current value.
The attributes property in HTML DOM returns the group of node attributes specified by NamedNodeMap objects. The NamedNodeMap object represents the collection of attribute objects and can be accessed by index number.
Except for rare special cases listed below, always use the property. Once the browser has parsed the intial HTML, attributes are no help to you unless you're serializing the DOM back to HTML for some reason.
Reasons to always favour properties:
checked
: just use true
and false
and never worry whether you should be removing the attribute, or setting it to ""
or "checked"
)checked
property of a checkbox or radio button does not correspond to any attribute; the checked
attribute corresponds to the defaultChecked
property and does not change when the user interacts with the element (except in old IE; see next point). Likewise value
and defaultValue
.setAttribute()
and getAttribute()
are broken in older versions of IE.Special cases:
<form>
elements. Since each form input is mapped to a property of its parent <form>
element corresponding to its name
, it's safer to use setAttribute()
and getAttribute()
to obtain properties of the form such as action
, name
and method
.<p myspecialinfo="cabbage">
. These will not generally create equivalent properties on the DOM element object, so setAttribute()
and getAttribute()
should be used.One final consideration is that there is not an exact correspondence between attribute and property names. For example, the property equivalent of the class
attribute is className
, and the property for the for
attribute is htmlFor
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With