Aqui está uma visão geral das muitas maneiras que podem ser feitas, para minha própria referência e também para a sua :) As funções retornam um hash de nomes de atributos e seus valores.
JS de baunilha :
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;
}
JS de baunilha com Array.reduce
Funciona para navegadores que suportam o ES 5.1 (2011). Requer o IE9 +, não funciona no 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
Esta função espera um objeto jQuery, não um elemento DOM.
function getAttributes ( $node ) {
var attrs = {};
$.each( $node[0].attributes, function ( index, attribute ) {
attrs[attribute.name] = attribute.value;
} );
return attrs;
}
Sublinhado
Também funciona para lodash.
function getAttributes ( node ) {
return _.reduce( node.attributes, function ( attrs, attribute ) {
attrs[attribute.name] = attribute.value;
return attrs;
}, {} );
}
lodash
É ainda mais conciso que a versão Underscore, mas funciona apenas para lodash, não para Underscore. Requer o IE9 +, é um bug no IE8. Parabéns ao @AlJey por esse .
function getAttributes ( node ) {
return _.transform( node.attributes, function ( attrs, attribute ) {
attrs[attribute.name] = attribute.value;
}, {} );
}
Página de teste
Na JS Bin, há uma página de teste ao vivo cobrindo todas essas funções. O teste inclui atributos booleanos ( hidden
) e atributos enumerados ( contenteditable=""
).
$().attr()