Iterando sobre los atributos del elemento con jQuery

Sé que los atributos individuales se pueden recuperar con el método attr() , pero estoy tratando de iterar sobre todos los atributos de un elemento. Por contexto, estoy usando jQuery en algunos XML …

           

Ya puedo iterar sobre los elementos con …

 $(xml).find('item').each(function() { // Do something to each item here... }); 

Pero me gustaría poder obtener una variedad de atributos para cada ‘artículo’, así puedo iterar sobre esos …

p.ej

 $(xml).find('item').each(function() { var attributes = $(this).attributes(); // returns an array of attributes? for (attribute in attributes) { // Do something with each attribute... } }); 

He hecho algunas búsquedas aquí, en la documentación de jQuery, y en otros lugares a través de Google, pero no he tenido suerte. Si nada más, es posible que tenga problemas para excluir los resultados relacionados con el método attr() del objeto jQuery. Gracias por adelantado.

La mejor manera es usar el objeto nodo directamente usando su propiedad de attributes . La única diferencia en mi solución a continuación en comparación con otros que sugieren este método es que usaría .each nuevamente en lugar de un bucle js tradicional:

 $(xml).find('item').each(function() { $.each(this.attributes, function(i, attrib){ var name = attrib.name; var value = attrib.value; // do your magic :-) }); }); 

parece que tienes que usar javascript simple y antiguo de vainilla:

 for (var i = 0; i < elem.attributes.length; i++) { var attrib = elem.attributes[i]; if (attrib.specified == true) { console.log(attrib.name + " = " + attrib.value); } } 

¿Cómo iterar a través de todos los atributos en un elemento HTML?

¿Podría obtener el elemento DOM del contenedor jQuery utilizando la función get () y luego iterar los atributos DOM?

 var node = $(myStuff).get(0); if (node.attributes.length) { for (var length = attrs.length, i = 0; i < length; i++) { if (attrs[i].specified) { } } } 

Para un manejo mucho más robusto de los atributos DOM, consulte esta publicación en el blog .

¿Qué tal si?

 $(xml).find('item').each(function() { var attributes = $(this)[0].attributes; for (attribute in attributes) { // Do something with each attribute... } }); 

Si bien puede usar los atributos de attributes elemento DOM estándar, incluirá todos los atributos (incluso aquellos no configurados explícitamente) en IE6. Como alternativa, puede limitar el número de atributos que establece:

 var use_attributes = ['id','name','value','type']; $(xml).find('item').each(function() { var $item = $(this); $.each( use_attributes, function(){ if($item.attr( this )){ // Act on the attribute here. // `this` = attribute name // $item.attr( this ) = attribute value } }) }); 

Estoy publicando aquí porque creo que puede ayudar a otros que lleguen a esta publicación buscando analizar un archivo xml como yo.

Estaba buscando un método para atravesar un archivo xml con una estructura muy similar al de thecocoonbear y almacenar los resultados en una matriz y encontré esta publicación.

Miré el código de prodigitalson pero simplemente no pude hacer funcionar esta syntax, con Firefox quejándose de eso en la línea:

  $.each(this.attributes, function(i, attrib){ 

ese

esto.atribuye

no es una función definida. Estoy bastante seguro de que el error es completamente mío . Pero he pasado varias horas intentando que esto funcione y he fallado

Lo que funcionó para mí fue (donde mi nombre de etiqueta es sesión en lugar de artículo):

 $(xml_Data).find("session").each(function() { console.log("found session"); $(this).children().each(function(){ console.log("found child " + this.tagName); console.log("attributes" + $(this).text()); }); }); 

Aprecio que esto no responda exactamente la pregunta original. Sin embargo, espero que pueda salvar a otros visitantes de esta publicación en algún momento.

Saludos

 function findByAll(toLookFor, lookInText) { return $('*').filter(function() { return Array.prototype.some.call(this.attributes, function(attr) { return attr.value.indexOf(toLookFor) >= 0; }) || (lookInText && $(this).text().indexOf(toLookFor) >= 0); }); }