문제

나는 오늘 IE8의 DOM Select Element의 JavaScript '옵션'속성 구현에서 이상한 행동을 발견했습니다.

다음 HTML을 감안할 때 :

<select id="sel"><option value="val">An option</option></select>

그리고 JavaScript :

var sel = document.getElementById('sel');
alert(sel === sel.options); //alerts 'true' in IE8

분명히, IE8에 대한 Select 구현을 작성하는 영리한 동료는 선택 요소에 대한 인덱서를 작성한 다음 자체 '옵션'속성으로 JavaScript에 노출되었습니다.

내 질문은: JavaScript 언어 사양에 따라이 예상 기능입니까? 이것은 알려진 버그입니까? 특히 배열이 아닌 '옵션'속성을 개체로 계속 취급해야합니까?

이것은 Select DOM 요소가 Firefox 3.5, Chrome 1.0 또는 Safari 3.1에서 동작하는 방식이 아니며 '옵션'속성이 JavaScript 배열로 노출됩니다 ...

참고로, 나는 요소를 감싸기 위해 '옵션'속성을 jQuery 생성자에게 전달했을 때 이것을 발견했습니다. x 요소 (Firefox, Chrome 및 Safari를 사용하여 발생)가있는 jQuery 객체의 예상 결과보다는 1 요소 (선택 요소 자체)가있는 jQuery 객체를 반환했습니다.

도움이 되었습니까?

해결책

우선, 이것은 JavaScript 언어와 관련이 아니라 DOM과 관련이 있습니다 :)

예를 들어 Dom L2를 제쳐두고 Nitpicking HTMLSelectElement 객체가있는 것 options 재산. 해당 속성은 유형으로 정의됩니다 HTMLOptionsCollection 그리고 "이 요소에 포함 된 옵션 요소 모음"을 나타냅니다.

이제 인용합니다 HTMLOptionsCollection:

htmloptionscollection은 HTML 옵션 요소를 나타내는 노드 목록입니다. 개별 노드는 서수 색인 또는 노드 이름 또는 ID 속성으로 액세스 할 수 있습니다.

참고 : HTML DOM의 컬렉션은 기본 문서가 변경 될 때 자동으로 업데이트된다는 의미로 가정됩니다.

기술적으로는 있습니다 예방하는 것은 없습니다 HTMLSelectElement 그것과 동일합니다 HTMLOptionsCollection (최소한 DOM L2 사양에 있지 않음). 구현은 표준 동작과 일치하는 한 완전히 준수됩니다 (즉, 요소는 색인 또는 이름/ID 및 인터페이스 속성/방법으로 액세스 할 수 있습니다. item 그리고 length - 지정된대로 구현됩니다).

솔직히, 나는 당신이 왜이 특이성에 관심이 있는지 알지 못합니다. 인덱스/이름으로 요소에 액세스하는 것이 효과가있는 경우 options 와 동등하다. 항상 그렇듯이 최선의 방법은 표준 준수 방식으로 스크립트를 설계하는 것입니다 (그리고 알려진 결함을 중심으로 작업).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top