9

I have just noticed, that if I give a custom attribute to an html element, for example:

<input type="button" id="my_button" custom_attr="custom_attr_text" value="value_text" />

then i can retrieve it like this:

document.getElementById("my_button").getAttribute("custom_attr");

and it will return "custom_attr_text", but if I do

document.getElementById("my_button").custom_attr;

then it returns undefined!

I also noticed that with a built in attribute (for example value or id) both of the above works fine! Could somebody please explain why is this happening?

2
  • It's a littlebit jQuery-specific, but see the duplicate of .prop() vs .attr(). If you want a only-plain-js explanation, see javascript.info/tutorial/attributes-and-custom-properties Commented Feb 21, 2013 at 19:53
  • This also applies to existing attributes added to elements whose prototype doesn’t provide a property mapping to the attribute, e.g. <button src="xyz.jpg"></button>: button.src will be undefined. Commented Jul 31, 2018 at 16:10

1 Answer 1

19

Only certain standard attributes are directly mapped to properties. This is not the defined behavior for non-standard (custom) attributes.

The forward compatible way of using custom attributes is to prefix them with data-.

<input ... data-custom_attr="custom_attr_text" ... />

Then they become available in HTML5 compliant browsers as:

element.dataset.custom_attr

But in legacy browsers, you'll still need to use .getAttribute().

Sign up to request clarification or add additional context in comments.

2 Comments

element.data? Are you sure you didn't mean dataset?
@Bergi: Thanks, that's what I meant. Fixed.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.