Javascript / jQuery를 사용하여 HTML 요소에서 모든 속성 가져 오기


161

Html 요소의 모든 속성을 배열에 넣고 싶습니다 .jQuery 객체가있는 것처럼 html은 다음과 같습니다.

<span name="test" message="test2"></span>

이제 한 가지 방법은 here 설명 된 xml 파서를 사용하는 것이지만 객체의 html 코드를 얻는 방법을 알아야합니다.

다른 방법은 jquery로 만드는 것입니다. 그러나 어떻게? 속성의 수와 이름은 일반적입니다.

감사

Btw : document.getelementbyid 또는 이와 유사한 것으로 요소에 액세스 할 수 없습니다.

답변:


218

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

이것은 속성 이름으로 만 배열을 채 웁니다. 속성 값이 필요한 경우 다음 속성을 사용할 수 있습니다 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);
}

문제는 getElementById를 사용할 수 없다는 것입니다 .jquery 객체입니다. jquery와 같은 컨텍스트 내에서 getelementbyclassname을 만들 수있는 방법이 있습니까?
k0ni

4
사용할 수 있습니다 getElementByIdvar el = document.getElementById($(myObj).attr("id"));
Sampson

45
get메소드 를 통해 jQuery 객체에서 DOM 객체를 가져올 수 있습니다 . 예 :var obj = $('#example').get(0);
Matt Huggins

3
@ k0ni-예를 들어 var atts = $ (myObject) [0] .attributes; ?
랄프 카울링

12
경고 : IE에서는 이것이 명시 될뿐만 아니라 모든 가능한 속성들
Alexey Lebedev

70

이 간단한 플러그인을 $ ( '# 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);

4
참고 : 셀렉터의 첫 번째 요소 만 노출합니다.
Brett Veenstra

테스트 한 결과 동적으로 추가 된 속성 (크롬)으로 작동합니다
CodeToad

57

단순한:

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

이것의 단점은?
rzr

7
Attr.nodeValuevalueChrome에 따르면 더 이상 사용되지 않습니다 . 그래서 이것은 될 수 있습니다 this.name + ':' + this.value. Attr 인터페이스
Thai

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

용법:

var attribs = $('#some_id').getAttributes();

1
오타-6 행의 el.get (0)은 elem.get (0)이어야합니다.
Graham Charles

내 경험에 따르면 지금 이것은 실제로 이것보다 조금 더 복잡합니다. 적어도 어떤 경우에는. 예를 들어, 값이 'null'(문자열 값) 인 'dataFld'라는 속성이 포함됩니까? 아니면 제외합니까?
mightyiam 2016 년

동적으로 추가 된 속성에서는 작동하지 않으므로 속성과 속성이 항상 동기화되지는 않습니다.
DUzun

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

사용하다:

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

// Getter
var attrs = $('#element').attrs();

2
이 답변이 가장 좋습니다. 와 완벽하게 맞습니다 jQuery.attr.
Scott Rippey 2014

1
두 가지 권장 사항 : "최소화되지 않은"변수 이름을 사용하도록 업데이트 할 수 있습니까? 그리고 당신이 jQuery.attr세터에서 사용 하고있는 것을 보았지만 getter에서도 사용하는 것이 유리할 것입니다.
Scott Rippey

또한 작은 것-첫 번째 for () 문 뒤에 세미콜론이 없어야합니다.
jbyrd

6

속성을 배열 .slice로 변환하는 데 사용attributes

attributesDOM 노드 의 속성은 NamedNodeMap배열과 유사한 객체 인입니다.

Array-like 객체는 length속성이 있고 속성 이름이 열거 된 객체 이지만, 그렇지 않으면 자체 메서드가 있으며 상속되지 않는 객체입니다.Array.prototype

slice메소드를 사용하면 Array와 유사한 객체를 새 Array로 변환 할 수 있습니다 .

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

console.log(attrs);
<span name="test" message="test2">See console.</span>


1
그러나 속성 이름이 아닌 객체 배열을 문자열로 반환합니다.
Przemek

1
OP는 이름 배열을 문자열로 지정하지 않았습니다. "Html 요소의 모든 특성을 배열에 추가하고 싶습니다." 그렇게합니다.
gfullam 2016 년

확인을 만드는 의미
Przemek

1
의 항목을 반복하면서 항목 attrs의 속성을 사용하여 name속성 의 이름에 액세스 할 수 있습니다 .
tyler.frankenstein

3

이 방법은 배열에 반환 된 객체에서 이름과 값을 가진 모든 속성을 가져와야하는 경우에 효과적입니다.

출력 예 :

[
    {
        name: 'message',
        value: 'test2'
    }
    ...
]

function getElementAttrs(el) {
  return [].slice.call(el.attributes).map((attr) => {
    return {
      name: attr.name,
      value: attr.value
    }
  });
}

var allAttrs = getElementAttrs(document.querySelector('span'));
console.log(allAttrs);
<span name="test" message="test2"></span>

해당 요소에 대한 속성 이름 배열 만 원하는 경우 결과를 맵핑하면됩니다.

var onlyAttrNames = allAttrs.map(attr => attr.name);
console.log(onlyAttrNames); // ["name", "message"]

2

Roland Bouman답변 은 가장 좋고 간단한 바닐라 방식입니다. 나는 jQ 플러그에 대한 시도를 알아 차 렸지만 그것들은 나에게 충분히 "충분한"것처럼 보이지 않아서 내 자신을 만들었다. 지금까지 유일한 단점은 직접 호출하지 않고 동적으로 추가 된 attr에 액세스 할 수 없다는 것 elm.attr('dynamicAttr')입니다. 그러나 이것은 jQuery 요소 객체의 모든 자연 속성을 반환합니다.

플러그인은 간단한 jQuery 스타일 호출을 사용합니다.

$(elm).getAttrs();
// OR
$.getAttrs(elm);

하나의 특정 속성을 얻기 위해 두 번째 문자열 매개 변수를 추가 할 수도 있습니다. jQuery는 이미을 제공하므로 하나의 요소 선택에는 실제로 필요하지 않지만 $(elm).attr('name')플러그인 버전은 여러 반환을 허용합니다. 예를 들어

$.getAttrs('*', 'class');

배열 []이 객체를 반환합니다 {}. 각 객체는 다음과 같습니다.

{ class: 'classes names', elm: $(elm), index: i } // index is $(elm).index()

플러그인

;;(function($) {
    $.getAttrs || ($.extend({
        getAttrs: function() {
            var a = arguments,
                d, b;
            if (a.length)
                for (x in a) switch (typeof a[x]) {
                    case "object":
                        a[x] instanceof jQuery && (b = a[x]);
                        break;
                    case "string":
                        b ? d || (d = a[x]) : b = $(a[x])
                }
            if (b instanceof jQuery) {
                var e = [];
                if (1 == b.length) {
                    for (var f = 0, g = b[0].attributes, h = g.length; f < h; f++) a = g[f], e[a.name] = a.value;
                    b.data("attrList", e);
                    d && "all" != d && (e = b.attr(d))
                } else d && "all" != d ? b.each(function(a) {
                    a = {
                        elm: $(this),
                        index: $(this).index()
                    };
                    a[d] = $(this).attr(d);
                    e.push(a)
                }) : b.each(function(a) {
                    $elmRet = [];
                    for (var b = 0, d = this.attributes, f = d.length; b < f; b++) a = d[b], $elmRet[a.name] = a.value;
                    e.push({
                        elm: $(this),
                        index: $(this).index(),
                        attrs: $elmRet
                    });
                    $(this).data("attrList", e)
                });
                return e
            }
            return "Error: Cannot find Selector"
        }
    }), $.fn.extend({
        getAttrs: function() {
            var a = [$(this)];
            if (arguments.length)
                for (x in arguments) a.push(arguments[x]);
            return $.getAttrs.apply($, a)
        }
    }))
})(jQuery);

준수

;;(function(c){c.getAttrs||(c.extend({getAttrs:function(){var a=arguments,d,b;if(a.length)for(x in a)switch(typeof a[x]){case "object":a[x]instanceof jQuery&&(b=a[x]);break;case "string":b?d||(d=a[x]):b=c(a[x])}if(b instanceof jQuery){if(1==b.length){for(var e=[],f=0,g=b[0].attributes,h=g.length;f<h;f++)a=g[f],e[a.name]=a.value;b.data("attrList",e);d&&"all"!=d&&(e=b.attr(d));for(x in e)e.length++}else e=[],d&&"all"!=d?b.each(function(a){a={elm:c(this),index:c(this).index()};a[d]=c(this).attr(d);e.push(a)}):b.each(function(a){$elmRet=[];for(var b=0,d=this.attributes,f=d.length;b<f;b++)a=d[b],$elmRet[a.name]=a.value;e.push({elm:c(this),index:c(this).index(),attrs:$elmRet});c(this).data("attrList",e);for(x in $elmRet)$elmRet.length++});return e}return"Error: Cannot find Selector"}}),c.fn.extend({getAttrs:function(){var a=[c(this)];if(arguments.length)for(x in arguments)a.push(arguments[x]);return c.getAttrs.apply(c,a)}}))})(jQuery);

jsFiddle


2

훨씬 더 간결한 방법 :

구식 (IE9 +) :

var element = document.querySelector(/* … */);
[].slice.call(element.attributes).map(function (attr) { return attr.nodeName; });

ES6 방식 (Edge 12+) :

[...document.querySelector(/* … */).attributes].map(attr => attr.nodeName);

데모:


1

도움이 되나요?

이 속성은 요소의 모든 특성을 배열로 반환합니다. 다음은 예입니다.

window.addEventListener('load', function() {
  var result = document.getElementById('result');
  var spanAttributes = document.getElementsByTagName('span')[0].attributes;
  for (var i = 0; i != spanAttributes.length; i++) {
    result.innerHTML += spanAttributes[i].value + ',';
  }
});
<span name="test" message="test2"></span>
<div id="result"></div>

많은 요소의 속성을 가져 와서 구성하려면 반복하려는 모든 요소의 배열을 만든 다음 각 요소의 모든 속성에 대해 하위 배열을 만드는 것이 좋습니다.

이것은 수집 된 요소를 반복하고 두 가지 속성을 인쇄하는 스크립트의 예입니다. 이 스크립트는 항상 두 가지 속성이 있다고 가정하지만 추가 매핑으로 쉽게 수정할 수 있습니다.

window.addEventListener('load',function(){
  /*
  collect all the elements you want the attributes
  for into the variable "elementsToTrack"
  */ 
  var elementsToTrack = $('body span, body div');
  //variable to store all attributes for each element
  var attributes = [];
  //gather all attributes of selected elements
  for(var i = 0; i != elementsToTrack.length; i++){
    var currentAttr = elementsToTrack[i].attributes;
    attributes.push(currentAttr);
  }
  
  //print out all the attrbute names and values
  var result = document.getElementById('result');
  for(var i = 0; i != attributes.length; i++){
    result.innerHTML += attributes[i][0].name + ', ' + attributes[i][0].value + ' | ' + attributes[i][1].name + ', ' + attributes[i][1].value +'<br>';  
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<span name="test" message="test2"></span>
<div name="test" message="test2"></div>
<div name="test" message="test2"></div>
<div name="test" message="test2"></div>
<div name="test" message="test2"></div>
<div id="result"></div>


1

여기에있는 모든 답변에는 getAttributeNames 요소 메소드를 사용하는 가장 간단한 솔루션이 없습니다 !

모든 요소의 현재 속성 이름을 일반 배열로 검색하여 멋진 키 / 값 객체로 줄일 수 있습니다.

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

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


1

아래와 같은 HTML 요소가 있다고 상상해보십시오.

<a class="toc-item"
   href="/books/n/ukhta2333/s5/"
   id="book-link-29"
>
   Chapter 5. Conclusions and recommendations
</a>

모든 속성을 얻을 수있는 한 가지 방법은 속성을 배열로 변환하는 것입니다.

const el = document.getElementById("book-link-29")
const attrArray = Array.from(el.attributes)

// Now you can iterate all the attributes and do whatever you need.
const attributes = attrArray.reduce((attrs, attr) => {
    attrs !== '' && (attrs += ' ')
    attrs += `${attr.nodeName}="${attr.nodeValue}"`
    return attrs
}, '')
console.log(attributes)

아래는 모든 속성을 포함하는 예제에서 얻을 수있는 문자열입니다.

class="toc-item" href="/books/n/ukhta2333/s5/" id="book-link-29"

0

이런 식으로 해보십시오

    <div id=foo [href]="url" class (click)="alert('hello')" data-hello=world></div>

그런 다음 모든 속성을 가져옵니다

    const foo = document.getElementById('foo');
    // or if you have a jQuery object
    // const foo = $('#foo')[0];

    function getAttributes(el) {
        const attrObj = {};
        if(!el.hasAttributes()) return attrObj;
        for (const attr of el.attributes)
            attrObj[attr.name] = attr.value;
        return attrObj
    }

    // {"id":"foo","[href]":"url","class":"","(click)":"alert('hello')","data-hello":"world"}
    console.log(getAttributes(foo));

속성 배열의 경우

    // ["id","[href]","class","(click)","data-hello"]
    Object.keys(getAttributes(foo))

0
Element.prototype.getA = function (a) {
        if (a) {
            return this.getAttribute(a);
        } else {
            var o = {};
            for(let a of this.attributes){
                o[a.name]=a.value;
            }
            return o;
        }
    }

<div id="mydiv" a='1' b='2'>...</div> 사용할 수 있습니다

mydiv.getA() // {id:"mydiv",a:'1',b:'2'}

0

매우 간단합니다. 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);
}

속성 이름을 원하면 'nodeName'대신 'nodeValue'를 바꿀 수 있습니다.

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

let arr = Array();

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

0

속성을 객체로 변환

* 필수 : ​​lodash

function getAttributes(element, parseJson=false){
    let results = {}
    for (let i = 0, n = element.attributes.length; i < n; i++){
        let key = element.attributes[i].nodeName.replace('-', '.')
        let value = element.attributes[i].nodeValue
        if(parseJson){
            try{
                if(_.isString(value))
                value = JSON.parse(value)
            } catch(e) {}
        }
        _.set(results, key, value)
    }
    return results
}

모든 HTML 속성을 중첩 된 객체로 변환합니다

HTML 예 : <div custom-nested-path1="value1" custom-nested-path2="value2"></div>

결과: {custom:{nested:{path1:"value1",path2:"value2"}}}

parseJson이 true로 설정되면 json 값이 객체로 변환됩니다.


-8

자바 스크립트에서 :

var attributes;
var spans = document.getElementsByTagName("span");
for(var s in spans){
  if (spans[s].getAttribute('name') === 'test') {
     attributes = spans[s].attributes;
     break;
  }
}

속성 이름 및 값에 액세스하려면 다음을 수행하십시오.

attributes[0].nodeName
attributes[0].nodeValue

모든 스팬 요소를 사용하면 너무 느려집니다
0-0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.