2010-02-08 29 views
41

Wiem, że poszczególne atrybuty można pobrać przy użyciu metody attr(), ale próbuję iterować po wszystkich atrybutów dla elementu. Dla kontekście używam jQuery na jakiś XML ...Powtarzanie atrybutów elementów za pomocą jQuery

<items> 
    <item id="id123" name="Fizz" value="Buzz" type="xyz"> 
    <subitem name="foo"> 
    <subitem name="bar"> 
    </item> 
    <item id="id456" name="Bizz" value="Bazz" type="abc"> 
    <subitem name="meh"> 
    <subitem name="hem"> 
    </item> 
</items> 

jestem już w stanie iteracyjne nad elementów z ...

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

Ale chciałbym, aby móc uzyskaj tablicę atrybutów dla każdego "elementu", dzięki czemu mogę następnie powtórzyć te ...

np.

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

Zrobiłem trochę wyszukiwania tutaj, w dokumentacji jQuery i gdzie indziej za pośrednictwem Google, ale nie miałem szczęścia. Jeśli nic więcej, mogę po prostu mieć problemy z wykluczeniem wyników dotyczących metody obiektu jQuery w metodzie attr(). Z góry dziękuję.

+1

Zobacz http://stackoverflow.com/questions/1705504/javascript-jquery-how-do-i-get-an-array-of-all-attributes-in-an- xml-element –

Odpowiedz

94

Najlepszym sposobem jest użycie obiektu węzła bezpośrednio przy użyciu jego właściwości attributes. Jedyna różnica w moim roztworu poniżej w porównaniu do innych sugerujących tej metody jest to, że użyłby .each znowu zamiast tradycyjnego js pętli:

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

taki piękny kod :) czyta się znacznie lepiej niż klasycznie dla –

+0

Dzięki, to się udało! – theraccoonbear

+0

@prodigalson: Dzięki za to podejście do indeksowanego foreach! –

9

wydaje trzeba używać zwykłego starego waniliowy javascript:

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

How to iterate through all attributes in an HTML element?

+0

I nie ma w tym nic złego. attr() jest wygodną metodą. –

0

jaki temat?

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

Czy można uzyskać element DOM z opakowania jQuery za pomocą funkcji get(), a następnie iterować atrybuty modelu DOM?

var node = $(myStuff).get(0); 
if (node.attributes.length) { 

    for (var length = attrs.length, i = 0; i < length; i++) { 
     if (attrs[i].specified) { 

     } 
    } 
} 

Dla pewniejszej obsługi atrybutów DOM, check this blog post.

0

Choć może po prostu użyć średnia DOM Element atrybutu attributes, będzie on zawierał każdy atrybut (nawet nieokreślony jawnie) w IE6. Jako alternatywę, można ograniczyć liczbę atrybutów Set:

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 
    } 
    }) 
}); 
0

jestem delegowania tutaj, bo myślę, że to może pomóc innym, że przybywają w tym delegowania poszukuje do analizowania pliku xml jak ja.

Szukałem metody przechodzenia pliku xml o strukturze bardzo podobnej do flesza theracoonbear i przechowywania wyników w tablicy i natknąłem się na tę wiadomość.

Spojrzałem na kodzie prodigitalson, ale ja po prostu nie mógł dostać to składnia do pracy - z Firefoksa skarżą się, że w linii:

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

że

to.atrybuty

nie jest zdefiniowaną funkcją. Jestem całkiem pewien, że błąd jest całkowicie mój. Ale spędziłem kilka godzin próbuje uzyskać tej pracy i nie udało

Co pracował dla mnie (gdzie my name tag jest sesja zamiast elementu): -

$(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()); 
    }); 
}); 

Rozumiem, że to może nie dokładnie odpowiedzieć na oryginalne pytanie. Mam jednak nadzieję, że może to zaoszczędzić innym użytkownikom tego postu.

Pozdrowienia

0
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); 
    }); 
} 
Powiązane problemy