getAttribute () 대 Element 객체 속성?


92

같은 식 Element.getAttribute("id")Element.id 똑같은 것을 반환합니다.

HTMLElement 객체의 속성이 필요할 때 어떤 것을 사용해야합니까?

같은 이러한 방법으로 어떤 크로스 브라우저 문제가 있습니다 getAttribute()setAttribute() 있습니까?

아니면 객체 속성에 직접 액세스하는 것과 이러한 속성 메서드를 사용하는 것 사이의 성능에 어떤 영향이 있습니까?


답변:


126

getAttribute검색 속성 , 동안 DOM 요소를 el.id검색하는 속성 이 DOM 요소한다. 그들은 동일하지 않습니다.

대부분의 경우 DOM 속성은 속성과 동기화됩니다.

그러나 동기화 가 동일한 값을 보장하지는 않습니다 . 고전적인 예는 앵커 요소 사이 el.hrefel.getAttribute('href')입니다.

예를 들면 :

<a href="/" id="hey"></a>
<script>
var a = document.getElementById('hey')
a.getAttribute('href') // "/"
a.href // Full URL except for IE that keeps '/'
</script>

이 동작은 W3C 에 따라 href 속성이 올바른 형식의 링크 여야 하기 때문에 발생 합니다. 대부분의 브라우저는이 표준을 존중합니다 (누가 그렇지 않을까요?).

inputchecked재산에 대한 또 다른 사례가 있습니다. DOM 속성이 반환 true하거나 false속성이 문자열을 반환하는 동안"checked" 또는 빈 문자열을 합니다.

그리고 단방향으로 만 동기화되는 일부 속성이 있습니다 . 가장 좋은 예는 요소 의 value속성입니다 input. DOM 속성을 통해 값을 변경해도 속성은 변경되지 않습니다 (편집 : 더 정확한 첫 번째 주석 확인).

이러한 이유 때문에 브라우저마다 동작이 다르기 때문에 속성이 아닌 DOM 속성 을 계속 사용하는 것이 좋습니다 .

실제로 속성을 사용해야하는 경우는 두 가지뿐입니다.

  1. DOM 속성에 동기화되지 않기 때문에 사용자 정의 HTML 속성입니다.
  2. 속성에서 동기화되지 않은 기본 제공 HTML 속성에 액세스하려면 속성 (예 value: input요소 의 원본 )이 필요합니다.

더 자세한 설명을 원하시면 이 페이지 를 읽어 보시기 바랍니다 . 몇 분 밖에 걸리지 않지만 정보 (여기서 요약 한 내용)에 기뻐할 것입니다.


9
일반적으로 좋은 조언은 +1. 동기화는 약간 꺼져 있습니다. value입력의 속성은 속성에서 초기 값을 가져 오지만 그렇지 않으면 전혀 연결되지 않습니다. value속성은 완전히 대신과 동기화 defaultValue속성입니다. 마찬가지로 checkeddefaultChecked. 고장이 (<= 7 개 호환 모드 이상) 이전 IE, 제외 getAttribute()하고 setAttribute().
Tim Down

:-) "더 explaination"로 당신의 코멘트를 추가
플로리안 Margaine

2
첫 번째 예가 틀렸다고 생각합니다. a.href전체 URL을 a.getAttribute("href")반환하고 HTML 소스에서 그대로 속성을 반환합니다.
Salman A

값이 기본값이 아닌지 알아 내려는 경우 속성을 사용하는 것이 좋습니다. 많은 최신 브라우저는 기본값 (예 :) input.formAction또는 빈 문자열 (예 :)을 반환 a.download하므로 상황이 모호합니다. 유일한 예외는 value.
Kevin Li

dom에 id가 전혀 설정되지 않은 경우 getAttribute는 null을 반환하고 element.id는 빈 문자열을 반환합니다. 이것이 표준입니까?
Maciej Krawczyk

11

getAttribute('attribute') 일반적으로 페이지의 HTML 소스에 정의 된대로 속성 값을 문자열로 반환합니다.

그러나 element.attribute속성의 정규화 또는 계산 된 값을 반환 할 수 있습니다. 예 :

  • <a href="https://stackoverflow.com/foo"></a>
    • a.href는 전체 URL 을 포함합니다.
  • <input type="checkbox" checked>
    • input.checked는 true (부울)가됩니다.
  • <input type="checkbox" checked="bleh">
    • input.checked는 true (부울)가됩니다.
  • <img src='http://dummyimage.com/64x64/000/fff'>
    • img.width는 이미지가로드되기 전에 0 (숫자) 이됩니다.
    • img.width는 이미지 (또는 이미지의 처음 몇 바이트)가로드 될 때 64 (숫자)가됩니다.
  • <img src='http://dummyimage.com/64x64/000/fff' width="50%">
    • img.width는 계산 된 50 %가됩니다.
  • <img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
    • img.width는 50 (숫자)입니다.
  • <div style='background: lime;'></div>
    • div.style은 객체가됩니다.


3

특별한 이유가없는 한 항상 속성을 사용하십시오.

  • getAttribute()setAttribute() 이전의 IE (이상 버전에서 호환 모드) 끊어지는
  • 속성이 더 편리합니다 (특히 부울 속성에 해당하는 속성).

있다 몇 가지 예외 :

  • 속성에 액세스 <form>요소의
  • 사용자 지정 속성에 액세스 (사용자 지정 속성 사용은 권장하지 않지만)

이 주제에 대해 몇 번 썼습니다.


IE 8 이전에는 속성과 속성 이 동일하게 취급되었습니다 . 앞에서 언급했듯이 속성은 갈 길입니다.

@MattMcDonald : 예, 그것이 제가 암시했던 깨짐입니다. 나는 내가 링크 한 다른 답변에서 충분히 그렇게 느꼈기 때문에이 답변에서 확장하지 않았습니다. :)
Tim Down

3

.id함수 호출 오버 헤드를 절약합니다. (매우 작지만 물었다.)


안녕 gdoron, 호기심을 위해 : 나는 이것에 대한 '공식적인'설명을 찾으려고 노력했지만 (충분히 분명한 경험적 테스트를 넘어;)) 성공하지 못했습니다. 그것에 대한 링크가 있습니까?
mamoo

0

이것을 완전히 이해하려면 아래 예제를 시도하십시오. 아래 DIV의 경우

<div class="myclass"></div>

Element.getAttribute('class')반환 myclass하지만 당신은 사용이 Element.classNameDOM을 속성에서 검색합니다.


0

이것이 큰 차이를 만드는 한 가지 영역은 속성 기반 CSS 스타일링입니다.

다음을 고려하세요:

const divs = document.querySelectorAll('div');

divs[1].custom = true;
divs[2].setAttribute('custom', true);
div {
  border: 1px solid;
  margin-bottom: 8px;
}

div[custom] {
  background: #36a;
  color: #fff;
}
<div>A normal div</div>
<div>A div with a custom property set directly.</div>
<div>A div with a custom attribute set with `setAttribute`</div>

맞춤 속성이 직접 설정된 div는 속성에 값을 반영하지 않으며 속성 선택기 (div[custom] CSS )에 .

setAttribute그러나를 사용하여 맞춤 속성이 설정된 div 는 CSS 속성 선택기를 사용하여 선택할 수 있으며 그에 따라 스타일을 지정할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.