Data Attributes in HTML 5

Posted on

Back in the days of HTML4/XHTML, the usage of the rel and the class attributes on the DOM were quite extensive for DOM selection and arbitary data storage on the browser.

For example, If an list item needs to indicate the user who had 7 notification messages, we sometimes used the class attributes to store the data for the user as mentioned below. This is how some practiced and others had different other ways.

<li class="item user_john message_notify_7"></li>

With the invent of HTML 5, the HTML and Javascript programming has become so flexible, easy and developer friendly and thanks to it, we can not store artibitary data using the data attributes that it provides.

Data Attributes

data-* attributes allow us to store extra information on standard, semantic HTML elements without polluting the class name.

The syntax for data attributes is quite easy. We can define data attributes for the above example as :

<li class="item" data-user="john" data-message-notify="7"></li>

Isn’t this cleaner that what we did previously. The specification for custom data attributes states that any attribute that starts with “data-” will be treated as a storage area for private data. This allows us to maintain cleaner HTML code and also store some extra information that doesn’t have any visual representation.

Javascript Accessor

Javascript allows us to access this information easily using the dataset property that returns a DOMStringMap.

Lets us look at a simple example that allows us to retrieve all the data attributes from the above example. I am going to add an id attributes so that it is easy to understand the initial example.

<li id='itemJohn' class="item" data-user="john" data-message-notify="7"></li>
var item = document.getElementById('itemJohn');
var custom_attributes = item.dataset;

//-> data-user="john"
//-> data-message-notify="7"

JQuery Accessor

JQuery provides the data() method that returns a String Map of all the data attributes set on a particular DOM object. Let us take an example of how to retrieve the custom attributes using JQuery.

var custom_attributes = $('#item').data();
//returns -> { user:john, message-notify:7}

The data() additionally take 2 optional parameters that helps in specific selection of the attributes and the store values.

Getting values

var user_notifications = $('#userJohn').data('message-notify');
//returns -> 7

Setting Values


The above example will update the data attributes message-notify from 7 to 10.

If a particular data attribute is not present when setting the value, a new one is automatically created and added to the dataset of the DOM Element.

Searching DOM using data attributes.

The JQuery selectors helps us to search a list of custom data attributes using the keys of data attributes. Let us for example say we have a list of LI with various data attributes as shown below.

    <li data-user="john" data-friends="4" data-admin="YES"></li>
    <li data-user="doe" data-friends="5" data-admin="NO"></li>
    <li data-user="jessy" data-friends="6" data-admin="YES"></li>
    <li data-user="michael" data-friends="7" data-admin="NO"></li>
    <li data-user="jane" data-friends="1" data-admin="YES"></li>
    <li data-user="george" data-friends="14" data-admin="NO"></li>

The jquery selector can be used to get all the objects that use the custom data attribute data-user. To do this, we use:

var users = $('[data-user]');

This will return a list of li objects that have the custom attribute data-user. You can now access all the users by looping through the users variable.

    var isAdmin = $(item).data('admin');
    var friends_count = $(item).data('friends');

If you wanted a list of all the users who are admin, then:

var admin_users = $('[data-admin="YES"]');

This will return the li objects with data-user belonging to JOHN|JESSY|JANE

You can create a helper method to search dynamically

function fetchByAdminType($type){
    return $('[data-admin="' + $type + '")]');

var admin_users = fetchByAdminType('YES');
var non_admin_users = fetchByAdminType('NO');

CSS Accessor

Since data attributes are plain HTML attributes, you can access them using CSS as well. Let us for example want to have a specific font coloring for all the users who belong to Admin type, we can do it using:

li[data-admin="YES"] {
  color: '#bbb';
  background: '#555';
  font-weight: 'bold';

Christian Heilmann shows more ways on how to use data attributes in this screencast.

The datalist API is supported by all modern browsers but not IE10 and below. A shim is available but it’s possibly more practical to use jQuery if you’re coding for the older browsers.

Leave a Reply

Your email address will not be published. Required fields are marked *