Get all attributes of an element using jQuery Get all attributes of an element using jQuery javascript javascript

Get all attributes of an element using jQuery


The attributes property contains them all:

$(this).each(function() {  $.each(this.attributes, function() {    // this.attributes is not a plain object, but an array    // of attribute nodes, which contain both the name and value    if(this.specified) {      console.log(this.name, this.value);    }  });});

What you can also do is extending .attr so that you can call it like .attr() to get a plain object of all attributes:

(function(old) {  $.fn.attr = function() {    if(arguments.length === 0) {      if(this.length === 0) {        return null;      }      var obj = {};      $.each(this[0].attributes, function() {        if(this.specified) {          obj[this.name] = this.value;        }      });      return obj;    }    return old.apply(this, arguments);  };})($.fn.attr);

Usage:

var $div = $("<div data-a='1' id='b'>");$div.attr();  // { "data-a": "1", "id": "b" }


Here is an overview of the many ways that can be done, for my own reference as well as yours :) The functions return a hash of attribute names and their values.

Vanilla JS:

function getAttributes ( node ) {    var i,        attributeNodes = node.attributes,        length = attributeNodes.length,        attrs = {};    for ( i = 0; i < length; i++ ) attrs[attributeNodes[i].name] = attributeNodes[i].value;    return attrs;}

Vanilla JS with Array.reduce

Works for browsers supporting ES 5.1 (2011). Requires IE9+, does not work in IE8.

function getAttributes ( node ) {    var attributeNodeArray = Array.prototype.slice.call( node.attributes );    return attributeNodeArray.reduce( function ( attrs, attribute ) {        attrs[attribute.name] = attribute.value;        return attrs;    }, {} );}

jQuery

This function expects a jQuery object, not a DOM element.

function getAttributes ( $node ) {    var attrs = {};    $.each( $node[0].attributes, function ( index, attribute ) {        attrs[attribute.name] = attribute.value;    } );    return attrs;}

Underscore

Also works for lodash.

function getAttributes ( node ) {    return _.reduce( node.attributes, function ( attrs, attribute ) {        attrs[attribute.name] = attribute.value;        return attrs;    }, {} );}

lodash

Is even more concise than the Underscore version, but only works for lodash, not for Underscore. Requires IE9+, is buggy in IE8. Kudos to @AlJey for that one.

function getAttributes ( node ) {    return _.transform( node.attributes, function ( attrs, attribute ) {        attrs[attribute.name] = attribute.value;    }, {} );}

Test page

At JS Bin, there is a live test page covering all these functions. The test includes boolean attributes (hidden) and enumerated attributes (contenteditable="").


A debugging script (jquery solution based on the answer above by hashchange)

function getAttributes ( $node ) {      $.each( $node[0].attributes, function ( index, attribute ) {      console.log(attribute.name+':'+attribute.value);   } );}getAttributes($(this));  // find out what attributes are available