2012-03-22 6 views
0

мне было интересно, если есть способ, чтобы получить HashMap атрибутов с JQuery, что-то выглядит следующим образом:jQuery: существует ли общий способ получения карты атрибутов элементов?

HTML:

<img id="site-logo" src="logo.jgp" alt="The Logo" class="ui-logo"> 

JAVASCRIPT:

// Something along these lines 
$('#site-logo').getAttr(); 

РЕЗУЛЬТАТ:

{ 
    id: 'site-logo', 
    src: 'logo.jpg', 
    alt: 'The Logo', 
    class: 'ui-logo' 
} 

Меня не интересуют никакие плагины, просто wo Если jQuery ребята думают об этом, я искал в google и пробовал метод .attr() без каких-либо параметров, но он выдает ошибку.

ответ

3

jQuery не имеет одного, но DOM эффективно делает: attributes, что является NamedNodeMap. Trivial принять это и создать JS объект:

var attrs = {}; 
$.each($("selector")[0].attributes, function(index, node) { 
    attrs[node.nodeName] = node.nodeValue; 
}); 

Live example | Source

Так что, если это то, что вы хотите регулярно, вы можете сделать себе плагин:

// Attributes map plugin 
(function($) { 
    /** 
    * attrMap builds a map of the attributes of the first matched 
    * element in the set. 
    * 
    * @returns the object, or undefined if there are no elements in 
    *   the set 
    */ 
    $.fn.attrMap = attrMap; 
    function attrMap() { 
    var attrs; 
    if (this[0]) { 
     attrs = {}; 
     $.each(this[0].attributes, function(index, node) { 
      attrs[node.nodeName] = node.nodeValue; 
     }); 
    } 
    return attrs; 
    } 
})(jQuery); 

Использование:

var attrs = $("selector").attrMap(); 

Live example | Source

+0

Я пробовал этот, ключи - цифры [1,2,3,4]. –

+0

@StevendeSalas: Да, но он предоставляет именованные аксессоры (например, 'getNamedItem'). Поэтому 'map.getNamedItem (" foo ")' сродни 'obj.foo', хотя и не (конечно) как приятный. Однако тривиально сделать из него простой объект JS. –

+0

Я думаю, что мы можем что-то здесь, удивленный тем, что jQuery не реализует это, хотя .. –

2

Нет, нет встроенного встроенного решения jQuery для создания хэш-карты из атрибутов узла.

Вы можете легко создать маленький метод, который будет делать эту работу, как упоминалось @TJCrowder, используйте .attributes значение, например:

var hashMap = { }; 

Array.prototype.forEach.call(document.getElementById('site-logo').attributes, function(elem) { 
    hashMap[ elem.nodeName ] = elem.nodeValue; 
}); 

console.dir(hashMap); 

Приведенный выше код требует браузер с поддержкой ES5 или подкладку Javascript ES5

+0

Thats a bummer hey? :) –

+0

http://meta.stackexchange.com/questions/118021/javascript-answers-using-es5-features-warn-or-not –

+1

@TJCrowder: Я так регулярно использую эти методы, я не даже думать о других dev's не использовать somekind из прокладки. Спасибо за хэдс-ап, снова. – jAndy