Aquí hay una descripción general de las muchas formas en que se puede hacer, para mi propia referencia y la tuya :) Las funciones devuelven un hash de nombres de atributos y sus valores.
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 con Array.reduce
Funciona para navegadores compatibles con ES 5.1 (2011). Requiere IE9 +, no funciona en 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 función espera un objeto jQuery, no un elemento DOM.
function getAttributes ( $node ) {
var attrs = {};
$.each( $node[0].attributes, function ( index, attribute ) {
attrs[attribute.name] = attribute.value;
} );
return attrs;
}
Guion bajo
También funciona para lodash.
function getAttributes ( node ) {
return _.reduce( node.attributes, function ( attrs, attribute ) {
attrs[attribute.name] = attribute.value;
return attrs;
}, {} );
}
lodash
Es aún más conciso que la versión Underscore, pero solo funciona para lodash, no para Underscore. Requiere IE9 +, tiene errores en IE8. Felicitaciones a @AlJey por eso .
function getAttributes ( node ) {
return _.transform( node.attributes, function ( attrs, attribute ) {
attrs[attribute.name] = attribute.value;
}, {} );
}
Página de prueba
En JS Bin, hay una página de prueba en vivo que cubre todas estas funciones. La prueba incluye atributos booleanos ( hidden
) y atributos enumerados ( contenteditable=""
).
$().attr()