I have learned that HTML5 includes a means to set custom attributes on elements using the data- prefix. However I'm a bit scewered in terms of how to read the properties during a javascript code block. I guess it is my interpretation of how the DOMStringMap is working thats off.
Could someone simplify how to read the properties of the following sample html.
<span data-plex-key="howtoRead" data-id="anId">inner</span>
Trying following doesnt really work as expected
spanEl.dataset['id'] // straight-forward and result is anId
spanEl.dataset['plex-key'] // undefined
spanEl.dataset['plex']['key'] // throws 'cannot read property of undefined'
spanEl.getAttribute('plex-key') // there's a null however,
spanEl.getAttribute('data-plex-key') // this variant seems to work
Another thing that makes me wonder is, the CSS selectors seems to follow the excact same pattern as to which is i written in the DOM, so why is this not the case with reading from javascript.
For instance, this would match
span[data-plex-key="howtoRead"] { color:green }
Appreciate the help, still getting more and more intreaged with the HTML5 Canvas, Video and local Data Storage :)
I have learned that HTML5 includes a means to set custom attributes on elements using the data- prefix. However I'm a bit scewered in terms of how to read the properties during a javascript code block. I guess it is my interpretation of how the DOMStringMap is working thats off.
Could someone simplify how to read the properties of the following sample html.
<span data-plex-key="howtoRead" data-id="anId">inner</span>
Trying following doesnt really work as expected
spanEl.dataset['id'] // straight-forward and result is anId
spanEl.dataset['plex-key'] // undefined
spanEl.dataset['plex']['key'] // throws 'cannot read property of undefined'
spanEl.getAttribute('plex-key') // there's a null however,
spanEl.getAttribute('data-plex-key') // this variant seems to work
Another thing that makes me wonder is, the CSS selectors seems to follow the excact same pattern as to which is i written in the DOM, so why is this not the case with reading from javascript.
For instance, this would match
span[data-plex-key="howtoRead"] { color:green }
Appreciate the help, still getting more and more intreaged with the HTML5 Canvas, Video and local Data Storage :)
Share Improve this question edited Jan 23, 2015 at 14:24 juan.facorro 9,9302 gold badges35 silver badges41 bronze badges asked Sep 26, 2012 at 16:34 mschrmschr 8,6413 gold badges23 silver badges35 bronze badges 1- You shouldn't use dashes in the attribute keys BTW, better opt for camelCased plexKey here. – m90 Commented Sep 26, 2012 at 16:48
4 Answers
Reset to default 11In vanilla-JS, assuming spanEl
is a reference to the DOM node
spanEl.dataset.plexKey
will work using the camelCase
notation (see http://jsbin./oduguw/3/edit) when your data attribute contains hypens (-
) and also
spanEl.getAttribute('data-plex-key')
will work fine as you already noticed. As a side note, in jQuery you can access to that data
attribute with
$(spanEl).data("plex-key")
In Chrome, it seems to map the data keys in a not-so-straightforward way:
console.log(spanEl.dataset);
//shows:
//DOMStringMap
// plexKey: "howtoRead"
// id: "anId"
It converts "plex-key" to "plexKey".
While not being pletely straightforward, this behavior is defined in the HTML5 spec here:
http://dev.w3/html5/spec//global-attributes.html#dom-dataset
Your first and last method are correct while not using any libraries. However a key with a minus sign is converted to Camel Case, so plex-key bees plexKey:
spanEl.dataset['id']
spanEl.dataset['plexKey']
spanEl.getAttribute('data-plex-key')
However, only the last one works in IE up to 9. (I don't know about 10.) The data attributes are nothing else than normal attributes having a naming convention in this case.
spanEl.dataSet["plexKey"]
//Using jQuery you can try this
$('span').data('plex-key') // Will give you **howtoRead**
$('span').data('id') // Will give you **anId**