getAttribute() versus Element object properties?
According to this jsPerf test getAttribute
is more slow than id
property.
PS
Oddly enough both statements perform very bad on IE8 (compared to other browsers).
getAttribute('attribute')
normally returns the attribute value as a string, exactly as defined in the HTML source of the page.
However, element.attribute
could return a normalized or calculated value of the attribute. Examples:
<a href="/foo"></a>
- a.href will contain full URL
<input type="checkbox" checked>
- input.checked will be true (boolean)
<input type="checkbox" checked="bleh">
- input.checked will be true (boolean)
<img src='http://dummyimage.com/64x64/000/fff'>
- img.width will be 0 (number) before the image is loaded
- img.width will be 64 (number) when image (or first few bytes of it) is loaded
<img src='http://dummyimage.com/64x64/000/fff' width="50%">
- img.width will be the calculated 50%
<img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
- img.width will be 50 (number)
<div style='background: lime;'></div>
- div.style will be an object
getAttribute
retrieves the attribute of a DOM element, while el.id
retrieves the property of this DOM element. They are not the same.
Most of the time, DOM properties are synchronized with attributes.
However, the synchronization does not guarantee the same value. A classic example is between el.href
and el.getAttribute('href')
for an anchor element.
For example:
<a href="/" id="hey"></a>
<script>
var a = document.getElementById('hey')
a.getAttribute('href') // "/"
a.href // Full URL except for IE that keeps '/'
</script>
This behavior happens because according to the W3C, the href property must be a well-formed link. Most browsers respect this standard (guess who doesn't?).
There is another case for the input
's checked
property. The DOM property returns true
or false
while the attribute returns the string "checked"
or an empty string.
And then, there are some properties that are synchronized one-way only. The best example is the value
property of an input
element. Changing its value through the DOM property will not change the attribute (edit: check the first comment for more precision).
Because of these reasons, I'd suggest you keep using the DOM properties, and not the attributes, as their behavior differs between the browsers.
In reality, there are only two cases where you need to use the attributes:
- A custom HTML attribute, because it is not synced to a DOM property.
- To access a built-in HTML attribute, which is not synced from the property, and you are sure you need the attribute (for example, the original
value
of aninput
element).
If you want a more detailed explaination, I strongly suggest you read this page. It will take you a few minutes only, but you will be delighted by the information (which I summed up here).