Próbuję przejść przez element i uzyskać wszystkie atrybuty tego elementu, aby je wyprowadzić, na przykład tag może mieć 3 lub więcej atrybutów, nieznanych mi i muszę uzyskać nazwy i wartości tych atrybutów. Myślałem o czymś w rodzaju:
$(this).attr().each(function(index, element) {
var name = $(this).name;
var value = $(this).value;
//Do something with name and value...
});
Czy ktoś mógłby mi powiedzieć, czy jest to w ogóle możliwe, a jeśli tak, jaka byłaby poprawna składnia?
javascript
jquery
attributes
Styphon
źródło
źródło
$().attr()
attributes
Kolekcja zawiera wszystkie możliwe atrybuty w starszym IE, nie tylko te, które zostały określone w HTML. Możesz obejść ten problem, filtrując listę atrybutów za pomocą każdejspecified
właściwości atrybutów ..attr()
metody jQuery . To dziwne, że jQuery go nie zawiera.this[0].attributes
?attributes
nie jest jednak tablicą ... w Chrome przynajmniej jest to obiektNamedNodeMap
, który jest obiektem.Oto przegląd wielu sposobów, które można zrobić, zarówno dla siebie, jak i dla Ciebie :) Funkcje zwracają skrót nazw atrybutów i ich wartości.
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 z Array.reduce
Działa dla przeglądarek obsługujących ES 5.1 (2011). Wymaga IE9 +, nie działa w 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
Ta funkcja oczekuje obiektu jQuery, a nie elementu DOM.
function getAttributes ( $node ) { var attrs = {}; $.each( $node[0].attributes, function ( index, attribute ) { attrs[attribute.name] = attribute.value; } ); return attrs; }
Podkreślać
Działa również na lodash.
function getAttributes ( node ) { return _.reduce( node.attributes, function ( attrs, attribute ) { attrs[attribute.name] = attribute.value; return attrs; }, {} ); }
lodash
Jest jeszcze bardziej zwięzły niż wersja Underscore, ale działa tylko dla lodash, a nie dla Underscore. Wymaga IE9 +, zawiera błędy w IE8. Uznanie dla @AlJey za to .
function getAttributes ( node ) { return _.transform( node.attributes, function ( attrs, attribute ) { attrs[attribute.name] = attribute.value; }, {} ); }
Strona testowa
W JS Bin istnieje strona testowa na żywo obejmująca wszystkie te funkcje. Test zawiera atrybuty boolowskie (
hidden
) i atrybuty wyliczeniowe (contenteditable=""
).źródło
z LoDash możesz po prostu zrobić to:
_.transform(this.attributes, function (result, item) { item.specified && (result[item.name] = item.value); }, {});
źródło
Skrypt debugujący (rozwiązanie jQuery oparte na odpowiedzi powyżej przez 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
źródło
Korzystając z funkcji javascript, łatwiej jest uzyskać wszystkie atrybuty elementu w NamedArrayFormat.
$("#myTestDiv").click(function(){ var attrs = document.getElementById("myTestDiv").attributes; $.each(attrs,function(i,elem){ $("#attrs").html( $("#attrs").html()+"<br><b>"+elem.name+"</b>:<i>"+elem.value+"</i>"); }); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <div id="myTestDiv" ekind="div" etype="text" name="stack"> click This </div> <div id="attrs">Attributes are <div>
źródło
Proste rozwiązanie autorstwa Underscore.js
Na przykład: Pobierz cały tekst linków, których rodzice mają zajęcia
someClass
_.pluck($('.someClass').find('a'), 'text');
Skrzypce robocze
źródło
Moja sugestia:
$.fn.attrs = function (fnc) { var obj = {}; $.each(this[0].attributes, function() { if(this.name == 'value') return; // Avoid someone (optional) if(this.specified) obj[this.name] = this.value; }); return obj; }
var a = $ (el) .attrs ();
źródło
Oto jedna linijka dla Ciebie.
Użytkownicy JQuery:
Zastąp
$jQueryObject
swoim obiektem jQuery. tj$('div')
.Object.values($jQueryObject.get(0).attributes).map(attr => console.log(`${attr.name + ' : ' + attr.value}`));
Użytkownicy Vanilla Javascript:
Zastąp
$domElement
selektorem HTML DOM. tjdocument.getElementById('demo')
.Object.values($domElement.attributes).map(attr => console.log(`${attr.name + ' : ' + attr.value}`));
Twoje zdrowie!!
źródło