使用Javascript/jQuery从HTML元素中获取所有属性

k0n*_*0ni 160 javascript jquery parsing attributes

我想将一个Html元素中的所有属性放入一个数组:就像我有一个jQuery对象,其中html如下所示:

<span name="test" message="test2"></span>
Run Code Online (Sandbox Code Playgroud)

现在一种方法是使用这里描述的xml解析器,但后来我需要知道如何获取我的对象的html代码.

另一种方法是使用jquery,但如何?属性的数量和名称是通用的.

谢谢

顺便说一句:我无法使用document.getelementbyid或类似的东西访问该元素.

Rol*_*man 208

如果您只想要DOM属性,那么attributes在元素本身上使用节点列表可能更简单:

var el = document.getElementById("someId");
for (var i = 0, atts = el.attributes, n = atts.length, arr = []; i < n; i++){
    arr.push(atts[i].nodeName);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这仅使用属性名称填充数组.如果需要属性值,可以使用nodeValue属性:

var nodes=[], values=[];
for (var att, i = 0, atts = el.attributes, n = atts.length; i < n; i++){
    att = atts[i];
    nodes.push(att.nodeName);
    values.push(att.nodeValue);
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以通过`get`方法从jQuery对象中获取DOM对象......例如:`var obj = $('#example').get(0);` (45认同)
  • 警告:在IE中,这不仅指定,而且所有**可能**属性 (11认同)
  • 你可以使用`getElementById` - `var el = document.getElementById($(myObj).attr("id"));` (4认同)
  • @ k0ni - 你可以使用例如var atts = $(myObject)[0] .attributes; ? (3认同)

man*_*nRo 69

你可以使用这个简单的插件作为$('#some_id').getAttributes();

(function($) {
    $.fn.getAttributes = function() {
        var attributes = {}; 

        if( this.length ) {
            $.each( this[0].attributes, function( index, attr ) {
                attributes[ attr.name ] = attr.value;
            } ); 
        }

        return attributes;
    };
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:这只会公开选择器的第一个元素. (4认同)

Aki*_*43S 56

简单:

var element = $("span[name='test']");
$(element[0].attributes).each(function() {
console.log(this.nodeName+':'+this.nodeValue);});
Run Code Online (Sandbox Code Playgroud)

  • 谷歌Chrome表示,不推荐使用`Attr.nodeValue`来支持`value`.所以这可能是`this.name +':'+ this.value`.[Attr接口](http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-637646024) (6认同)

DUz*_*zun 20

因为在IE7中elem.attributes列出了所有可能的属性,而不仅仅是当前属性,我们必须测试属性值.此插件适用于所有主流浏览器:

(function($) {
    $.fn.getAttributes = function () {
        var elem = this, 
            attr = {};

        if(elem && elem.length) $.each(elem.get(0).attributes, function(v,n) { 
            n = n.nodeName||n.name;
            v = elem.attr(n); // relay on $.fn.attr, it makes some filtering and checks
            if(v != undefined && v !== false) attr[n] = v
        })

        return attr
    }
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

用法:

var attribs = $('#some_id').getAttributes();
Run Code Online (Sandbox Code Playgroud)

  • 不适用于动态添加的属性: - / (2认同)

Edu*_*omo 18

塞特和盖特!

(function($) {
    // Attrs
    $.fn.attrs = function(attrs) {
        var t = $(this);
        if (attrs) {
            // Set attributes
            t.each(function(i, e) {
                var j = $(e);
                for (var attr in attrs) {
                    j.attr(attr, attrs[attr]);
                }
            });
            return t;
        } else {
            // Get attributes
            var a = {},
                r = t.get(0);
            if (r) {
                r = r.attributes;
                for (var i in r) {
                    var p = r[i];
                    if (typeof p.nodeValue !== 'undefined') a[p.nodeName] = p.nodeValue;
                }
            }
            return a;
        }
    };
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

使用:

// Setter
$('#element').attrs({
    'name' : 'newName',
    'id' : 'newId',
    'readonly': true
});

// Getter
var attrs = $('#element').attrs();
Run Code Online (Sandbox Code Playgroud)

  • 很好,我喜欢这个答案最好的.与`jQuery.attr`非常吻合. (2认同)

Ber*_*den 7

很简单。你只需要遍历 attributes 元素并将它们的 nodeValues 推入一个数组:

let att = document.getElementById('id');

let arr = Array();

for (let i = 0; i < att.attributes.length; i++) {
    arr.push(att.attributes[i].nodeValue);
}
Run Code Online (Sandbox Code Playgroud)

如果您想要属性的名称,您可以将 'nodeValue' 替换为 'nodeName'。

let att = document.getElementById('id');

let arr = Array();

for (let i = 0; i < att.attributes.length; i++) {
    arr.push(att.attributes[i].nodeName);
}
Run Code Online (Sandbox Code Playgroud)


gfu*_*lam 6

使用.slice该转换attributes属性阵列

attributesDOM节点的属性是a NamedNodeMap,它是一个类似于Array的对象.

类似Array的对象是一个对象,它具有一个length属性,其属性名称被枚举,但是有其自身的方法并且不从Array.prototype

slice方法可用于将类似Array的对象转换为新的Array.

var elem  = document.querySelector('[name=test]'),
    attrs = Array.prototype.slice.call(elem.attributes);

console.log(attrs);
Run Code Online (Sandbox Code Playgroud)
<span name="test" message="test2">See console.</span>
Run Code Online (Sandbox Code Playgroud)

  • [...元素.属性] (2认同)

Prz*_*mek 5

更简洁的方法来做到这一点:

\n\n

老方法(IE9+):

\n\n
var element = document.querySelector(/* \xe2\x80\xa6 */);\n[].slice.call(element.attributes).map(function (attr) { return attr.nodeName; });\n
Run Code Online (Sandbox Code Playgroud)\n\n

ES6方式(Edge 12+):

\n\n
[...document.querySelector(/* \xe2\x80\xa6 */).attributes].map(attr => attr.nodeName);\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n

演示:

\n\n

\r\n
\r\n
var element = document.querySelector(/* \xe2\x80\xa6 */);\n[].slice.call(element.attributes).map(function (attr) { return attr.nodeName; });\n
Run Code Online (Sandbox Code Playgroud)\r\n
[...document.querySelector(/* \xe2\x80\xa6 */).attributes].map(attr => attr.nodeName);\n
Run Code Online (Sandbox Code Playgroud)\r\n
console.log(\r\n  [...document.querySelector(\'img\').attributes].map(attr => attr.nodeName)\r\n);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n


Tim*_*erg 5

这里的每个答案都缺少使用getAttributeNames元素方法的最简单解决方案!

它检索所有元素当前属性的名称作为常规数组,然后您可以将其简化为键/值的不错对象。

const getAllAttributes = el => el
  .getAttributeNames()
  .reduce((obj, name) => ({
    ...obj,
    [name]: el.getAttribute(name)
  }), {})

console.log(getAllAttributes(document.querySelector('div')))
Run Code Online (Sandbox Code Playgroud)
<div title="hello" className="foo" data-foo="bar"></div>
Run Code Online (Sandbox Code Playgroud)