Get Element Attributes with JavaScript

By  on  

What I love so much about JavaScript is that the language is incredibly dynamic.  So dynamic that you can modify native objects if you so choose.  One dynamic property I've frequently been using lately is the attributes property of DOM elements.  This attributes property provides me the names and values of every attribute on a given element!

The HTML

Let's assume we're working with the following element:

<div class="myClass" id="myId" title="Some text title">Some text</div>

A simple DIV with a few frequently used attributes.  We can use getAttribute() to get attributes when we know they're there, but how do we simply get an object containing all attributes?

The JavaScript

DOM elements have an attributes property which contains all attribute names and values:

var attrs = document.getElementById("myId").attributes;

// returns NamedNodeMap {0: class, 1: id, 2: title, ...}

Using Array.prototype.slice.call, which is also helpful in converting NodeLists to Arrays, you can convert the result to a true array which you can iterate over:

Array.prototype.slice.call(document.getElementById("myId").attributes).forEach(function(item) {
	console.log(item.name + ': '+ item.value);
});

// class: myClass
// id: myId
// title: Some text title

The attributes property of an element is incredibly handy when you're looking to see what attributes are present without explicitly knowing which to look for; the attributes property provides an awesome level of dynamism.

Until I found the need to grab every attribute from an element, I wasn't aware that such a list existed.  Now that I'm aware of the this property, however, I'm trying to think up ways to abuse the information provided to empower elements even more.  If you've ever found a useful use of the attributes property, please share it!

Recent Features

  • By
    Camera and Video Control with HTML5

    Client-side APIs on mobile and desktop devices are quickly providing the same APIs.  Of course our mobile devices got access to some of these APIs first, but those APIs are slowly making their way to the desktop.  One of those APIs is the getUserMedia API...

  • By
    LightFace:  Facebook Lightbox for MooTools

    One of the web components I've always loved has been Facebook's modal dialog.  This "lightbox" isn't like others:  no dark overlay, no obnoxious animating to size, and it doesn't try to do "too much."  With Facebook's dialog in mind, I've created LightFace:  a Facebook lightbox...

Incredible Demos

  • By
    dat.gui:  Exceptional JavaScript Interface Controller

    We all love trusted JavaScript frameworks like MooTools, jQuery, and Dojo, but there's a big push toward using focused micro-frameworks for smaller purposes. Of course, there are positives and negatives to using them.  Positives include smaller JS footprint (especially good for mobile) and less cruft, negatives...

  • By
    MooTools Wall Plugin

    One of the more impressive MooTools plugins to hit the Forge recently was The Wall by Marco Dell'Anna.  The Wall creates an endless grid of elements which can be grabbed and dragged, fading in elements as they are encountered.  Let me show...

Discussion

  1. One useful way to use attributes is for « cloning » (esp. data-*).

  2. MaxArt

    As far as HTML elements are concerned, I used the attributes property just to create a polyfill for the dataset property in browsers supporting Object.defineProperty.

    I used it also in XML documents when I want to make a special conversion of a node into a Javascript object:

    var attrs = elem.attributes, obj = {}, i = 0;
    for (; i < attrs.length; i++) {
        obj[attrs[i].name] = attrs[i].value;
    }
    

    By the way, David: it's item.value, not item.property.

  3. I was right now working on a reflection way of mapping properties and css properties even in-line.

    For those who are using ZeptoJS or JQuery Here is a plugin.

    (function($) {
        $.fn.getAttributes = function() {
            var attributes = {}; 
    
            if( this.length ) {
                $.each( this[0].attributes, function( index, attr ) {
                    attributes[ attr.name ] = attr.value;
                } ); 
            }
            return attributes;
        };
    })();
    
  4. Arthur

    Recently I’m working on a way of grab all attributes to make changes in function of media query. Some behaviors need to be disabled and and that way it’s only done by js

  5. A more efficient way to get all element attributes is to use getAttributeNames() with getAttribute();

    const elementAttributes = (elem) =>
      elem.getAttributeNames().reduce((attrMap, name) => {
        attrMap[name] = elem.getAttribute(name);
        return attrMap;
      }, {});
    

    And a heads up that attributes is not supported in older versions of IE and new versions return a object map instead of index. It also doesn’t support getAttributeNames.

    sources:
    * https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNames
    * https://developer.mozilla.org/en-US/docs/Web/API/Element/attributes

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!