2010-02-08 2 views
41

Я знаю, что отдельные атрибуты могут быть получены с помощью метода attr(), но я пытаюсь выполнить итерацию по всех атрибутов элемента для элемента. Для контекста, я использую JQuery на некоторых XML ...Итерация над атрибутами элементов с помощью 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> 

Я уже в состоянии перебрать элементы с ...

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

Но я хотел бы быть в состоянии получить массив атрибутов для каждого «элемента», чтобы я мог затем перебирать их ...

eg

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

Я сделал некоторые поиски здесь, в документации JQuery, и в других местах с помощью Google, но не имели никакой удачи. Если ничего другого, у меня могут быть проблемы с исключением результатов, связанных с методом attr() объекта jQuery. Заранее спасибо.

+1

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

ответ

94

Лучший способ - использовать объект узла напрямую, используя его свойство attributes. Единственное различие в моем решении ниже по сравнению с другими предлагая этот метод является то, что я хотел бы использовать .each снова вместо традиционного Js цикла:

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

такой красивый код :) читает намного лучше, чем классический для –

+0

Спасибо, это сделал трюк! – theraccoonbear

+0

@prodigalson: Спасибо за этот подход к индексированному foreach! –

9

, кажется, вы должны использовать простую старую ванили 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

И нет ничего плохого в этом. attr() - метод удобства. –

0

Как о?

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

Не могли бы вы получить DOM элемент из обертки JQuery с помощью ГЭТ() функцию, а затем итерацию атрибуты DOM?

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

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

     } 
    } 
} 

Для некоторых гораздо более надежный DOM атрибут обработки, check this blog post.

0

В то время как вы можете просто использовать стандартный DOM Element атрибут attributes, он будет включать в себя каждый атрибут (даже те, что явно не заданы) в IE6. В качестве альтернативы, вы можете ограничить количество атрибутов вы установили:

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

Я отправляю здесь, потому что я думаю, что это может помочь другим, которые прибывают в этой публикации, глядя разобрать файл XML, как я.

Я искал способ перемещения файла xml с очень похожей структурой в флеш theracoonbear и хранения результатов в массиве и наткнулся на эту публикацию.

Я посмотрел на код prodigitalson, но я просто не мог получить этот синтаксис для работы - с светлячок жалуются, что в линейке:

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

что

это.атрибуты

не является определенной функцией. Я совершенно уверен, что ошибка полностью моя. Но я потратил несколько часов, пытаясь получить эту работу и не смог

То, что работало для меня было (там, где мое имя тега сеанса вместо пункта): -

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

Я понимаю, что это не может точно ответьте на оригинальный вопрос. Однако я надеюсь, что это может спасти других посетителей этой должности некоторое время.

С уважением

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); 
    }); 
} 
Смежные вопросы