현행 표준 — 마지막 업데이트 2026년 7월 20일
a 요소em 요소strong 요소small 요소s 요소cite 요소q 요소dfn 요소abbr 요소ruby 요소rt 요소rp 요소data 요소time 요소code 요소var 요소samp 요소kbd 요소sub 및
sup 요소i 요소b 요소u 요소mark 요소bdi 요소bdo 요소span 요소br 요소wbr 요소a 및 area 요소로 생성된 링크a 및
area 요소용 APIalternate"
author"
bookmark"canonical"dns-prefetch"expect"
external"help"icon"license"manifest"modulepreload"nofollow"noopener"noreferrer"opener"
pingback"preconnect"prefetch"preload"privacy-policy"search"
stylesheet"tag"terms-of-service"picture 요소
source 요소img 요소source, img 및
link 요소의 공통 속성
iframe 요소embed 요소object 요소video 요소audio 요소track 요소TrackEvent
인터페이스map 요소area 요소form 요소label 요소input 요소
type 속성의 상태
type=hidden)type=text) 상태 및 검색 상태
(type=search)type=tel)type=url)type=email)type=password)type=date)type=month)type=week)type=time)type=datetime-local)type=number)type=range)type=color)type=checkbox)type=radio)type=file)type=submit)type=image)type=reset)type=button)input 요소 속성
input
요소 APIbutton 요소select 요소datalist 요소
optgroup 요소
option 요소
textarea 요소
output 요소
progress 요소
meter 요소fieldset 요소
legend 요소
selectedcontent 요소script 요소
noscript 요소
template 요소
slot 요소canvas 요소
Path2D 객체
ImageBitmap 렌더링 컨텍스트
OffscreenCanvas 인터페이스
canvas 요소의 보안Window, WindowProxy 및 Location 객체용
보안 인프라
Window 객체
WindowProxy
특수 객체
Location
인터페이스
History 인터페이스
NotRestoredReasons 인터페이스X-Frame-Options`
헤더Refresh` 헤더WindowOrWorkerGlobalScope 믹스인button 요소
details 및 summary 요소input 요소input 요소input 요소input
요소input 요소input 요소input 요소marquee 요소
meter 요소
progress
요소select 요소
textarea
요소이 명세는 웹 플랫폼의 상당 부분을 매우 상세하게 정의한다. 다른 명세와 비교했을 때 웹 플랫폼 명세 체계에서 이 명세가 차지하는 위치는 다음과 같이 가장 잘 요약할 수 있다.
이 절은 비규범적이다.
간단히 말하면 그렇다.
좀 더 길게 말하면, "HTML5"라는 용어는 현대적인 웹 기술을 가리키는 유행어로 널리 사용되며, 그중 다수는 WHATWG에서 개발되지만 모든 기술이 그런 것은 아니다. 이 문서도 그러한 문서 중 하나이며, 다른 문서는 WHATWG 표준 개요에서 확인할 수 있다.
이 절은 비규범적이다.
HTML은 월드 와이드 웹의 핵심 마크업 언어이다. 원래 HTML은 주로 과학 문서를 의미론적으로 기술하기 위한 언어로 설계되었다. 그러나 일반적인 설계 덕분에 이후 여러 해에 걸쳐 다양한 다른 유형의 문서와 애플리케이션까지 기술하도록 조정될 수 있었다.
이 절은 비규범적이다.
이 명세는 이 명세에서 정의한 기능을 사용하는 문서와 스크립트의 작성자, 이 명세에서 정의한 기능을 사용하는 페이지를 처리하는 도구의 구현자, 그리고 이 명세의 요구 사항에 비추어 문서나 구현의 정확성을 확인하려는 사람을 대상으로 한다.
이 문서는 웹 기술에 대해 최소한의 기본 지식조차 없는 독자에게는 적합하지 않을 수 있다. 일부 부분에서는 정확성을 위해 명확성을 희생하고, 완전성을 위해 간결성을 희생하기 때문이다. 보다 접근하기 쉬운 튜토리얼과 작성 지침은 이 주제를 좀 더 쉽게 소개할 수 있다.
특히 이 명세의 기술적인 부분 일부를 완전히 이해하려면 DOM의 기초에 익숙해야 한다. Web IDL, HTTP, XML, Unicode, 문자 인코딩, JavaScript 및 CSS에 대한 이해도 일부 부분에서 도움이 되지만 필수적인 것은 아니다.
이 절은 비규범적이다.
이 명세는 정적 문서부터 동적 애플리케이션에 이르기까지 웹에서 접근 가능한 페이지를 작성하기 위한 의미론 수준의 마크업 언어와 관련 의미론 수준의 스크립팅 API를 제공하는 것으로 범위가 제한된다.
이 명세의 범위에는 미디어별 표현 사용자 지정 메커니즘을 제공하는 것이 포함되지 않는다. 다만 웹 브라우저의 기본 렌더링 규칙은 이 명세의 끝부분에 포함되어 있으며, CSS와 연동하기 위한 여러 메커니즘이 언어의 일부로 제공된다.
이 명세의 범위는 완전한 운영 체제를 기술하는 것이 아니다. 특히 하드웨어 구성 소프트웨어, 이미지 조작 도구, 사용자가 고성능 워크스테이션에서 매일 사용할 것으로 예상되는 애플리케이션은 범위에 포함되지 않는다. 애플리케이션 측면에서 이 명세는 사용자가 가끔 사용하거나, 정기적으로 사용하더라도 서로 다른 위치에서 사용하며, CPU 요구 사항이 낮을 것으로 예상되는 애플리케이션을 구체적인 대상으로 한다. 이러한 애플리케이션의 예로는 온라인 구매 시스템, 검색 시스템, 게임(특히 다중 사용자 온라인 게임), 공용 전화번호부나 주소록, 통신 소프트웨어(이메일 클라이언트, 인스턴트 메시징 클라이언트, 토론 소프트웨어), 문서 편집 소프트웨어 등이 있다.
이 절은 비규범적이다.
처음 5년 동안(1990~1995년) HTML은 여러 차례 개정되고 다양한 확장이 이루어졌으며, 처음에는 주로 CERN에서, 그다음에는 IETF에서 작업이 진행되었다.
W3C가 설립되면서 HTML 개발 장소도 다시 바뀌었다. 1995년 HTML 3.0으로 알려진 HTML 확장 시도가 처음 이루어졌지만 중단되었고, 이후 HTML 3.2라는 보다 실용적인 접근 방식으로 대체되어 1997년에 완성되었다. 같은 해 후반에는 HTML4가 빠르게 뒤따랐다.
그다음 해 W3C 회원은 HTML의 발전을 중단하고 XHTML이라는 XML 기반의 동등한 언어에 대한 작업을 시작하기로 결정했다. 이 작업은 HTML4를 XML로 다시 표현한 XHTML 1.0에서 시작되었다. XHTML 1.0은 새로운 직렬화 방식 외에는 새 기능을 추가하지 않았으며 2000년에 완성되었다. XHTML 1.0 이후 W3C는 XHTML 모듈화라는 이름 아래 다른 작업 그룹이 XHTML을 더 쉽게 확장할 수 있도록 하는 데 초점을 맞추었다. 이와 병행하여 W3C는 이전 HTML 및 XHTML 언어와 호환되지 않는 XHTML2라는 새로운 언어도 개발했다.
1998년경 HTML의 발전이 중단되었을 때 브라우저 공급업체가 개발한 HTML API의 일부는 DOM Level 1이라는 이름으로 명세화되어 1998년에 공개되었으며, DOM Level 2 Core와 DOM Level 2 HTML은 2000년부터 작업이 시작되어 2003년에 완성되었다. 이후 이러한 작업은 점차 약화되었고, 2004년에 일부 DOM Level 3 명세가 공개되었지만 모든 Level 3 초안이 완성되기 전에 작업 그룹이 종료되었다.
2003년 차세대 웹 폼 기술로 자리매김한 XForms가 공개되면서, HTML을 대체할 기술을 찾기보다는 HTML 자체를 발전시키려는 관심이 다시 높아졌다. 이러한 관심은 XML이 웹 기술로 배포된 범위가 기존에 배포된 기술(HTML 등)을 대체하는 데 있지 않고, 완전히 새로운 기술(RSS와 이후의 Atom 등)에 제한되어 있다는 인식에서 비롯되었다.
기존 HTML 웹 페이지와 호환되지 않는 렌더링 엔진을 브라우저에 구현하도록 요구하지 않으면서도 HTML4의 폼을 확장하여 XForms 1.0이 도입한 여러 기능을 제공할 수 있음을 보여 주는 개념 증명이 이러한 새로운 관심의 첫 번째 결과였다. 이 초기 단계에도 초안은 이미 공개되어 있었고 모든 출처에서 의견을 받고 있었지만, 명세의 저작권은 Opera Software에만 귀속되어 있었다.
HTML의 발전을 다시 시작해야 한다는 생각은 2004년 W3C 워크숍에서 검토되었다. 이 자리에서 아래에 설명하는 HTML5 작업의 기반이 되는 일부 원칙과 앞서 언급한 폼 관련 기능만을 다룬 초기 초안 제안이 Mozilla와 Opera에 의해 공동으로 W3C에 제출되었다. 이 제안은 이전에 선택한 웹 발전 방향과 충돌한다는 이유로 거부되었고, W3C 직원과 회원은 대신 XML 기반 대체 기술을 계속 개발하기로 결정했다.
얼마 지나지 않아 Apple, Mozilla 및 Opera는 WHATWG라는 새로운 조직 아래에서 이 작업을 계속하겠다는 의사를 공동으로 발표했다. 공개 메일링 리스트가 만들어졌고 초안은 WHATWG 사이트로 옮겨졌다. 이후 저작권은 세 공급업체가 공동으로 소유하고, 명세의 재사용을 허용하도록 변경되었다.
WHATWG는 여러 핵심 원칙을 기반으로 했다. 특히 기술은 하위 호환성을 유지해야 하고, 구현이 아니라 명세를 변경해야 하는 경우에도 명세와 구현은 일치해야 하며, 구현이 서로를 역공학하지 않고도 완전한 상호 운용성을 달성할 수 있을 만큼 명세가 상세해야 한다는 원칙이었다.
특히 마지막 요구 사항으로 인해 HTML5 명세의 범위에는 이전에 별도 문서 세 개, 즉 HTML4, XHTML1 및 DOM2 HTML에서 명세했던 내용이 포함되어야 했다. 또한 이전에 일반적이라고 여겨졌던 수준보다 훨씬 더 많은 세부 사항을 포함해야 했다.
2006년 W3C는 결국 HTML5 개발에 참여하는 데 관심을 표명했고, 2007년에는 HTML5 명세 개발을 위해 WHATWG와 협력하는 작업 그룹을 구성했다. Apple, Mozilla 및 Opera는 WHATWG 사이트에 제한이 더 적은 라이선스 버전을 유지하면서, W3C가 W3C 저작권 아래에서 명세를 공개하도록 허용했다.
그 후 몇 년 동안 두 그룹은 함께 작업했다. 그러나 2011년에 두 그룹은 목표가 서로 다르다는 결론을 내렸다. W3C는 "HTML5"의 "완성된" 버전을 공개하려 했지만, WHATWG는 알려진 문제가 있는 상태로 명세를 동결하는 대신 지속해서 유지 관리하고, 플랫폼 발전에 필요한 새 기능을 추가하면서 HTML 현행 표준 작업을 계속하기를 원했다.
2019년 WHATWG와 W3C는 앞으로 단일 HTML 버전, 즉 이 문서를 공동으로 개발하기로 합의했다.
이 절은 비규범적이다.
HTML의 여러 측면이 처음 보기에는 터무니없고 일관성이 없는 것처럼 보인다는 사실을 인정해야 한다.
HTML과 이를 지원하는 DOM API, 그리고 여러 관련 기술은 수십 년에 걸쳐 서로 다른 우선순위를 지닌 매우 다양한 사람들에 의해 개발되었으며, 이들은 많은 경우 서로의 존재조차 알지 못했다.
따라서 기능은 여러 출처에서 생겨났으며 항상 특별히 일관된 방식으로 설계된 것은 아니다. 더욱이 웹의 고유한 특성 때문에 구현 버그는 콘텐츠가 수정되기 전에 의도치 않게 해당 버그에 의존하도록 작성되는 경우가 많아, 사실상의 표준이 된 뒤 이제는 공식적인 표준이 되기도 했다.
그럼에도 특정 설계 목표를 준수하기 위한 노력이 이루어졌다. 이러한 목표는 다음 몇 개의 하위 절에서 설명한다.
이 절은 비규범적이다.
웹 작성자가 멀티스레딩의 복잡성에 노출되지 않도록 HTML 및 DOM API는 어떤 스크립트도 다른 스크립트의 동시 실행을 감지할 수 없도록 설계되었다. 워커를 사용하는 경우에도 구현의 동작은 모든 전역에서 모든 스크립트 실행을 완전히 직렬화하는 것으로 생각할 수 있도록 하는 것이 목적이다.
이 일반적인 설계 원칙의 예외는 JavaScript SharedArrayBuffer
클래스이다. SharedArrayBuffer
객체를 사용하면 다른 에이전트의 스크립트가 동시에 실행되고 있음을 실제로 관찰할 수 있다.
또한 JavaScript 메모리 모델로 인해 직렬화된 스크립트 실행으로 표현할 수 없을
뿐만 아니라, 해당 스크립트 간의 직렬화된 문 실행으로도 표현할 수 없는
상황이 존재한다.
이 절은 비규범적이다.
HTML에는 의미론을 안전하게 추가하는 데 사용할 수 있는 다양한 확장 메커니즘이 있다.
작성자는 class 속성을 사용하여
요소를 확장할 수 있다. 가장 적합한 기존의 "실제" HTML 요소를 사용하면서
사실상 자체 요소를 만드는 방식이므로, 확장을 알지 못하는 브라우저와 다른 도구도
어느 정도 해당 요소를 지원할 수 있다. 예를 들어 마이크로포맷이 이 방식을 사용한다.
작성자는 인라인 클라이언트 측 스크립트나 서버 측 사이트 전체 스크립트가
처리할 데이터를 data-*=""
속성을 사용하여 포함할 수 있다. 브라우저는 이러한 속성을 절대로
변경하지 않으며, 스크립트는 나중에 찾아서 처리할 데이터를 HTML 요소에
포함할 수 있다.
작성자는 <meta name="" content="">
메커니즘을 사용하여
페이지 전체 메타데이터를 포함할 수 있다.
작성자는 rel=""
메커니즘을 사용하여 미리 정의된 링크 유형 집합에 대한
확장을 등록하고 링크에 특정 의미를 부여할 수 있다. 마이크로포맷도
이 방식을 사용한다.
작성자는 사용자 정의 유형과 함께 <script type="">
메커니즘을 사용하여 원시 데이터를 임베드하고, 나중에 인라인 또는 서버 측
스크립트가 처리하도록 할 수 있다.
작성자는 JavaScript 프로토타이핑 메커니즘을 사용하여 API를 확장할 수 있다. 예를 들어 이 방식은 스크립트 라이브러리에서 널리 사용된다.
작성자는 마이크로데이터 기능(itemscope="" 및
itemprop=""
속성)을 사용하여 다른 애플리케이션 및 사이트와 공유할 중첩된 이름-값 데이터 쌍을
임베드할 수 있다.
작성자는 HTML 어휘를 확장하기 위해 사용자 정의 요소를 정의하고 공유하고 사용할 수 있다. 유효한 사용자 정의 요소 이름의 요구 사항은 향후 호환성을 보장한다. 앞으로 HTML, SVG 또는 MathML에 하이픈을 포함하는 로컬 이름의 요소가 추가되지 않기 때문이다.
이 절은 비규범적이다.
이 명세는 문서와 애플리케이션을 기술하기 위한 추상 언어와, 이 언어를 사용하는 리소스의 메모리 내 표현과 상호작용하기 위한 일부 API를 정의한다.
메모리 내 표현은 "DOM HTML" 또는 줄여서 "DOM"이라고 한다.
이 추상 언어를 사용하는 리소스를 전송하는 데 사용할 수 있는 다양한 구체적인 구문이 있으며, 그중 두 가지를 이 명세에서 정의한다.
첫 번째 구체적인 구문은 HTML 구문이다. 대부분의 작성자에게 권장되는 형식이며,
대다수의 레거시 웹 브라우저와 호환된다. 문서가 text/html MIME
유형으로
전송되면 웹 브라우저는 해당 문서를 HTML 문서로
처리한다. 이 명세는 단순히 "HTML"이라고 하는 최신 HTML 구문을 정의한다.
두 번째 구체적인 구문은 XML이다. 문서가 XML MIME
유형, 예를 들어 application/xhtml+xml로
전송되면 웹 브라우저는 해당 문서를 XML 문서로 취급하고 XML 프로세서로
파싱한다. 작성자는 XML과 HTML의 처리 방식이 다르다는 점에 유의해야 한다.
특히 XML로 표시된 문서는 사소한 구문 오류만 있어도 완전히 렌더링되지 않지만,
HTML 구문에서는 그러한 오류가 무시된다.
HTML의 XML 구문은 이전에 "XHTML"이라고 불렸지만, 이 명세에서는 해당 용어를 사용하지 않는다. 그 이유 중 하나는 MathML 및 SVG의 HTML 구문에도 그러한 용어가 사용되지 않기 때문이다.
DOM, HTML 구문 및 XML 구문이 모두 동일한 콘텐츠를 표현할 수 있는 것은 아니다.
예를 들어 네임스페이스는 HTML 구문으로 표현할 수 없지만 DOM과 XML 구문에서는
지원된다. 마찬가지로 noscript 기능을
사용하는
문서는 HTML 구문으로 표현할 수 있지만 DOM이나 XML 구문으로는 표현할 수 없다.
문자열 "-->"를 포함하는 주석은
DOM에서만 표현할 수 있고 HTML 및 XML 구문에서는 표현할 수 없다.
이 절은 비규범적이다.
이 명세는 다음과 같은 주요 절로 나뉜다.
EventSource로 알려진
서버 푸시 이벤트 스트림 메커니즘과 Web Sockets으로 알려진
스크립트용 양방향 전이중 소켓 프로토콜을 소개한다.
또한 폐기된 기능과 IANA 고려 사항을 나열하는 부록과 여러 색인이 있다.
이 명세는 다른 모든 명세와 같은 방식으로 읽어야 한다. 먼저 처음부터 끝까지 여러 번 읽어야 한다. 그런 다음 적어도 한 번은 역순으로 읽어야 한다. 그다음에는 목차에서 임의의 절을 선택하고 모든 상호 참조를 따라가며 읽어야 한다.
아래 적합성 요구 사항 절에서 설명하는 것처럼 이 명세는 여러 적합성 클래스에 대한 적합성 기준을 설명한다. 특히 작성자와 작성자가 만드는 문서 등의 생산자에 적용되는 적합성 요구 사항과 웹 브라우저 등의 소비자에 적용되는 적합성 요구 사항이 있다. 요구하는 내용으로 둘을 구분할 수 있다. 생산자에 대한 요구 사항은 허용되는 내용을 명시하고, 소비자에 대한 요구 사항은 소프트웨어가 어떻게 동작해야 하는지를 명시한다.
예를 들어 "foo 속성의 값은 유효한
정수여야 한다"는 허용되는 값을 규정하므로 생산자에 대한 요구 사항이다.
반면 "foo 속성의 값은
정수
파싱 규칙을 사용하여 파싱해야 한다"는 콘텐츠를 처리하는 방법을 설명하므로
소비자에 대한 요구 사항이다.
생산자에 대한 요구 사항은 소비자와 전혀 관계가 없다.
위의 예를 계속해서 살펴보면, 특정 속성의 값이 유효한 정수로 제한된다는 요구 사항은 소비자에 대한 요구 사항을 어떤 식으로도 암시하지 않는다. 실제로 소비자는 값이 요구 사항을 준수하는지와 완전히 무관하게 해당 속성을 불투명한 문자열로 처리해야 할 수도 있다. 또는 앞의 예와 같이 유효하지 않은 값(이 경우 숫자가 아닌 값)을 처리하는 방식을 정의한 특정 규칙을 사용하여 값을 파싱해야 할 수도 있다.
이것은 정의, 요구 사항 또는 설명이다.
이것은 참고 사항이다.
이것은 예시이다.
이것은 미해결 이슈이다.
이것은 경고이다.
[Exposed =Window ]
interface Example {
// this is an IDL definition
};
variable = object.method([optionalArgument])
이것은 인터페이스의 사용법을 설명하는 작성자용 참고 사항이다.
/* this is a CSS fragment */
용어를 정의하는 위치는 this와 같이 표시한다. 해당 용어의 사용은 this 또는 this와 같이 표시한다.
요소, 속성 또는 API를 정의하는 위치는 this와 같이 표시한다.
해당 요소, 속성 또는 API에 대한 참조는
this와 같이 표시한다.
그 밖의 코드 조각은 like this와 같이 표시한다.
변수는 this와 같이 표시한다.
알고리즘에서 동기 절의 단계에는 ⌛ 표시가 붙는다.
일부 경우에는 조건과 그에 대응하는 요구 사항을 목록 형식으로 제시한다. 이러한 경우 한 조건에 적용되는 요구 사항은 해당 조건 뒤에 나오는 첫 번째 요구 사항 집합이며, 그 요구 사항에 여러 조건 집합이 있는 경우에도 마찬가지이다. 이러한 경우는 다음과 같이 표시한다.
이 절은 비규범적이다.
기본적인 HTML 문서는 다음과 같다.
<!DOCTYPE html>
< html lang = "en" >
< head >
< title > Sample page</ title >
</ head >
< body >
< h1 > Sample page</ h1 >
< p > This is a < a href = "demo.html" > simple</ a > sample.</ p >
<!-- this is a comment -->
</ body >
</ html >
HTML 문서는 요소와 텍스트의 트리로 구성된다. 각 요소는 소스에서
"<body>"와 같은 시작
태그와
"</body>"와 같은 종료
태그로 표시된다.
특정 시작 태그와 종료 태그는 일부 경우 생략할
수 있으며 다른 태그에 의해 암시된다.
태그는 요소가 서로 겹치지 않고 각 요소가 다른 요소 안에 완전히 포함되도록 중첩해야 한다.
< p > This is < em > very < strong > wrong</ em > !</ strong ></ p >
< p > This < em > is < strong > correct</ strong > .</ em ></ p >
이 명세는 HTML에서 사용할 수 있는 요소 집합과 요소를 중첩할 수 있는 방식에 관한 규칙을 정의한다.
요소에는 요소의 동작 방식을 제어하는 속성이 있을 수 있다. 아래 예에는
a 요소와
그 href 속성을 사용하여 구성한
하이퍼링크가 있다.
< a href = "demo.html" > simple</ a >
속성은 시작 태그 안에
배치되며 "=" 문자로 구분되는
이름과 값으로 구성된다.
속성 값에 ASCII
공백이나 " ' ` = < 또는
>가 포함되지 않으면 따옴표 없이 둘 수 있다.
그렇지 않으면 작은따옴표나 큰따옴표를 사용해야 한다. 값이 빈 문자열이면
값과 "=" 문자를 모두
생략할 수 있다.
<!-- empty attributes -->
< input name = address disabled >
< input name = address disabled = "" >
<!-- attributes with a value -->
< input name = address maxlength = 200 >
< input name = address maxlength = '200' >
< input name = address maxlength = "200" >
그런 다음 HTML 사용자 에이전트(예: 웹 브라우저)는 이 마크업을 파싱하여 DOM(Document Object Model) 트리로 변환한다. DOM 트리는 문서의 메모리 내 표현이다.
DOM 트리에는 여러 종류의 노드가 포함된다. 특히 DocumentType
노드,
Element
노드, Text
노드, Comment
노드, 그리고 일부 경우에는
ProcessingInstruction
노드가 포함된다.
이 절의 맨 위에 있는 마크업 조각은 다음 DOM 트리로 변환된다.
이 트리의 문서 요소는
html
요소이며, HTML 문서의 해당 위치에는 항상 이 요소가 있다. 이 요소에는 두 요소,
즉 head와 body가 있고,
그 사이에 Text
노드가 있다.
DOM 트리에는 처음 예상할 수 있는 것보다 훨씬 많은 Text
노드가 있다. 소스에 여러 공백(여기서는 "␣"로 표시)과 줄 바꿈
("⏎"로 표시)이 있으며, 이들이 모두 DOM에서 Text
노드가 되기 때문이다. 그러나 역사적인
이유로 원래 마크업의 모든 공백과 줄 바꿈이 DOM에 나타나는 것은 아니다.
특히 head 시작 태그 앞의 모든 공백은 조용히
제거되고, body 종료 태그 뒤의 모든 공백은
body 끝에 배치된다.
head 요소에는 title
요소가 있으며, 이 요소 자체에는 "Sample page"라는 텍스트의
Text
노드가 있다. 마찬가지로 body
요소에는
h1
요소, p 요소,
그리고 주석이 있다.
페이지의 스크립트에서 이 DOM 트리를 조작할 수 있다. 일반적으로 JavaScript로
작성하는 스크립트는 script 요소나 이벤트
처리기 콘텐츠 속성을 사용하여 임베드할 수 있는 작은 프로그램이다. 예를 들어
다음은 폼의 output 요소 값을 "Hello World"로 설정하는
스크립트가 있는 폼이다.
< form name = "main" >
Result: < output name = "result" ></ output >
< script >
document. forms. main. elements. result. value = 'Hello World' ;
</ script >
</ form >
DOM 트리의 각 요소는 객체로 표현되며, 이러한 객체에는 조작할 수 있는 API가
있다. 예를 들어 링크(위 트리의 a 요소
등)의
"href" 속성은 여러
방식으로 변경할 수 있다.
var a = document. links[ 0 ]; // obtain the first link in the document
a. href = 'sample.html' ; // change the destination URL of the link
a. protocol = 'https' ; // change just the scheme part of the URL
a. setAttribute( 'href' , 'https://example.com/' ); // change the content attribute directly
DOM 트리는 구현, 특히 웹 브라우저와 같은 대화형 구현이 HTML 문서를 처리하고 표시할 때 문서를 표현하는 방식으로 사용되므로, 이 명세는 대체로 위에서 설명한 마크업 대신 DOM 트리를 기준으로 서술한다.
HTML 문서는 대화형 콘텐츠를 미디어에 독립적으로 기술한다. HTML 문서는 화면이나 음성 합성기 또는 점자 디스플레이를 통해 렌더링될 수 있다. 작성자는 이러한 렌더링이 이루어지는 정확한 방식에 영향을 주기 위해 CSS와 같은 스타일 언어를 사용할 수 있다.
다음 예에서는 CSS를 사용하여 페이지를 파란색 바탕의 노란색 글자로 만들었다.
<!DOCTYPE html>
< html lang = "en" >
< head >
< title > Sample styled page</ title >
< style >
body { background : navy ; color : yellow ; }
</ style >
</ head >
< body >
< h1 > Sample styled page</ h1 >
< p > This page is just a demo.</ p >
</ body >
</ html >
HTML을 사용하는 방법에 관한 자세한 내용은 튜토리얼과 지침을 참고하는 것이 권장된다. 이 명세에 포함된 일부 예시도 유용할 수 있지만, 이 명세는 필연적으로 처음에는 이해하기 어려울 수 있는 수준의 세부 사항으로 언어를 정의하므로 초보 작성자는 주의해야 한다.
이 절은 비규범적이다.
HTML을 사용하여 대화형 사이트를 만들 때는 공격자가 사이트 자체 또는 사이트 사용자의 무결성을 손상할 수 있는 취약점이 생기지 않도록 주의해야 한다.
이 문제를 포괄적으로 다루는 것은 이 문서의 범위를 벗어나며, 작성자는 이 문제를 더 자세히 학습하는 것이 강력히 권장된다. 다만 이 절에서는 HTML 애플리케이션 개발에서 흔히 발생하는 일부 함정을 간략하게 소개한다.
웹의 보안 모델은 "출처"라는 개념을 기반으로 하므로, 웹에서 발생할 수 있는 여러 공격은 교차 출처 작업과 관련되어 있다. [ORIGIN]
텍스트 댓글과 같은 사용자 생성 콘텐츠, URL 매개변수의 값, 제3자 사이트에서 받은 메시지 등 신뢰할 수 없는 입력을 받을 때는 데이터를 사용하기 전에 반드시 검증하고, 표시할 때 적절히 이스케이프해야 한다. 그렇게 하지 않으면 악의적인 사용자가 음수 나이와 같은 허위 사용자 정보를 제공하는 비교적 가벼운 공격부터, 사용자가 해당 정보가 포함된 페이지를 볼 때마다 스크립트를 실행하여 공격이 확산될 수도 있는 심각한 공격, 그리고 서버의 모든 데이터를 삭제하는 재앙적인 공격까지 다양한 공격을 수행할 수 있다.
사용자 입력을 검증하는 필터를 작성할 때는 알려진 안전한 구문만 허용하고 다른 모든 입력을 허용하지 않는 허용 목록 기반 필터를 사용해야 한다. 알려진 악성 입력만 차단하고 나머지는 모두 허용하는 차단 목록 기반 필터는 안전하지 않다. 악성인 모든 것이 아직 알려져 있는 것은 아니며, 예를 들어 미래에 새로 만들어질 수도 있기 때문이다.
예를 들어 페이지가 URL의 쿼리 문자열을 확인하여 표시할 내용을 결정하고, 사이트가 메시지를 표시하기 위해 사용자를 해당 페이지로 리디렉션한다고 가정해 보자.
< ul >
< li >< a href = "message.cgi?say=Hello" > Say Hello</ a >
< li >< a href = "message.cgi?say=Welcome" > Say Welcome</ a >
< li >< a href = "message.cgi?say=Kittens" > Say Kittens</ a >
</ ul >
메시지를 이스케이프하지 않고 사용자에게 그대로 표시하면 악의적인 공격자는 스크립트 요소가 포함된 URL을 만들 수 있다.
https://example.com/message.cgi?say=%3Cscript%3Ealert%28%27Oh%20no%21%27%29%3C/script%3E
공격자가 피해 사용자를 설득하여 이 페이지를 방문하게 하면 공격자가 선택한 스크립트가 페이지에서 실행된다. 이러한 스크립트는 사이트가 제공하는 기능의 범위 안에서 얼마든지 악의적인 작업을 수행할 수 있다. 예를 들어 사이트가 전자상거래 상점이라면 사용자가 모르는 사이에 원하지 않는 구매를 임의의 횟수만큼 하도록 만들 수 있다.
이를 교차 사이트 스크립팅 공격이라고 한다.
사이트가 코드를 실행하도록 속이는 데 사용할 수 있는 구문은 많다. 다음은 작성자가 허용 목록 필터를 작성할 때 고려하는 것이 권장되는 몇 가지 사항이다.
img처럼 무해해 보이는 요소를 허용할 때는 제공되는
속성도 허용 목록에 포함하는 것이 중요하다. 모든 속성을 허용하면 공격자가
예를 들어 onload 속성을 사용하여 임의의
스크립트를 실행할 수 있다.javascript:"이지만,
사용자 에이전트는 다른 스킴도 구현할 수 있으며 실제로 역사적으로
구현해 왔다.base 요소의 삽입을 허용하면 상대 링크가 있는
페이지의 모든 script 요소를 가로챌 수 있으며,
폼 제출도 마찬가지로 악의적인 사이트로 리디렉션될 수 있다.사이트가 사용자 이름으로 포럼에 메시지를 게시하거나, 구매하거나, 여권을 신청하는 등 사용자별 부작용이 있는 폼 제출을 허용하는 경우, 다른 사이트가 사용자를 속여 모르는 사이에 요청하게 한 것이 아니라 사용자가 의도적으로 요청했는지 확인하는 것이 중요하다.
이 문제는 HTML 폼을 다른 출처로 제출할 수 있기 때문에 발생한다.
사이트는 폼에 사용자별 숨겨진 토큰을 넣거나 모든 요청의 `Origin`
헤더를 검사하여 이러한 공격을 방지할 수 있다.
사용자가 원하지 않을 수 있는 작업을 수행하는 인터페이스를 제공하는 페이지는 사용자가 속아서 인터페이스를 활성화할 가능성을 피하도록 설계해야 한다.
사용자를 속이는 한 가지 방법은 악의적인 사이트가 피해 사이트를 작은
iframe에 넣은 다음, 예를 들어 반응 속도 게임을
시켜 사용자가 클릭하도록 유도하는 것이다. 사용자가 게임을 시작하면 악의적인
사이트는 사용자가 클릭하려는 순간 iframe을 마우스 커서 아래로 빠르게 옮겨
피해 사이트의 인터페이스를 클릭하도록 속일 수 있다.
이를 방지하기 위해 프레임 안에서 사용될 것으로 예상하지 않는 사이트는
프레임 안에 있지 않음을 감지했을 때만 인터페이스를 활성화하는 것이 권장된다.
예를 들어 window 객체를 top
속성의 값과 비교할 수 있다.
이 절은 비규범적이다.
HTML의 스크립트에는 "완료될 때까지 실행" 의미론이 있다. 즉 브라우저는 일반적으로 추가 이벤트를 발생시키거나 문서 파싱을 계속하는 등 다른 작업을 하기 전에 스크립트를 중단하지 않고 끝까지 실행한다.
반면 HTML 파일의 파싱은 점진적으로 이루어지므로 파서는 어느 시점에서든 일시 중지하고 스크립트를 실행할 수 있다. 이는 일반적으로 좋은 동작이지만, 이벤트가 이미 발생했을 가능성이 있는 뒤에 이벤트 처리기를 연결하지 않도록 작성자가 주의해야 함을 의미한다.
이를 안정적으로 수행하는 두 가지 기법이 있다. 이벤트 처리기 콘텐츠 속성을 사용하거나, 동일한 스크립트에서 요소를 만들고 이벤트 처리기를 추가하는 것이다. 앞서 언급했듯이 추가 이벤트가 발생하기 전에 스크립트는 완료될 때까지 실행되므로 후자의 방식은 안전하다.
이 문제가 나타날 수 있는 한 가지 사례는 img
요소와 load
이벤트이다. 특히 이미지가 이미 캐시되어 있다면(흔한 경우이다) 요소를
파싱하는 즉시 이벤트가 발생할 수 있다.
여기서 작성자는 img
요소의 onload
처리기를 사용하여 load
이벤트를 포착한다.
< img src = "games.png" alt = "Games" onload = "gamesLogoHasLoaded(event)" >
스크립트가 요소를 추가하는 경우에는 동일한 스크립트에서 이벤트 처리기를 추가하기만 하면 이벤트를 놓치지 않는다.
< script >
var img = new Image();
img. src = 'games.png' ;
img. alt = 'Games' ;
img. onload = gamesLogoHasLoaded;
// img.addEventListener('load', gamesLogoHasLoaded, false); // would work also
</ script >
그러나 작성자가 먼저 img
요소를 만든 다음 별도의 스크립트에서 이벤트 리스너를 추가한다면, 그 사이에
load 이벤트가 발생하여 놓칠 가능성이 있다.
<!-- Do not use this style, it has a race condition! -->
< img id = "games" src = "games.png" alt = "Games" >
<!-- the 'load' event might fire here while the parser is taking a
break, in which case you will not see it! -->
< script >
var img = document. getElementById( 'games' );
img. onload = gamesLogoHasLoaded; // might never fire!
</ script >
이 절은 비규범적이다.
작성자는 흔한 오류를 찾기 위해 적합성 검사기(유효성 검사기라고도 함)를 사용하는 것이 권장된다. WHATWG는 이러한 도구 목록을 다음에서 관리한다. https://whatwg.org/validator/
이 절은 비규범적이다.
이전 버전의 HTML 명세와 달리 이 명세는 유효한 문서뿐만 아니라 유효하지 않은 문서에 필요한 처리 방식도 어느 정도 상세하게 정의한다.
그러나 유효하지 않은 콘텐츠의 처리 방식이 대부분 명확하게 정의되어 있더라도, 문서에 대한 적합성 요구 사항은 여전히 중요하다. 실제로 상호 운용성, 즉 모든 구현이 특정 콘텐츠를 신뢰할 수 있고 동일하거나 동등한 방식으로 처리하는 상황만이 문서 적합성 요구 사항의 유일한 목표는 아니다. 이 절에서는 적합한 문서와 오류가 있는 문서를 계속 구분하는 보다 일반적인 이유 몇 가지를 자세히 설명한다.
이 절은 비규범적이다.
이전 HTML 버전의 표현 기능 대부분은 더 이상 허용되지 않는다. 일반적으로 표현용 마크업에는 여러 문제가 있는 것으로 밝혀졌다.
보조 기술(AT) 사용자에게 적절한 경험을 제공하도록 표현용 마크업을 사용하는 것은 가능하지만(예: ARIA 사용), 의미론적으로 적합한 마크업을 사용할 때보다 훨씬 어렵다. 더욱이 이러한 기법을 사용해도 텍스트 모드 브라우저 사용자와 같이 AT를 사용하지 않는 비그래픽 사용자가 페이지에 접근할 수 있도록 하는 데는 도움이 되지 않는다.
반면 미디어에 독립적인 마크업을 사용하면 더 많은 사용자(예: 텍스트 브라우저 사용자)가 사용할 수 있는 방식으로 문서를 쉽게 작성할 수 있다.
마크업이 스타일에 독립적이도록 작성된 사이트는 훨씬 쉽게 유지 관리할 수 있다.
예를 들어 전체 사이트에서 <font color="">를 사용하는 사이트의
색상을 변경하려면 사이트 전체를 수정해야 하지만, CSS 기반 사이트에서
동일한 변경은 파일 하나만 변경하면 된다.
표현용 마크업은 훨씬 더 중복되는 경향이 있으므로 문서 크기가 더 커진다.
이러한 이유로 이 버전의 HTML에서는 표현용 마크업을 제거했다. 이러한 변경은 놀라운 일이 아니다. HTML4는 오래전에 표현용 마크업을 폐기 예정으로 지정했고, 작성자가 표현용 마크업에서 벗어나는 데 도움이 되도록 HTML4 Transitional 모드를 제공했으며, 이후 XHTML 1.1은 더 나아가 이러한 기능을 완전히 폐기했다.
HTML에 남아 있는 표현용 마크업 기능은 style 속성과
style 요소뿐이다.
style 속성을 프로덕션
환경에서 사용하는 것은 다소 권장되지 않지만, 신속한 프로토타이핑을 할 때
유용할 수 있다. 이 경우 나중에 규칙을 별도의 스타일시트로 직접 옮길 수 있다.
또한 별도의 스타일시트가 불편한 특수한 경우 특정 스타일을 제공하는 데도 유용하다.
마찬가지로 style 요소는 배급 콘텐츠나 페이지별 스타일에
유용할 수 있지만, 일반적으로 스타일이 여러 페이지에 적용된다면 외부 스타일시트가
더 편리할 가능성이 높다.
이전에 표현용이었던 일부 요소가 이 명세에서 미디어에 독립적인 의미를 갖도록
다시 정의되었다는 점도 주목할 필요가 있다. 해당 요소는 b, i,
hr, s, small 및 u이다.
이 절은 비규범적이다.
HTML 구문에는 매우 다양한 문제를 피하기 위한 제약이 있다.
일부 유효하지 않은 구문 구조는 파싱했을 때 매우 직관적이지 않은 DOM 트리를 생성한다.
사용자 에이전트가 더 기이하고 복잡한 오류 처리 규칙을 구현하지 않고도 제어된 환경에서 사용될 수 있도록, 사용자 에이전트는 파싱 오류를 만날 때마다 실패하는 것이 허용된다.
위에서 언급한 <table><hr>... 예의 동작과 같은 일부 오류 처리 동작은
상태를 저장하지 않고 HTML 파일을 한 번에 처리하는 스트리밍 사용자 에이전트와
호환되지 않는다. 이러한 사용자 에이전트와의 상호 운용성 문제를 피하기 위해
해당 동작을 일으키는 모든 구문은 유효하지 않은 것으로 간주한다.
XML 기반 사용자 에이전트가 HTML 파서에 연결되면 요소나 속성 이름에 여러 개의 콜론이 들어가지 않는다는 것과 같은 XML의 특정 불변 조건이 HTML 파일에 의해 위반될 수 있다. 이를 처리하려면 파서가 HTML DOM을 XML 호환 정보 집합으로 강제 변환해야 할 수 있다. 이러한 처리가 필요한 대부분의 구문 구조는 유효하지 않은 것으로 간주한다. 연속된 하이픈 두 개를 포함하거나 하이픈으로 끝나는 주석은 HTML 구문에서 허용되는 예외이다.
일부 구문 구조는 지나치게 낮은 성능을 초래할 수 있다. 이러한 구조의 사용을 억제하기 위해 일반적으로 부적합한 것으로 지정한다.
예를 들어 다음 마크업은 닫히지 않은 모든 i 요소를 각
문단에서
다시 구성해야 하므로 성능이 저하되며, 각 문단의 요소 수가 점차
증가한다.
< p >< i > She dreamt.
< p >< i > She dreamt that she ate breakfast.
< p >< i > Then lunch.
< p >< i > And finally dinner.
이 조각에서 생성되는 DOM은 다음과 같다.
역사적인 이유로 비교적 취약한 구문 구조가 있다. 사용자가 실수로 이러한 문제를 겪는 경우를 줄이기 위해 해당 구조는 부적합한 것으로 지정된다.
예를 들어 속성의 일부 명명된 문자 참조는 끝 세미콜론을 생략해도 파싱된다. 명명된 문자 참조를 구성하지 않는 문자가 앰퍼샌드 뒤에 오는 것은 안전하지만, 해당 문자가 명명된 문자 참조를 구성하는 문자열로 바뀌면 그 문자 자체로 해석된다.
이 조각에서 속성 값은 "?bill&ted"이다.
< a href = "?bill&ted" > Bill and Ted</ a >
그러나 다음 조각에서 속성 값은 의도한 "?art©"가 아니라
실제로 "?art©"이다. 끝 세미콜론이 없어도 "©"가
"©"와 동일하게 처리되므로 "©"로 해석되기 때문이다.
< a href = "?art©" > Art and Copy</ a >
이 문제를 피하기 위해 모든 명명된 문자 참조는 세미콜론으로 끝나야 하며, 세미콜론이 없는 명명된 문자 참조의 사용은 오류로 표시된다.
따라서 위 사례를 올바르게 표현하는 방법은 다음과 같다.
< a href = "?bill&ted" > Bill and Ted</ a > <!-- &ted is ok, since it's not a named character reference -->
< a href = "?art&copy" > Art and Copy</ a > <!-- the & has to be escaped, since © is a named character reference -->
일부 구문 구조는 레거시 사용자 에이전트에서 특히 미묘하거나 심각한 문제를 일으키는 것으로 알려져 있으므로, 작성자가 이를 피할 수 있도록 부적합한 것으로 표시된다.
예를 들어 이러한 이유로 U+0060 GRAVE ACCENT 문자(`)는 따옴표 없는 속성에서 허용되지 않는다. 일부 레거시 사용자 에이전트에서는 이 문자를 따옴표 문자로 처리하기도 한다.
일부 제한은 알려진 보안 문제를 피하기 위해서만 존재한다.
예를 들어 UTF-7 사용 제한은 작성자가 UTF-7을 사용하는 알려진 교차 사이트 스크립팅 공격의 피해를 입지 않도록 하기 위해서만 존재한다. [UTF7]
작성자의 의도가 매우 불분명한 마크업은 흔히 부적합한 것으로 지정된다. 이러한 오류를 일찍 수정하면 이후의 유지 관리가 쉬워진다.
사용자가 단순한 오타를 냈을 때 오류를 조기에 발견할 수 있으면 작성자의 디버깅 시간을 크게 줄일 수 있다. 따라서 이 명세에서는 일반적으로 이 명세에 정의된 이름과 일치하지 않는 요소 이름, 속성 이름 등을 사용하는 것을 오류로 간주한다.
예를 들어 작성자가 <caption> 대신 <capton>을 입력하면
오류로 표시되어 작성자가 즉시 오타를
수정할 수 있다.
향후 언어 구문을 확장할 수 있도록, 그 밖에는 무해한 특정 기능이 허용되지 않는다.
예를 들어 현재 종료 태그의 "속성"은 무시되지만 유효하지 않다. 향후 언어가 이미 배포된 유효한 콘텐츠와 충돌하지 않고 해당 구문 기능을 사용하도록 변경될 가능성을 남겨 두기 위한 것이다.
일부 작성자는 HTML 구문의 유연성을 활용해 얻는 작은 간결성의 이점보다 이러한 관습에서 얻는 일관성을 선호하여, 모든 속성을 항상 따옴표로 감싸고 선택적 태그를 항상 포함하는 습관이 유용하다고 생각한다. 이러한 작성자를 돕기 위해 적합성 검사기는 해당 관습을 강제하는 동작 모드를 제공할 수 있다.
이 절은 비규범적이다.
언어 구문 외에도 이 명세는 요소와 속성을 지정할 수 있는 방식에 제한을 둔다. 이러한 제한도 비슷한 이유로 존재한다.
정의된 의미가 있는 요소의 오용을 피하기 위해, 의심스러운 가치를 지닌 방식으로 요소가 중첩되는 것을 제한하는 콘텐츠 모델을 정의한다.
예를 들어 이 명세에서는 section
요소를 kbd
요소 안에 중첩하는 것을 허용하지 않는다. 작성자가 전체 구획을 키보드로
입력해야 한다는 의미를 나타내려 할 가능성이 매우 낮기 때문이다.
마찬가지로 요소 사용상의 실수를 작성자가 알아차리도록 하기 위해, 표현된 의미의 명확한 모순도 적합성 오류로 간주한다.
예를 들어 아래 조각의 의미는 모순된다. 구분자는 동시에 셀이 될 수 없으며, 라디오 버튼은 진행률 표시줄이 될 수 없다.
< hr role = "cell" >
< input type = radio role = progressbar >
또 다른 예는 ul
요소의 콘텐츠 모델에 대한 제한이다. 이 요소는 li
요소 자식만 허용한다. 목록은 정의상 0개 이상의 목록 항목으로만
구성되므로, ul
요소에 li
요소 이외의 것이 포함되어 있다면 무엇을 의도했는지 불분명하다.
일부 요소에는 특정 조합이 혼란을 일으킬 가능성을 높이는 기본 스타일이나 동작이 있다. 이러한 문제가 없으면서 동등한 대안이 있다면 혼란스러운 조합은 허용되지 않는다.
예를 들어 div
요소는 블록
상자로 렌더링되고, span
요소는 인라인
상자로 렌더링된다. 블록 상자를
인라인 상자 안에
넣는 것은 불필요하게 혼란스럽다. div
요소만 중첩하거나, span
요소만 중첩하거나, div
요소 안에 span
요소를 중첩하는 것은 모두 span
요소 안에 div
요소를 중첩하는 것과 동일한 목적을 달성한다. 그러나 마지막 조합만
인라인 상자 안에
블록 상자를
포함하므로 마지막 조합은 허용되지 않는다.
또 다른 예는 대화형 콘텐츠를
중첩할 수 없는 방식이다. 예를 들어 button
요소에는 textarea
요소를 포함할 수 없다. 이러한 대화형 요소 중첩의 기본 동작이 사용자에게
매우 혼란스러울 수 있기 때문이다. 이러한 요소는 중첩하지 않고 나란히
배치할 수 있다.
어떤 것을 허용하면 작성자에게 혼란을 일으킬 가능성이 있기 때문에 허용되지 않는 경우도 있다.
예를 들어 disabled
속성을 "false" 값으로 설정하는 것은 허용되지 않는다. 겉보기에는
요소가 활성화된다는 의미처럼 보이지만, 실제로는 요소가
비활성화된다는 의미이기 때문이다. 구현에 중요한 것은 속성의 값이
아니라 속성의 존재 여부이다.
일부 적합성 오류는 작성자가 배워야 하는 언어를 단순화한다.
예를 들어 area
요소의 shape
속성은 실제로 circ와
circle
값을 동의어로 모두 받아들이지만, 튜토리얼과 다른 학습 자료를 단순화하기 위해
circ
값의 사용은 허용하지 않는다. 둘 다 허용해도 이점은 없지만 언어를 가르칠 때
추가적인 혼란을 일으킬 수 있다.
일부 요소는 일반적으로 역사적인 이유로 다소 특이한 방식으로 파싱되며, 해당 요소의 콘텐츠 모델 제한은 작성자가 이러한 문제에 노출되지 않도록 하기 위한 것이다.
일부 오류는 디버깅하기 어려운 스크립트 문제를 방지하는 데 도움을 주기 위한 것이다.
예를 들어 이러한 이유로 동일한 값을 지닌 id
속성을 두 개 사용하는 것은 부적합하다. 중복 ID로 인해 잘못된 요소가
선택될 수 있으며, 때로는 원인을 파악하기 어려운 심각한 결과를 초래할 수 있다.
일부 구문은 역사적으로 많은 작성 시간을 낭비하게 했기 때문에 허용되지 않으며, 작성자가 이를 피하도록 장려하면 향후 작업 시간을 절약할 수 있다.
예를 들어 script
요소의 src
속성이 있으면 요소의 콘텐츠가 무시된다. 그러나 이는 분명하지 않으며,
특히 요소의 콘텐츠가 실행 가능한 스크립트처럼 보이는 경우 작성자가 해당
인라인 스크립트가 실행되지 않는다는 사실을 깨닫지 못한 채 디버깅에 많은
시간을 소비할 수 있다. 이 문제를 줄이기 위해 이 명세에서는 src
속성이 있는 script
요소에 실행 가능한 스크립트를 포함하는 것을 부적합한 것으로 지정한다.
따라서 문서를 검증하는 작성자는 이러한 실수로 시간을 낭비할 가능성이 작다.
일부 작성자는 XML과 HTML 모두에서 비슷한 결과로 해석할 수 있는 파일을 작성하고 싶어 한다. 이 방식은 특히 스크립팅, 스타일링 또는 모든 종류의 자동 직렬화와 관련될 때 수많은 미묘한 복잡성이 있으므로 일반적으로 권장되지 않지만, 이 명세에는 최소한 이러한 어려움을 어느 정도 완화하기 위한 제한이 몇 가지 있다. 따라서 작성자가 HTML 구문과 XML 구문 사이를 이전할 때 이를 과도기적 단계로 사용하기가 더 쉬워진다.
예를 들어 lang 및
xml:lang
속성을 서로 동기화하기 위한 다소 복잡한 규칙이
존재한다.
또 다른 예는 HTML 직렬화의 xmlns 속성 값에 대한 제한이다.
이러한 제한은 적합한 문서의 요소가 HTML 또는 XML 중 어느 방식으로 처리되든
동일한 네임스페이스에 속하도록 하기 위한 것이다.
향후 언어 개정판에서 새 구문을 허용하기 위한 구문 제한과 마찬가지로, 요소의 콘텐츠 모델과 속성 값에 대한 일부 제한은 향후 HTML 어휘를 확장할 수 있도록 하기 위한 것이다.
예를 들어 U+005F LOW LINE 문자(_)로 시작하는 target
속성의 값을 특정한 미리 정의된 값으로만 제한하면, 향후 작성자가 정의한 값과
충돌하지 않고 새 미리 정의된 값을 도입할 수 있다.
일부 제한은 다른 명세에서 정한 제한을 지원하기 위한 것이다.
예를 들어 미디어 쿼리 목록을 받는 속성에 유효한 미디어 쿼리 목록만 사용하도록 요구하면 해당 명세의 적합성 규칙을 따르는 것이 중요하다는 점을 강화한다.
이 절은 비규범적이다.
다음 문서는 이 명세의 독자에게 유용할 수 있다.
이 아키텍처 명세는 Unicode 표준과 ISO/IEC 10646에서 공동으로 정의한 범용 문자 집합을 기반으로, 월드 와이드 웹에서 상호 운용 가능한 텍스트 조작을 위한 공통 참조를 명세 작성자, 소프트웨어 개발자 및 콘텐츠 개발자에게 제공한다. 다루는 주제로는 '문자', '인코딩' 및 '문자열'이라는 용어의 사용, 참조 처리 모델, 문자 인코딩의 선택과 식별, 문자 이스케이프 및 문자열 인덱싱이 포함된다.
Unicode에는 매우 많은 문자가 포함되어 있고 세계의 다양한 문자 체계를 포괄하므로, 잘못 사용하면 프로그램이나 시스템이 잠재적인 보안 공격에 노출될 수 있다. 점점 더 많은 제품이 국제화되고 있으므로 이는 특히 중요하다. 이 문서는 프로그래머, 시스템 분석가, 표준 개발자 및 사용자가 고려해야 할 일부 보안 고려 사항을 설명하고, 문제의 위험을 줄이기 위한 구체적인 권고 사항을 제공한다.
웹 콘텐츠 접근성 지침(WCAG)은 웹 콘텐츠의 접근성을 높이기 위한 광범위한 권고 사항을 다룬다. 이 지침을 따르면 전맹 및 저시력, 농 및 난청, 학습 장애, 인지적 제약, 제한된 운동 능력, 언어 장애, 광과민성 및 이러한 장애의 복합적인 조합을 포함하여 더 다양한 장애인이 콘텐츠에 접근할 수 있다. 또한 이 지침을 따르면 일반적으로 모든 사용자가 웹 콘텐츠를 더 쉽게 사용할 수 있다.
이 명세는 장애인이 더 쉽게 사용할 수 있는 웹 콘텐츠 저작 도구를 설계하기 위한 지침을 제공한다. 이 지침을 준수하는 저작 도구는 장애가 있는 작성자에게 접근 가능한 사용자 인터페이스를 제공할 뿐만 아니라, 모든 작성자가 접근 가능한 웹 콘텐츠를 제작할 수 있도록 지원하고 촉진함으로써 접근성을 향상한다.
이 문서는 장애인의 웹 접근성 장벽을 낮추는 사용자 에이전트를 설계하기 위한 지침을 제공한다. 사용자 에이전트에는 브라우저와 웹 콘텐츠를 가져와 렌더링하는 다른 유형의 소프트웨어가 포함된다. 이 지침을 준수하는 사용자 에이전트는 자체 사용자 인터페이스와 다른 기술, 특히 보조 기술과 통신하는 기능을 포함한 내부 기능을 통해 접근성을 향상한다. 또한 장애가 있는 사용자뿐만 아니라 모든 사용자가 적합한 사용자 에이전트를 더 쉽게 사용할 수 있어야 한다.
이 명세는 Infra에 의존한다. [INFRA]
이 명세에서는 HTML 및 XML 속성과 IDL 속성을 동일한 맥락에서 함께 언급하는 경우가 많다. 어느 것을 가리키는지 명확하지 않은 경우 HTML 및 XML 속성은 콘텐츠 속성이라고 하며, IDL 인터페이스에 정의된 속성은 IDL 속성이라고 한다. 마찬가지로 "프로퍼티"라는 용어는 JavaScript 객체 프로퍼티와 CSS 프로퍼티 모두에 사용된다. 의미가 모호한 경우에는 각각 객체 프로퍼티와 CSS 프로퍼티로 한정하여 표현한다.
일반적으로 명세에서 어떤 기능이 HTML 구문 또는 XML 구문에 적용된다고 명시하면, 다른 구문도 함께 포함한다. 기능이 두 언어 중 하나에만 특별히 적용되는 경우에는 "HTML의 경우, …(XML에는 적용되지 않음)"과 같이 다른 형식에는 적용되지 않는다고 명시적으로 밝힌다.
이 명세에서는 짧은 정적 문서부터 풍부한 멀티미디어가 포함된 긴 논문이나 보고서,
완전한 대화형 애플리케이션에 이르는 모든 HTML 사용을 가리키는 용어로
문서를 사용한다. 이 용어는 맥락에 따라 Document
객체와 그 자손 DOM 트리뿐만 아니라 HTML 구문 또는 XML 구문을 사용하는 직렬화된 바이트 스트림도
가리킨다.
DOM 구조의 맥락에서는 HTML
문서와 XML 문서라는 용어를
DOM에 정의된 의미로 사용하며, 특히 Document 객체가
놓일 수 있는 서로 다른 두 모드를 가리킨다. [DOM] (이와 같은 사용은 항상 해당
정의에 하이퍼링크되어 있다.)
바이트 스트림의 맥락에서 HTML 문서라는 용어는
text/html로 표시된 리소스를 가리키며,
XML 문서라는 용어는 XML
MIME 유형으로 표시된 리소스를 가리킨다.
간결성을 위해 문서가 사용자에게 렌더링되는 방식을 언급할 때 표시됨, 출력됨 및 보임과 같은 용어를 사용할 수 있다. 이러한 용어가 시각 매체를 의미하는 것은 아니며, 다른 매체에도 동등한 방식으로 적용되는 것으로 보아야 한다.
단계를 병렬로 실행한다는 것은 해당 단계를 하나씩 순서대로 실행하되, 표준의 다른 로직과 동시에 실행한다는 뜻이다(예: 이벤트 루프와 동시에 실행). 이 표준은 시분할 협력형 멀티태스킹, 파이버, 스레드, 프로세스, 서로 다른 하이퍼스레드, 코어, CPU, 시스템 등을 사용하는지 여부를 포함하여 이를 실현하는 정확한 메커니즘을 정의하지 않는다. 반면 즉시 실행해야 하는 작업은 현재 실행 중인 태스크를 중단하고 자신을 실행한 다음 이전에 실행 중이던 태스크를 재개해야 한다.
병렬 처리를 활용하는 명세 작성 지침은 다른 명세에서 이벤트 루프 다루기를 참조하라.
동일한 데이터를 처리하는 서로 다른 병렬 알고리즘 사이의 경쟁 상태를 피하기 위해 병렬 큐를 사용할 수 있다.
병렬 큐는 직렬로 실행해야 하는 알고리즘 단계의 큐를 나타낸다.
병렬 큐에는 처음에 비어 있는 알고리즘 큐(큐)가 있다.
병렬로 실행되는 단계는 자체적으로 다른 단계를 병렬로 실행할 수 있다. 예를 들어 병렬 큐 안에서 일련의 단계를 큐와 병렬로 실행하는 것이 유용할 수 있다.
어떤 표준이 nameList(리스트)와 nameList에 name을 추가하는 메서드를 정의했다고 가정하자. 단, nameList가 이미 name을 포함하는 경우에는 거부한다.
다음 해결 방법에는 경쟁 상태가 존재한다.
다음 단계를 병렬로 실행한다.
nameList가 name을 포함하면,
주어진 global을 사용하여 DOM 조작
태스크 소스에 전역 태스크를 큐에 추가해
p를 TypeError로
거부하고, 이
단계를 중단한다.
시간이 오래 걸릴 수 있는 작업을 수행한다.
name을 nameList에 추가한다.
주어진 global을 사용하여 DOM 조작 태스크 소스에 전역 태스크를 큐에 추가해 p를 undefined로 이행한다.
p를 반환한다.
위 작업을 두 번 호출하면 동시에 실행될 수 있다. 이 경우 단계 3.1에서 name이 nameList에 없지만 단계 3.3이 실행되기 전에 추가될 수 있으므로, 결과적으로 name이 nameList에 두 번 들어갈 수 있다.
병렬 큐는 이 문제를 해결한다. 표준에서 nameListQueue를 새 병렬 큐를 시작한 결과로 설정하고 이름 추가 단계를 다음과 같이 정의할 수 있다.
다음 단계를 큐에 추가한다. 대상은 nameListQueue이다.
nameList가 name을 포함하면,
주어진 global을 사용하여 전역
태스크를 큐에 추가한다. 사용할
태스크 소스는 DOM
조작 태스크 소스이며,
이 태스크는 p를 TypeError로
거부한다. 그런 다음 이
단계를 중단한다.
시간이 오래 걸릴 수 있는 작업을 수행한다.
name을 nameList에 추가한다.
주어진 global을 사용하여 DOM 조작 태스크 소스에 전역 태스크를 큐에 추가해 p를 undefined로 이행한다.
p를 반환한다.
이제 단계가 큐에 들어가므로 경쟁 상태를 피할 수 있다.
이 명세에서는 사용자 에이전트가 외부 리소스의 의미를 디코딩할 수 있는 구현을 갖추고 있는지를 가리킬 때 지원됨이라는 용어를 사용한다. 구현이 리소스의 중요한 측면을 무시하지 않고 해당 형식이나 유형의 외부 리소스를 처리할 수 있다면 그 형식이나 유형은 지원됨이라고 한다. 특정 리소스가 지원됨인지 여부는 해당 리소스 형식의 어떤 기능이 사용되는지에 따라 달라질 수 있다.
예를 들어 구현이 알지 못하는 사이에 이미지에 애니메이션 데이터가 포함되어 있더라도 픽셀 데이터를 디코딩하고 렌더링할 수 있다면 PNG 이미지는 지원되는 형식으로 간주된다.
사용된 압축 형식이 지원되지 않는다면 구현이 파일의 메타데이터에서 동영상의 크기를 확인할 수 있더라도 MPEG-4 비디오 파일은 지원되는 형식으로 간주되지 않는다.
일부 명세, 특히 HTTP 명세에서 표현이라고 부르는 것은 이 명세에서는 리소스라고 한다. [HTTP]
리소스의 중요 하위 리소스는 해당 리소스를 올바르게 처리하기 위해 사용할 수 있어야 하는 리소스이다. 어떤 리소스를 중요하게 간주할지는 해당 리소스의 형식을 정의하는 명세에서 정의한다.
CSS 스타일시트의 경우 여기서는 잠정적으로
@import 규칙을 통해 가져온 다른 스타일시트와 가져온 다른 스타일시트가
간접적으로 가져온 스타일시트를 중요 하위 리소스로 정의한다.
이 정의는 완전히 상호 운용 가능하지 않다. 또한 일부 사용자 에이전트는 배경 이미지나 웹 폰트와 같은 리소스를 중요 하위 리소스로 간주하는 것으로 보인다. 이상적으로는 CSS 작업 그룹이 이를 정의해야 한다. 이와 관련된 진행 상황은 w3c/csswg-drafts 이슈 #1088을 참조하라.
HTML에서 XML로 쉽게 이전할 수 있도록 이 명세를 준수하는
사용자 에이전트는 적어도 DOM 및 CSS의 목적상 HTML의 요소를 http://www.w3.org/1999/xhtml
네임스페이스에 배치한다. "HTML 요소"라는 용어는
XML 문서에 있는 경우를 포함하여 해당 네임스페이스의 모든 요소를 가리킨다.
달리 명시하지 않는 한 이 명세에서 정의하거나 언급하는 모든 요소는
HTML 네임스페이스 ("http://www.w3.org/1999/xhtml")에 있으며,
이 명세에서 정의하거나 언급하는 모든 속성에는 네임스페이스가 없다.
요소 유형이라는 용어는 주어진 로컬 이름과 네임스페이스를 갖는
요소 집합을 가리키는 데 사용한다. 예를 들어 button 요소는 요소
유형이 button인 요소이다.
즉 로컬 이름이 "button"이고
(위에서 정의한 대로 암시적으로) HTML 네임스페이스에 속한다.
어떤 요소나 속성이 무시됨이라고 명시되거나, 다른 값으로 취급되거나, 다른 것인 것처럼 처리된다고 할 때 이는 노드가 DOM에 들어간 후의 처리만을 가리킨다. 사용자 에이전트는 이러한 상황에서 DOM을 변경해서는 안 된다.
콘텐츠 속성은 새 값이 이전 값과 다른 경우에만 값이 변경되었다고 한다. 속성을 이미 가지고 있는 값으로 설정하는 것은 속성을 변경하지 않는다.
속성 값, Text
노드
또는 문자열에 사용되는 비어 있음이라는 용어는 텍스트의 길이가 0임을 의미한다(즉, 제어 문자나
U+0020 SPACE조차 포함하지 않음).
HTML 요소는 해당 요소의 로컬 이름에 대해 정의된 특정 HTML 요소 삽입 단계, HTML 요소 연결 후 단계, HTML 요소 제거 단계 및 HTML 요소 이동 단계를 가질 수 있다.
insertedNode가 주어진 경우 HTML 표준의 삽입 단계는 다음과 같이 정의한다.
insertedNode가 네임스페이스가 HTML 네임스페이스인 요소이고, 이 표준이 insertedNode의 로컬 이름에 대한 HTML 요소 삽입 단계를 정의한다면, insertedNode가 주어진 해당 HTML 요소 삽입 단계를 실행한다.
insertedNode가 폼 관련 요소이거나 폼 관련 요소의 조상이면 다음을 실행한다.
폼 관련 요소의 폼 소유자를 재설정한다.
insertedNode가 HTML 파서의
열린 요소 스택에 없는 Element이면,
insertedNode의
노드 문서가 주어진 상태에서 내부
리소스 링크를 처리한다.
insertedNode가 주어진 경우 HTML 표준의 연결 후 단계는 다음과 같이 정의한다.
insertedNode가 네임스페이스가 HTML 네임스페이스인 요소이고, 이 표준이 insertedNode의 로컬 이름에 대한 HTML 요소 연결 후 단계를 정의한다면, insertedNode가 주어진 해당 HTML 요소 연결 후 단계를 실행한다.
removedNode, isSubtreeRoot 및 oldAncestor가 주어진 경우 HTML 표준의 제거 단계는 다음과 같이 정의한다.
document를 removedNode의 노드 문서로 설정한다.
document의 포커스 영역이 removedNode이면, document의 포커스 영역을 document의 뷰포트로 설정하고, document의 관련 전역 객체의 내비게이션 API의 진행 중인 내비게이션 중 포커스 변경을 false로 설정한다.
이 단계는 포커스 해제 단계,
포커스 단계 또는 포커스 업데이트 단계를 수행하지
않으므로, blur 또는 change 이벤트가
발생하지 않는다.
removedNode가 네임스페이스가 HTML 네임스페이스인 요소이고, 이 표준이 removedNode의 로컬 이름에 대한 HTML 요소 제거 단계를 정의한다면, removedNode, isSubtreeRoot 및 oldAncestor가 주어진 해당 HTML 요소 제거 단계를 실행한다.
removedNode가 null이 아닌 폼 소유자를 갖는 폼 관련 요소이고, removedNode와 그 폼 소유자가 더 이상 동일한 트리에 있지 않다면, removedNode의 폼 소유자를 재설정한다.
removedNode의 popover
속성이
팝오버 없음 상태가 아니라면,
removedNode, false, false, false 및 null이 주어진 팝오버 숨기기
알고리즘을 실행한다.
movedNode, isSubtreeRoot 및 oldAncestor가 주어진 경우 HTML 표준의 이동 단계는 다음과 같이 정의한다.
movedNode가 네임스페이스가 HTML 네임스페이스인 요소이고, 이 표준이 movedNode의 로컬 이름에 대한 HTML 요소 이동 단계를 정의한다면, movedNode, isSubtreeRoot 및 oldAncestor가 주어진 해당 HTML 요소 이동 단계를 실행한다.
movedNode가 null이 아닌 폼 소유자를 갖는 폼 관련 요소이고, movedNode와 그 폼 소유자가 더 이상 동일한 트리에 있지 않다면, movedNode의 폼 소유자를 재설정한다.
어떤 노드를 인수로 사용하여 삽입 단계를 호출하고 그 노드가 이제 문서 트리 안에 있다면 노드가 문서에 삽입되었다고 한다. 마찬가지로 어떤 노드를 인수로 사용하여 제거 단계를 호출하고 그 노드가 이제 더 이상 문서 트리 안에 있지 않다면 노드가 문서에서 제거되었다고 한다.
어떤 노드를 인수로 사용하여 삽입 단계를 호출하고 그 노드가 이제 연결되어 있다면 노드가 연결된다고 한다. 마찬가지로 어떤 노드를 인수로 사용하여 제거 단계를 호출하고 그 노드가 이제 더 이상 연결되어 있지 않다면 노드가 연결 해제된다고 한다.
노드가 연결되어 있고 그 노드의 섀도 포함 루트의 브라우징 컨텍스트가 null이 아니라면, 그 노드는 브라우징 컨텍스트에 연결됨 상태이다. 어떤 노드를 인수로 사용하여 삽입 단계를 호출하고 그 노드가 이제 브라우징 컨텍스트에 연결되어 있다면 노드가 브라우징 컨텍스트에 연결된다고 한다. 어떤 노드를 인수로 사용하여 제거 단계를 호출하고 그 노드가 이제 더 이상 브라우징 컨텍스트에 연결되어 있지 않거나, 그 노드의 섀도 포함 루트의 브라우징 컨텍스트가 null이 된다면 노드가 브라우징 컨텍스트에서 연결 해제된다고 한다.
Foo가 실제로는 인터페이스인 경우에도 더 정확한 표현인
"Foo 인터페이스를 구현하는 객체" 대신 "Foo 객체"라는
표현을 사용할 때가 있다.
IDL 속성의 값을 가져오는 경우(예: 작성자 스크립트가 가져오는 경우)를 가져오기라고 하며, 새 값을 할당하는 경우를 설정하기라고 한다.
DOM 객체가 라이브라고 하면 해당 객체의 속성과 메서드는 데이터의 스냅샷이 아니라 실제 기반 데이터에 대해 작동해야 한다.
플러그인이라는 용어는 사용자 에이전트가 사용하는 구현 정의
콘텐츠 처리기 집합을 가리킨다.
이러한 처리기는 사용자 에이전트가 Document 객체를 렌더링하는 데 참여할 수 있지만,
Document의 자식
내비게이터블로 동작하거나
Document의 DOM에
Node
객체를 추가하지는 않는다.
일반적으로 이러한 콘텐츠 처리기는 제3자가 제공하지만, 사용자 에이전트가 내장 콘텐츠 처리기를 플러그인으로 지정할 수도 있다.
사용자 에이전트는 text/plain
및
application/octet-stream
유형에 등록된 플러그인이 있다고 간주해서는 안 된다.
플러그인의 한 예는 사용자가 PDF 파일로 이동할 때 내비게이터블에서 인스턴스화되는 PDF 뷰어이다. 이는 PDF 뷰어 구성요소를 구현한 주체가 사용자 에이전트 자체를 구현한 주체와 같은지 여부와 관계없이 플러그인으로 간주된다. 그러나 동일한 인터페이스를 사용하는 대신 사용자 에이전트와 별도로 실행되는 PDF 뷰어 애플리케이션은 이 정의에 따른 플러그인이 아니다.
플러그인과 상호작용하는 방식은 사용자 에이전트와 플랫폼에 따라 달라질 것으로 예상되므로 이 명세에서는 해당 메커니즘을 정의하지 않는다. 일부 UA는 Netscape Plugin API와 같은 플러그인 메커니즘을 지원할 수 있고, 다른 UA는 원격 콘텐츠 변환기를 사용하거나 특정 유형을 기본적으로 지원할 수 있다. 실제로 이 명세는 사용자 에이전트가 플러그인을 지원하도록 전혀 요구하지 않는다. [NPAPI]
브라우저는 플러그인용 외부 콘텐츠와 상호작용할 때 매우 주의해야 한다. 제3자 소프트웨어가 사용자 에이전트 자체와 동일한 권한으로 실행되면 제3자 소프트웨어의 취약점도 사용자 에이전트의 취약점만큼 위험해진다.
사용자마다 서로 다른 플러그인 집합을 보유하면
사용자를 고유하게 식별할 가능성을 높이는 추적 벡터가 되므로, 사용자 에이전트는
각 사용자에게 정확히 동일한 플러그인 집합을
지원하는 것이 권장된다.
Encoding에 정의된 것처럼 문자 인코딩, 또는 의미가 모호하지 않은 경우 단순히 인코딩은 바이트 스트림과 Unicode 문자열 사이를 변환하는 정의된 방식이다. 인코딩에는 인코딩 이름과 하나 이상의 인코딩 레이블이 있으며, Encoding 표준에서는 이를 인코딩의 이름과 레이블이라고 한다. [ENCODING]
이 명세는 사용자 에이전트(구현자 관련)와 문서(작성자 및 저작 도구 구현자 관련)에 대한 적합성 기준을 설명한다.
적합한 문서는 문서에 대한 모든 적합성 기준을 준수하는 문서이다. 읽기 쉽도록 일부 적합성 요구 사항은 작성자에 대한 적합성 요구 사항으로 표현하지만, 이러한 요구 사항은 암묵적으로 문서에 대한 요구 사항이다. 정의상 모든 문서에는 작성자가 있었다고 가정하기 때문이다. (일부 경우 그 작성자가 사용자 에이전트 자체일 수 있으며, 이러한 사용자 에이전트에는 아래에서 설명하는 추가 규칙이 적용된다.)
예를 들어 요구 사항에 "작성자는 foobar 요소를
사용해서는 안 된다"고 명시되어 있다면, 문서에 foobar라는 이름의
요소를 포함할 수 없음을 의미한다.
문서 적합성 요구 사항과 구현 적합성 요구 사항 사이에 암시적인 관계는 없다. 사용자 에이전트가 부적합한 문서를 임의로 처리할 수 있는 것은 아니다. 이 명세에서 설명하는 처리 모델은 입력 문서의 적합성 여부와 관계없이 구현에 적용된다.
사용자 에이전트는 서로 다른 적합성 요구 사항을 갖는 여러 범주로 나뉘며, 범주는 서로 겹칠 수 있다.
XML 구문을 지원하는 웹 브라우저는 다른 명세에서 해당 요소의 의미를 재정의하지 않은 한, 사용자가 상호작용할 수 있도록 XML 문서에서 발견된 HTML 네임스페이스의 요소와 속성을 이 명세에서 설명한 방식으로 처리해야 한다.
적합한 웹 브라우저가 XML 문서에서 script 요소를
발견하면 해당 요소에 포함된 스크립트를 실행한다. 그러나 사용자 에이전트가 XSLT도
지원한다고 가정할 때, XSLT로 표현된 변환 안에서 해당 요소를 발견하면 프로세서는
대신 script 요소를
변환의 일부를 구성하는 불투명한 요소로 처리한다.
HTML 구문을 지원하는 웹 브라우저는 사용자가 상호작용할 수 있도록 HTML MIME 유형으로 표시된 문서를 이 명세에서 설명한 방식으로 처리해야 한다.
스크립팅을 지원하는 사용자 에이전트는 Web IDL에 설명된 것처럼 이 명세의 IDL 조각을 준수하는 구현이어야 한다. [WEBIDL]
명시적으로 밝히지 않는 한 HTML 요소의 의미를 재정의하는 명세가
해당 요소를 나타내는 DOM 객체의 요구 사항까지 재정의하지는 않는다. 예를 들어
위 예의 script
요소는 여전히
HTMLScriptElement
인터페이스를 구현한다.
HTML 및 XML 문서를 비대화형 버전으로 렌더링하기 위해서만 처리하는 사용자 에이전트는 사용자 상호작용에 관한 요구 사항을 제외하고 웹 브라우저와 동일한 적합성 기준을 준수해야 한다.
비대화형 표현 사용자 에이전트의 일반적인 예로는 프린터 (정적 UA)와 오버헤드 디스플레이(동적 UA)가 있다. 대부분의 정적 비대화형 표현 사용자 에이전트는 스크립팅을 지원하지 않는 방식을 선택할 것으로 예상된다.
비대화형이지만 동적인 표현 UA는 여전히 스크립트를 실행하여 폼을 동적으로 제출하는 등의 동작을 허용한다. 그러나 사용자가 문서와 상호작용할 수 없을 때는 "포커스"라는 개념이 관련 없으므로 UA가 포커스 관련 DOM API를 지원할 필요는 없다.
대화형인지 여부와 관계없이 사용자 에이전트는 이 명세에서 정의한 제안된 기본 렌더링을 지원하는 것으로 지정될 수 있으며, 이는 사용자 옵션일 수도 있다.
이 지원은 필수가 아니다. 특히 제안된 기본 렌더링을 구현하는 사용자 에이전트도 색상 대비를 변경하거나 다른 포커스 스타일을 사용하거나 그 밖의 방식으로 사용자의 접근성과 사용성을 높이기 위해 이 기본값을 재정의하는 설정을 제공하는 것이 권장된다.
제안된 기본 렌더링을 지원하는 것으로 지정된 사용자 에이전트는 지정되어 있는 동안 렌더링 절에서 사용자 에이전트가 구현할 것으로 기대하는 동작으로 정의한 규칙을 구현해야 한다.
스크립팅을 지원하지 않거나 스크립팅 기능이 완전히 비활성화된 구현에는 이 명세에서 언급하는 이벤트 및 DOM 인터페이스를 지원할 의무가 없다. 그러나 이벤트 모델 또는 DOM을 기준으로 정의된 이 명세의 부분에서는 이러한 사용자 에이전트도 이벤트와 DOM이 지원되는 것처럼 동작해야 한다.
스크립팅은 애플리케이션의 필수적인 일부가 될 수 있다. 스크립팅을 지원하지 않거나 스크립팅이 비활성화된 웹 브라우저는 작성자의 의도를 완전히 전달하지 못할 수 있다.
적합성 검사기는 문서가 이 명세에서 설명하는 관련 적합성 기준을 준수하는지
확인해야 한다. 자동화된 적합성 검사기는 작성자의 의도를 해석해야 발견할 수 있는
오류를 검출하지 않아도 된다. 예를 들어 blockquote
요소의 콘텐츠가 인용문이 아니면 문서가 부적합하지만,
사람의 판단 없이 실행되는 적합성 검사기가
blockquote
요소에 인용된 자료만 들어 있는지 검사할 필요는 없다.
적합성 검사기는 입력 문서를 브라우징 컨텍스트 없이 파싱했을 때 적합한지 검사해야 한다. 이는 스크립트가 실행되지 않고 파서의 스크립팅 모드가 비활성화됨을 의미한다. 또한 스크립트가 실행되는 브라우징 컨텍스트에서 파싱했을 때도 입력 문서가 적합한지, 그리고 스크립트 실행 자체 중의 일시적인 상태를 제외하면 스크립트가 부적합한 상태를 발생시키지 않는지도 검사해야 한다. (이 요구 사항이 "MUST"가 아니라 "SHOULD"인 이유는 이를 수행하는 것이 불가능하다고 증명되었기 때문이다. [COMPUTABLE])
"HTML 유효성 검사기"라는 용어는 이 명세의 관련 요구 사항을 자체적으로 준수하는 적합성 검사기를 가리키는 데 사용할 수 있다.
XML DTD는 이 명세의 모든 적합성 요구 사항을 표현할 수 없다. 따라서 유효성 검사 XML 프로세서와 DTD만으로는 적합성 검사기를 구성할 수 없다. 또한 이 명세에서 정의한 두 저작 형식 모두 SGML 애플리케이션이 아니므로 유효성 검사 SGML 시스템도 적합성 검사기를 구성할 수 없다.
다시 말하면 적합성 기준에는 세 가지 유형이 있다.
적합성 검사기는 처음 두 유형을 검사해야 한다. 단순한 DTD 기반 유효성 검사기는 첫 번째 유형의 오류만 검사하므로 이 명세에 따른 적합성 검사기가 아니다.
문서를 렌더링하거나 적합성을 검사하는 목적 이외의 이유로 HTML 및 XML 문서를 처리하는 애플리케이션과 도구는 처리하는 문서의 의미에 따라 동작해야 한다.
문서 개요를 생성하지만 각 문단마다 중첩 수준을 높이고 제목에서는 중첩 수준을 높이지 않는 도구는 적합하지 않다.
저작 도구와 마크업 생성기는 적합한 문서를 생성해야 한다. 작성자에게 적용되는 적합성 기준은 적절한 경우 저작 도구에도 적용된다.
저작 도구는 작성자의 의도를 아직 판단할 수 없는 범위에서만 요소를 지정된 목적으로만 사용해야 한다는 엄격한 요구 사항의 적용을 받지 않는다. 그러나 저작 도구가 자동으로 요소를 오용하거나 사용자의 오용을 유도해서는 안 된다.
예를 들어 임의의 연락처 정보에 address 요소를
사용하는 것은 적합하지 않다. 이 요소는 가장 가까운 article 또는 body 요소 조상의
연락처 정보를 마크업하는 데만 사용할 수 있다. 그러나 저작 도구는 이러한 차이를
판단할 수 없는 경우가 많으므로 해당 요구 사항의 적용을 받지 않는다. 그렇다고
해서 저작 도구가 임의의 기울임꼴 텍스트 블록에 address
요소를 사용할 수 있다는 뜻은 아니다. 단지 사용자가 article 요소의
연락처 정보를 삽입하는 도구를 사용할 때 실제로 연락처 정보를 삽입하는지 아니면
다른 내용을 삽입하는지 저작 도구가 확인할 필요가 없다는 뜻이다.
적합성 검사 측면에서 편집기는 적합성 검사기가 확인할 수 있는 정도와 동일한 수준으로 적합한 문서를 출력해야 한다.
저작 도구를 사용하여 부적합한 문서를 편집하는 경우, 편집 세션 중 편집하지 않은 문서 구획의 적합성 오류를 유지할 수 있다. 즉 편집 도구는 오류가 있는 콘텐츠를 왕복 처리할 수 있다. 그러나 오류를 그대로 유지한 경우 저작 도구는 출력이 적합하다고 주장해서는 안 된다.
저작 도구에는 구조 또는 의미 데이터에서 작업하는 도구와 보이는 그대로 결과를 얻는 미디어별 편집 방식(WYSIWYG)으로 작업하는 도구라는 두 가지 주요 유형이 있을 것으로 예상된다.
소스 정보의 구조를 사용하면 어떤 HTML 요소와 속성이 가장 적합한지 근거 있게 선택할 수 있으므로, HTML을 저작하는 도구에는 전자의 방식이 권장된다.
그러나 WYSIWYG 도구도 유효한 방식이다. WYSIWYG 도구는 적합하다고 알고 있는
요소를 사용해야 하며, 적합한지 알 수 없는 요소를 사용해서는 안 된다. 일부
극단적인 경우에는 흐름 요소의 사용을 몇 개의 요소로 제한해야 할 수도 있다. 예를
들면 div, b, i 및 span 요소만 사용하고
style 속성을 광범위하게
사용해야 할 수 있다.
WYSIWYG 여부와 관계없이 모든 저작 도구는 사용자가 잘 구조화되고 의미가 풍부하며 미디어에 독립적인 콘텐츠를 만들 수 있도록 최선을 다해야 한다.
기존 콘텐츠 및 이전 명세와의 호환성을 위해 이 명세에서는 두 가지 저작 형식을 설명한다. 하나는 XML을 기반으로 하며, 다른 하나는 SGML에서 영감을 받은 사용자 정의 형식 (HTML 구문이라고 함)을 사용한다. 구현은 이 두 형식 중 적어도 하나를 지원해야 하며, 둘 다 지원하는 것이 권장된다.
일부 적합성 요구 사항은 요소, 속성, 메서드 또는 객체에 대한 요구 사항으로 표현한다. 이러한 요구 사항은 콘텐츠 모델 제한을 설명하는 요구 사항과 구현 동작을 설명하는 요구 사항이라는 두 범주로 나뉜다. 전자는 문서와 저작 도구에 대한 요구 사항이며, 후자는 사용자 에이전트에 대한 요구 사항이다. 마찬가지로 일부 적합성 요구 사항은 작성자에 대한 요구 사항으로 표현한다. 이러한 요구 사항은 작성자가 생성하는 문서에 대한 적합성 요구 사항으로 해석해야 한다. (다시 말해 이 명세는 작성자에 대한 적합성 기준과 문서에 대한 적합성 기준을 구분하지 않는다.)
이 명세는 여러 다른 기반 명세에 의존한다.
다음 용어는 Infra에 정의되어 있다. [INFRA]
Unicode 문자 집합은 텍스트 데이터를 표현하는 데 사용되며, Encoding은 문자 인코딩에 관한 요구 사항을 정의한다. [UNICODE]
앞에서 설명한 것처럼 이 명세는 해당 명세에서 정의한 용어를 바탕으로 용어를 도입한다.
다음 용어는 Encoding에 정의된 의미로 사용한다. [ENCODING]
HTML용 XML 구문을 지원하는 구현은 해당 구문이 네임스페이스를 포함하는 XML 직렬화를 사용하므로 일부 버전의 XML과 이에 대응하는 네임스페이스 명세를 지원해야 한다. [XML] [XMLNS]
스크립트를 실행하거나 CSS 또는 XPath 표현식을 평가하거나 결과 DOM을 임의의 콘텐츠에 노출하지 않고 콘텐츠를 처리하는 데이터 마이닝 도구 및 기타 사용자 에이전트는 네임스페이스 문자열을 실제로 노출하지 않고 DOM 노드에 대응하는 항목이 특정 네임스페이스에 있다고 선언하는 것만으로 "네임스페이스를 지원"할 수 있다.
HTML 구문에서는 네임스페이스 접두사와 네임스페이스 선언이 XML에서와 동일한 효과를 갖지 않는다. 예를 들어 HTML 요소 이름에서 콜론에는 특별한 의미가 없다.
XML 네임스페이스에 있는 space라는 이름의
속성은 확장 가능한 마크업 언어(XML)에 정의되어 있다.
[XML]
Name 생성 규칙은
XML에 정의되어 있다.
[XML]
이 명세에서는 XML 문서에 스타일시트 연결하기에 정의된
<?xml-stylesheet?>
처리 명령도 참조한다.
[XMLSSPI]
이 명세에서는 비규범적으로 XSLTProcessor
인터페이스와 해당 인터페이스의
transformToFragment() 및
transformToDocument() 메서드도
언급한다.
[XSLTP]
다음 용어는 URL에 정의되어 있다. [URL]
application/x-www-form-urlencoded
형식application/x-www-form-urlencoded
직렬화기이 명세에서는 여러 스킴과 프로토콜도 참조한다.
about: 스킴
[ABOUT]
blob: 스킴
[FILEAPI]
data: 스킴
[RFC2397]
http: 스킴
[HTTP]
https: 스킴
[HTTP]
mailto:
스킴 [MAILTO]sms: 스킴
[SMS]
urn: 스킴
[URN]
미디어 프래그먼트 구문은 미디어 프래그먼트 URI에 정의되어 있다. [MEDIAFRAG]
다음 용어는 URL Pattern에 정의되어 있다. [URLPATTERN]
다음 용어는 HTTP 명세에 정의되어 있다. [HTTP]
Accept` 헤더Accept-Language`
헤더Cache-Control`
헤더Content-Disposition` 헤더Content-Language`
헤더Content-Range`
헤더Last-Modified`
헤더Range` 헤더Referer` 헤더다음 용어는 HTTP 상태 관리 메커니즘에 정의되어 있다. [COOKIES]
다음 용어는 웹 링크에 정의되어 있다. [WEBLINK]
Link`
헤더Link`
필드 값 파싱다음 용어는 HTTP용 구조화된 필드 값에 정의되어 있다. [STRUCTURED-FIELDS]
다음 용어는 MIME 스니핑에 정의되어 있다. [MIMESNIFF]
다음 용어는 Fetch에 정의되어 있다. [FETCH]
about:blankSec-Purpose`User-Agent` 값Origin`
헤더Cross-Origin-Resource-Policy`
헤더RequestCredentials
열거형RequestDestination
열거형fetch()
메서드다음 용어는 Referrer Policy에 정의되어 있다. [REFERRERPOLICY]
Referrer-Policy`
HTTP 헤더Referrer-Policy`
헤더에서 리퍼러 정책 파싱 알고리즘no-referrer",
"no-referrer-when-downgrade",
"origin-when-cross-origin"
및
"unsafe-url"
리퍼러 정책다음 용어는 Mixed Content에 정의되어 있다. [MIX]
다음 용어는 Subresource Integrity에 정의되어 있다. [SRI]
다음 용어는 No-Vary-Search HTTP 응답 헤더 필드에 정의되어 있다. [NOVARYSEARCH]
다음 용어는 페인트 타이밍에 정의되어 있다. [PAINTTIMING]
다음 용어는 내비게이션 타이밍에 정의되어 있다. [NAVIGATIONTIMING]
NavigationTimingType
및 해당
"navigate",
"reload"
및
"back_forward"
값.다음 용어는 리소스 타이밍에 정의되어 있다. [RESOURCETIMING]
다음 용어는 성능 타임라인에 정의되어 있다. [PERFORMANCETIMELINE]
PerformanceEntry
및 해당
name,
entryType,
startTime
및
duration
속성.
다음 용어는 긴 애니메이션 프레임에 정의되어 있다. [LONGANIMATIONFRAMES]
다음 용어는 긴 태스크에 정의되어 있다. [LONGTASKS]
이 명세의 IDL 조각은 Web IDL에 설명된 적합한 IDL 조각의 요구 사항에 따라 해석해야 한다. [WEBIDL]
다음 용어는 Web IDL에 정의되어 있다.
[Global][LegacyFactoryFunction]
[LegacyLenientThis][LegacyNullToEmptyString]
[LegacyOverrideBuiltIns]
[LegacyTreatNonObjectAsNull]
[LegacyUnenumerableNamedProperties]
[LegacyUnforgeable]Web IDL은 이 명세에서 사용하는 다음 유형도 정의한다.
ArrayBufferArrayBufferView
boolean
DOMStringdouble
Float16ArrayFunctionlongobject
Promise
Uint8ClampedArray
unrestricted double
unsigned longUSVStringVoidFunctionQuotaExceededError이 명세에서 던지기라는
용어는 Web IDL에 정의된 의미로 사용한다. DOMException
유형과 다음 예외 이름은 Web IDL에 정의되어 있으며 이
명세에서 사용한다.
IndexSizeError"HierarchyRequestError"
InvalidCharacterError"
NoModificationAllowedError"
NotFoundError"NotSupportedError"InvalidStateError"SyntaxError"InvalidAccessError"
SecurityError"NetworkError"AbortError"DataCloneError"EncodingError"NotAllowedError"이 명세에서 사용자 에이전트가 특정 시간을 나타내는 Date 객체를 생성해야 하는 경우
(이 시간은 특수 값 Not-a-Number일 수 있음), 해당 시간의 밀리초 구성요소가 있으면
정수로 잘라내야 하며 새로 생성된 Date
객체의 시간 값은 잘라낸 결과 시간을 나타내야 한다.
예를 들어 2000년 1월 1일 01:00 UTC에서 23045백만분의 1초가 지난
시간, 즉 2000-01-01T00:00:00.023045Z가 주어지면 해당 시간을 나타내도록 생성된 Date
객체는 45백만분의 1초 앞선 2000-01-01T00:00:00.023Z를 나타내도록 생성된 객체와
동일한 시간을 나타낸다. 주어진 시간이 NaN이면 결과는 시간 값 NaN을 나타내는 Date
객체이다(이는 객체가 특정 시점을 나타내지 않음을 의미한다).
이 명세에서 설명하는 언어의 일부는 기반 스크립팅 언어로 JavaScript만 지원한다. [JAVASCRIPT]
"JavaScript"라는 용어가 공식 명칭인 ECMAScript 대신 사용되는 이유는 JavaScript라는 용어가 더 널리 알려져 있기 때문이다.
다음 용어는 JavaScript 명세에 정의되어 있으며 이 명세에서 사용한다.
Atomics
객체Atomics.waitAsync 객체
Date 클래스
FinalizationRegistry
클래스RegExp
클래스SharedArrayBuffer
클래스SyntaxError
클래스TypeError
클래스RangeError
클래스WeakRef
클래스eval() 함수
WeakRef.prototype.deref()
함수import()
import.metatypeof
연산자delete
연산자JavaScript를 지원하는 사용자 에이전트는 Dynamic Code Brand Checks 제안도 구현해야 한다. 다음 용어는 해당 제안에 정의되어 있으며 이 명세에서 사용한다. [JSDYNAMICCODEBRANDCHECKS]
JavaScript를 지원하는 사용자 에이전트는 Import Text 제안도 구현해야 한다. 다음 용어는 해당 제안에 정의되어 있으며 이 명세에서 사용한다. [JSIMPORTTEXT]
JavaScript를 지원하는 사용자 에이전트는 ECMAScript 국제화 API도 구현해야 한다. [JSINTL]
JavaScript를 지원하는 사용자 에이전트는 Temporal 제안도 구현해야 한다. 다음 용어는 해당 제안에 정의되어 있으며 이 명세에서 사용한다. [JSTEMPORAL]
다음 용어는 WebAssembly JavaScript Interface에 정의되어 있다. [WASMJS]
문서 객체 모델(DOM)은 문서와 그 콘텐츠를 표현한 것, 즉 모델이다. DOM은 단순한 API가 아니다. 이 명세에서는 HTML 구현의 적합성 기준을 DOM에 대한 연산으로 정의한다. [DOM]
이 명세는 DOM을 기준으로 정의되어 있으며 일부 기능은 DOM 인터페이스의 확장으로 정의되므로, 구현은 DOM과 UI Events에 정의된 이벤트를 지원해야 한다. [DOM] [UIEVENTS]
특히 다음 기능은 DOM에 정의되어 있다. [DOM]
Attr 인터페이스
CharacterData
인터페이스Comment 인터페이스DOMImplementation
인터페이스Document 인터페이스와 해당
doctype 속성
DocumentOrShadowRoot
인터페이스DocumentFragment
인터페이스DocumentType 인터페이스
ChildNode 인터페이스Element
인터페이스attachShadow()
메서드.Node 인터페이스
NodeList 인터페이스ProcessingInstruction
인터페이스와 해당
대상
개념
ShadowRoot 인터페이스
Text 인터페이스
Range
인터페이스HTMLCollection
인터페이스와 해당
length 속성,
그리고 해당
item() 및
namedItem()
메서드
DOMTokenList
인터페이스와 해당
value 속성 및
supports 연산
createDocument()
메서드createHTMLDocument()
메서드createElement()
메서드createElementNS()
메서드getElementById()
메서드getElementsByClassName()
메서드append() 메서드appendChild() 메서드
cloneNode() 메서드moveBefore() 메서드
importNode() 메서드
preventDefault()
메서드id
속성setAttribute()
메서드textContent 속성
children 속성
slotchange
이벤트CharacterData
노드의 데이터와
해당
데이터 대체
알고리즘
Event
인터페이스Event 및 파생 인터페이스의
생성자 동작EventTarget 인터페이스
EventInit 딕셔너리 유형
type
속성currentTarget
속성bubbles 속성cancelable 속성
composed 속성isTrusted 속성initEvent() 메서드addEventListener()
메서드EventListener
콜백 인터페이스Document의
인코딩(여기서는
문자 인코딩),
모드,
사용자 정의 요소 레지스트리,
선언적
섀도 루트 허용 및
콘텐츠 유형
is 값
MutationObserver 인터페이스와
일반적인 변이
관찰자AbortController와 해당
시그널
AbortSignal다음 기능은 UI Events에 정의되어 있다. [UIEVENTS]
FocusEvent 인터페이스FocusEvent
인터페이스의 relatedTarget
속성UIEvent
인터페이스UIEvent
인터페이스의 view 속성beforeinput 이벤트
contextmenu 이벤트
input 이벤트keydown 이벤트keypress 이벤트keyup 이벤트다음 기능은 Touch Events에 정의되어 있다. [TOUCH]
다음 기능은 Pointer Events에 정의되어 있다. [POINTEREVENTS]
MouseEvent 인터페이스
MouseEvent
인터페이스의 relatedTarget
속성MouseEvent
인터페이스의 button
속성MouseEventInit
딕셔너리 유형PointerEvent
인터페이스PointerEvent
인터페이스의 pointerType
속성auxclick 이벤트click
이벤트dblclick 이벤트mousedown 이벤트mouseenter 이벤트mouseleave 이벤트mousemove 이벤트mouseout 이벤트mouseover 이벤트mouseup 이벤트pointerdown
이벤트pointerup 이벤트
pointercancel
이벤트wheel
이벤트다음 이벤트는 Clipboard API and events에 정의되어 있다. [CLIPBOARD-APIS]
이 명세에서는 이벤트의 유형을 가리키는 데
이름이라는 용어를 사용할 때가 있다. 예를 들어 "click이라는 이름의
이벤트" 또는 "이벤트 이름이 keypress인 경우"와 같이 사용한다. 이벤트에
대한 "이름"과 "유형"이라는 용어는 동의어이다.
다음 기능은 DOM Parsing and Serialization에 정의되어 있다. [DOMPARSING]
다음 기능은 Selection API에 정의되어 있다. [SELECTION]
사용자 에이전트는 execCommand에 설명된 기능을 구현하는 것이 권장된다. [EXECCOMMAND]
다음 기능은 Fullscreen API에 정의되어 있다. [FULLSCREEN]
High Resolution Time은 다음 기능을 제공한다. [HRT]
이 명세에서는 File API에 정의된 다음 기능을 사용한다. [FILEAPI]
Blob 인터페이스와
해당
type
속성
File 인터페이스와
해당
name 및
lastModified 속성
FileList 인터페이스Blob의
스냅샷 상태
개념
다음 용어는 Indexed Database API에 정의되어 있다. [INDEXEDDB]
다음 용어는 Media Source Extensions에 정의되어 있다. [MEDIASOURCE]
MediaSource
인터페이스다음 용어는 Media Capture and Streams에 정의되어 있다. [MEDIASTREAM]
다음 용어는 Reporting에 정의되어 있다. [REPORTING]
다음 기능과 용어는 XMLHttpRequest에 정의되어 있다. [XHR]
XMLHttpRequest 인터페이스와
해당
responseXML
속성
ProgressEvent
인터페이스와 해당
lengthComputable,
loaded 및
total 속성
FormData
인터페이스와 관련
항목
리스트
다음 기능은 Battery Status API에 정의되어 있다. [BATTERY]
getBattery()
메서드구현은 미디어 쿼리를 지원해야 한다. <media-condition> 기능은 해당 명세에 정의되어 있다. [MQ]
이 명세의 구현이 CSS 전체를 지원해야 하는 것은 아니지만 (적어도 웹 브라우저에는 권장됨), 일부 기능은 특정 CSS 요구 사항을 기준으로 정의되어 있다.
이 명세에서 어떤 항목을 특정 CSS 문법에 따라 파싱하도록 요구하는 경우, 오류 처리 규칙을 포함하여 CSS 구문의 관련 알고리즘을 따라야 한다. [CSSSYNTAX]
예를 들어 사용자 에이전트는 스타일시트의 끝을 예기치 않게
발견하면 열려 있는 모든 구문을 닫아야 한다. 따라서 색상 값으로
"rgb(0,0,0" 문자열을 파싱할 때(닫는 괄호가 누락됨), 이 오류 처리 규칙에
따라 닫는 괄호가 암시되며 값, 즉 '검은색'이 얻어진다.
그러나 유사한 구문인 "rgb(0,0,"은(괄호와 "blue" 값이 모두 누락됨)
열려 있는 구문을 닫아도 유효한 값이 만들어지지 않으므로 파싱할 수 없다.
다음 용어와 기능은 종속형 스타일시트 (CSS)에 정의되어 있다. [CSS]
'display' 프로퍼티의 기본 버전은 CSS에 정의되어 있으며, 이 프로퍼티는 다른 CSS 모듈에서 확장된다. [CSS] [CSSRUBY] [CSSTABLE]
다음 용어와 기능은 CSS 박스 모델에 정의되어 있다. [CSSBOX]
다음 기능은 CSS 논리적 프로퍼티에 정의되어 있다. [CSSLOGICAL]
다음 용어와 기능은 CSS 색상에 정의되어 있다. [CSSCOLOR]
다음 용어는 CSS 이미지에 정의되어 있다. [CSSIMAGES]
페인트 소스라는 용어는 특정 HTML 요소와 CSS 'element()' 함수의 상호작용을 정의하기 위해 CSS Images Level 4에 정의된 의미로 사용한다. [CSSIMAGES4]
다음 기능은 CSS 배경 및 테두리에 정의되어 있다. [CSSBG]
CSS 배경 및 테두리는 다음 테두리 프로퍼티도 정의한다. [CSSBG]
다음 기능은 CSS 박스 정렬에 정의되어 있다. [CSSALIGN]
다음 용어와 기능은 CSS 디스플레이에 정의되어 있다. [CSSDISPLAY]
다음 기능은 CSS 플렉시블 박스 레이아웃에 정의되어 있다. [CSSFLEXBOX]
다음 용어와 기능은 CSS 글꼴에 정의되어 있다. [CSSFONTS]
다음 기능은 CSS 폼에 정의되어 있다. [CSSFORMS]
다음 기능은 CSS 간격에 정의되어 있다. [CSSGAPS]
다음 기능은 CSS 그리드 레이아웃에 정의되어 있다. [CSSGRID]
다음 용어는 CSS 인라인 레이아웃에 정의되어 있다. [CSSINLINE]
다음 용어와 기능은 CSS 박스 크기 결정에 정의되어 있다. [CSSSIZING]
다음 기능은 CSS 리스트 및 카운터에 정의되어 있다. [CSSLISTS]
다음 기능은 CSS 오버플로에 정의되어 있다. [CSSOVERFLOW]
다음 용어와 기능은 CSS 위치 지정 레이아웃에 정의되어 있다. [CSSPOSITION]
다음 기능은 CSS 다단 레이아웃에 정의되어 있다. [CSSMULTICOL]
'display' 프로퍼티의 'ruby-base' 값은 CSS 루비 레이아웃에 정의되어 있다. [CSSRUBY]
다음 기능은 CSS 표에 정의되어 있다. [CSSTABLE]
다음 기능은 CSS 텍스트에 정의되어 있다. [CSSTEXT]
다음 기능은 CSS 쓰기 모드에 정의되어 있다. [CSSWM]
다음 기능은 CSS 기본 사용자 인터페이스에 정의되어 있다. [CSSUI]
애니메이션 업데이트 및 이벤트 전송 알고리즘은 웹 애니메이션에 정의되어 있다. [WEBANIMATIONS]
스크립팅을 지원하는 구현은 CSS 객체 모델을 지원해야 한다. 다음 기능과 용어는 CSSOM 명세에 정의되어 있다. [CSSOM] [CSSOMVIEW]
Screen 인터페이스
LinkStyle
인터페이스CSSStyleDeclaration
인터페이스style IDL
속성CSSStyleDeclaration의
cssText
속성
StyleSheet
인터페이스CSSStyleSheet
인터페이스CSSStyleSheet 생성CSSStyleSheet의
규칙을 동기적으로 대체resize 이벤트
scroll 이벤트
scrollend
이벤트다음 기능과 용어는 CSS 구문에 정의되어 있다. [CSSSYNTAX]
다음 용어는 선택자에 정의되어 있다. [SELECTORS]
<selector-list>
:focus-visible
의사 클래스다음 기능은 CSS 값 및 단위에 정의되어 있다. [CSSVALUES]
다음 기능은 CSS 뷰 전환에 정의되어 있다. [CSSVIEWTRANSITIONS]
ViewTransition
스타일 속성이라는 용어는 CSS 스타일 속성에 정의되어 있다. [CSSATTR]
다음 용어는 CSS 캐스케이딩 및 상속에 정의되어 있다. [CSSCASCADE]
CanvasRenderingContext2D
객체의 글꼴 사용은 CSS 글꼴 및 글꼴 로딩 명세에
설명된 기능, 특히 FontFace 객체와 글꼴 소스 개념에 의존한다.
[CSSFONTS] [CSSFONTLOAD]
다음 인터페이스와 용어는 기하 인터페이스에 정의되어 있다. [GEOMETRY]
DOMMatrix 인터페이스와 관련
m11 요소,
m12 요소,
m21 요소,
m22 요소,
m41 요소
및
m42 요소
DOMMatrix2DInit
및
DOMMatrixInit
딕셔너리
DOMMatrix2DInit
또는 DOMMatrixInit에
대한 딕셔너리에서
DOMMatrix 생성
및 2D 딕셔너리에서
DOMMatrix 생성
알고리즘
DOMPointInit
딕셔너리와 관련
x 및
y 멤버
다음 용어는 CSS 범위 지정에 정의되어 있다. [CSSSCOPING]
다음 용어와 기능은 CSS 색상 조정에 정의되어 있다. [CSSCOLORADJUST]
다음 용어는 CSS 의사 요소에 정의되어 있다. [CSSPSEUDO]
다음 용어는 CSS 컨테인먼트에 정의되어 있다. [CSSCONTAIN]
다음 용어는 CSS 앵커 위치 지정에 정의되어 있다. [CSSANCHOR]
다음 용어는 교차 관찰자에 정의되어 있다. [INTERSECTIONOBSERVER]
다음 용어는 크기 조정 관찰자에 정의되어 있다. [RESIZEOBSERVER]
다음 인터페이스는 WebGL 명세에 정의되어 있다. [WEBGL]
WebGLRenderingContext
인터페이스WebGL2RenderingContext
인터페이스WebGLContextAttributes
딕셔너리다음 인터페이스는 WebGPU에 정의되어 있다. [WEBGPU]
GPUCanvasContext 인터페이스
구현은 미디어 리소스의 자막, 캡션, 메타데이터 등을 위한 텍스트 트랙 형식으로 WebVTT를 지원할 수 있다. [WEBVTT]
이 명세에서 사용하는 다음 용어는 WebVTT에 정의되어 있다.
role 속성과 다음 역할은
접근 가능한 리치 인터넷 애플리케이션(ARIA)에 정의되어 있다.
[ARIA]
또한 다음 aria-* 콘텐츠 속성은
ARIA에 정의되어 있다. [ARIA]
마지막으로 다음 용어는 ARIA에 정의되어 있다. [ARIA]
ARIAMixin
인터페이스와 관련
ARIAMixin getter
단계 및
ARIAMixin setter
단계 훅, 그리고 해당
role 및
aria*
속성
다음 용어는 콘텐츠 보안 정책에 정의되어 있다. [CSP]
report-uri 지시문frame-ancestors
지시문sandbox
지시문SecurityPolicyViolationEvent
인터페이스securitypolicyviolation
이벤트다음 용어는 서비스 워커에 정의되어 있다. [SW]
다음 알고리즘은 보안 컨텍스트에 정의되어 있다. [SECURE-CONTEXTS]
다음 용어는 권한 정책에 정의되어 있다. [PERMISSIONSPOLICY]
다음 기능은 결제 요청 API에 정의되어 있다. [PAYMENTREQUEST]
PaymentRequest
인터페이스이 명세에서 MathML 전체를 지원하도록 요구하지는 않지만 (적어도 웹 브라우저에는 권장됨), 일부 기능은 MathML의 일부가 구현되어 있어야 한다. [MATHML]
다음 기능은 수학 마크업 언어 (MathML)에 정의되어 있다.
a
요소annotation-xml 요소math 요소merror 요소mfrac 요소mi 요소mmultiscripts 요소mn 요소mo 요소mover 요소mpadded 요소mphantom 요소mprescripts 요소mroot 요소mrow 요소ms 요소mspace 요소msqrt 요소mstyle 요소msub 요소msubsup 요소msup 요소mtable 요소mtd 요소mtext 요소mtr 요소munder 요소munderover 요소semantics 요소accent 속성accentunder 속성columnspan 속성depth 속성fence 속성form 속성height 속성largeop 속성lspace 속성maxsize 속성minsize 속성movablelimits 속성rowspan 속성rspace 속성separator 속성stretchy 속성symmetric 속성voffset 속성width 속성displaystyle 속성mathbackground 속성mathcolor 속성mathsize 속성scriptlevel 속성이 명세에서 SVG 전체를 지원하도록 요구하지는 않지만 (적어도 웹 브라우저에는 권장됨), 일부 기능은 SVG의 일부가 구현되어 있어야 한다.
SVG를 구현하는 사용자 에이전트는 이전 개정판이 아니라 SVG 2 명세를 구현해야 한다.
다음 기능은 SVG 2 명세에 정의되어 있다. [SVG]
SVGElement
인터페이스SVGImageElement
인터페이스SVGScriptElement
인터페이스SVGSVGElement
인터페이스a 요소animate 요소animateTransform 요소circle 요소defs 요소desc 요소ellipse 요소foreignObject 요소g 요소image 요소line 요소marker 요소metadata 요소path 요소polygon 요소polyline 요소rect 요소script 요소set 요소svg 요소text 요소textPath 요소title 요소tspan 요소use 요소action 속성attributeName 속성cx 속성cy 속성d 속성dx 속성dy 속성formaction 속성height 속성href 속성hreflang 속성lengthAdjust 속성markerHeight 속성markerUnits 속성markerWidth 속성method 속성orient 속성path 속성pathLength 속성points 속성preserveAspectRatio 속성r 속성refX 속성refY 속성rotate 속성rx 속성ry 속성side 속성spacing 속성startOffset 속성textLength 속성type 속성viewBox 속성width 속성x 속성x1 속성x2 속성y 속성y1 속성y2 속성text-rendering 프로퍼티alignment-baseline 프로퍼티baseline-shift 프로퍼티clip-path 프로퍼티clip-rule 프로퍼티color 프로퍼티color-interpolation 프로퍼티cursor 프로퍼티direction 프로퍼티display 프로퍼티dominant-baseline 프로퍼티fill 프로퍼티fill-opacity 프로퍼티fill-rule 프로퍼티font-family 프로퍼티font-size 프로퍼티font-size-adjust 프로퍼티font-stretch 프로퍼티font-style 프로퍼티font-variant 프로퍼티font-weight 프로퍼티letter-spacing 프로퍼티marker-end 프로퍼티marker-mid 프로퍼티marker-start 프로퍼티opacity 프로퍼티paint-order 프로퍼티pointer-events 프로퍼티shape-rendering 프로퍼티stop-color 프로퍼티stop-opacity 프로퍼티stroke 프로퍼티stroke-dasharray 프로퍼티stroke-dashoffset 프로퍼티stroke-linecap 프로퍼티stroke-linejoin 프로퍼티stroke-miterlimit 프로퍼티stroke-opacity 프로퍼티stroke-width 프로퍼티text-anchor 프로퍼티text-decoration 프로퍼티text-overflow 프로퍼티transform 프로퍼티transform-origin 프로퍼티unicode-bidi 프로퍼티vector-effect 프로퍼티visibility 프로퍼티white-space 프로퍼티word-spacing 프로퍼티writing-mode 프로퍼티다음 기능은 필터 효과에 정의되어 있다. [FILTERS]
다음 기능은 합성 및 블렌딩에 정의되어 있다. [COMPOSITE]
다음 기능은 백그라운드 태스크의 협력적 스케줄링에 정의되어 있다. [REQUESTIDLECALLBACK]
다음 용어는 화면 방향에 정의되어 있다. [SCREENORIENTATION]
다음 용어는 스토리지에 정의되어 있다. [STORAGE]
다음 기능은 웹 앱 매니페스트에 정의되어 있다. [MANIFEST]
다음 용어는 WebAssembly JavaScript 인터페이스: ESM 통합에 정의되어 있다. [WASMESM]
다음 기능은 WebCodecs에 정의되어 있다. [WEBCODECS]
다음 용어는 WebDriver에 정의되어 있다. [WEBDRIVER]
다음 용어는 WebDriver BiDi에 정의되어 있다. [WEBDRIVERBIDI]
다음 용어는 웹 암호화 API에 정의되어 있다. [WEBCRYPTO]
다음 용어는 WebSocket에 정의되어 있다. [WEBSOCKETS]
다음 용어는 WebTransport에 정의되어 있다. [WEBTRANSPORT]
다음 용어는 웹 인증: 공개 키 자격 증명 접근 API에 정의되어 있다. [WEBAUTHN]
다음 용어는 자격 증명 관리에 정의되어 있다. [CREDMAN]
다음 용어는 콘솔에 정의되어 있다. [CONSOLE]
다음 용어는 Web Locks API에 정의되어 있다. [WEBLOCKS]
이 명세에서는 신뢰할 수 있는 유형에 정의된 다음 기능을 사용한다. [TRUSTED-TYPES]
다음 용어는 WebRTC API에 정의되어 있다. [WEBRTC]
다음 용어는 화면 속 화면 API에 정의되어 있다. [PICTUREINPICTURE]
다음 용어는 유휴 감지 API에 정의되어 있다.
다음 용어는 웹 음성 API에 정의되어 있다.
다음 용어는 WebOTP API에 정의되어 있다.
다음 용어는 웹 공유 API에 정의되어 있다.
다음 용어는 웹 스마트 카드 API에 정의되어 있다.
다음 용어는 웹 백그라운드 동기화에 정의되어 있다.
다음 용어는 웹 주기적 백그라운드 동기화에 정의되어 있다.
다음 용어는 백그라운드 Fetch에 정의되어 있다.
다음 용어는 키보드 잠금에 정의되어 있다.
다음 용어는 웹 MIDI API에 정의되어 있다.
다음 용어는 범용 센서 API에 정의되어 있다.
다음 용어는 WebHID API에 정의되어 있다.
다음 용어는 WebXR 기기 API에 정의되어 있다.
이 명세는 위 목록에서 요구하는 항목을 제외하고 특정 네트워크 프로토콜, 스타일시트 언어, 스크립팅 언어 또는 DOM 명세에 대한 지원을 요구하지 않는다. 그러나 이 명세에서 설명하는 언어는 스타일 지정 언어로 CSS, 스크립팅 언어로 JavaScript, 네트워크 프로토콜로 HTTP를 사용하는 방향으로 편향되어 있으며, 여러 기능은 이러한 언어와 프로토콜이 사용되고 있다고 가정한다.
HTTP 프로토콜을 구현하는 사용자 에이전트는 HTTP 상태 관리 메커니즘(쿠키)도 구현해야 한다. [HTTP] [COOKIES]
이 명세는 각 관련 절에서 문자 인코딩, 이미지 형식, 오디오 형식 및 비디오 형식에 대한 특정 추가 요구 사항을 규정할 수 있다.
이 명세에 대한 공급업체별 독점 사용자 에이전트 확장은 강력히 권장되지 않는다. 문서는 그러한 확장을 사용해서는 안 된다. 그러한 확장을 사용하면 상호운용성이 저하되고 사용자 기반이 분열되어 특정 사용자 에이전트의 사용자만 해당 콘텐츠에 접근할 수 있게 되기 때문이다.
모든 확장은 확장의 사용이 이 명세에 정의된 기능과 모순되거나 해당 기능을 부적합하게 만들지 않도록 정의되어야 한다.
예를 들어, 그렇게 하는 것은 강력히 권장되지 않지만 구현은 사용자가 컨트롤의
현재 값을 선택하는 데 걸린 시간을 반환하는 새로운 IDL 속성 "typeTime"을
컨트롤에 추가할 수 있다. 반면 폼의 elements
배열에 나타나는 새로운 컨트롤을 정의하는 것은 위 요구 사항을 위반한다.
이는 이 명세에 제시된 elements의 정의를
위반하기 때문이다.
이 명세에 대한 공급업체 중립적 확장이 필요한 경우, 이 명세를 그에 맞게 업데이트하거나 이 명세의 요구 사항을 재정의하는 확장 명세를 작성할 수 있다. 이 명세를 자신의 활동에 적용하는 사람이 그러한 확장 명세의 요구 사항을 인정하기로 결정하면, 해당 확장 명세는 이 명세의 적합성 요구 사항을 위한 적용 가능한 명세가 된다.
누군가는 임의의 바이트 스트림을 적합한 것으로 정의하는 명세를 작성한 다음 자신의 무작위 쓰레기가 적합하다고 주장할 수 있다. 그러나 그렇다고 해서 그 무작위 쓰레기가 모든 사람의 목적에 실제로 적합한 것은 아니다. 다른 사람이 해당 명세가 자신의 작업에는 적용되지 않는다고 판단한다면, 앞서 언급한 무작위 쓰레기는 말 그대로 쓰레기이며 전혀 적합하지 않다고 정당하게 말할 수 있다. 적합성과 관련하여 특정 공동체에서 중요한 것은 그 공동체가 무엇을 적용 가능하다고 합의하는지이다.
사용자 에이전트는 이해하지 못하는 요소와 속성을 의미론적으로 중립적인 것으로 처리해야 한다. 즉, DOM 처리기의 경우 이를 DOM에 남겨 두고 CSS 처리기의 경우 CSS에 따라 스타일을 지정하되, 그로부터 어떠한 의미도 추론해서는 안 된다.
기능 지원이 비활성화된 경우(예: 보안 문제를 완화하기 위한 긴급 조치, 개발 지원 또는 성능상의 이유), 사용자 에이전트는 해당 기능을 전혀 지원하지 않으며 해당 기능이 이 명세에 언급되지 않은 것처럼 동작해야 한다. 예를 들어 특정 기능에 Web IDL 인터페이스의 속성을 통해 접근하는 경우, 해당 인터페이스를 구현하는 객체에서 그 속성 자체가 생략되어야 한다. 객체에 속성을 남겨 두되 null을 반환하거나 예외를 던지게 하는 것만으로는 충분하지 않다.
이 명세에 설명된 방식으로 파싱되거나 생성된 HTML
문서에서 작동하는 XPath 1.0 구현(예: document.evaluate() API의 일부)은
다음 편집 사항이 XPath 1.0 명세에 적용된 것처럼 동작해야 한다.
먼저 다음 단락을 제거한다.
노드 테스트의 QName은 표현식 컨텍스트의 네임스페이스 선언을 사용하여 확장된 이름으로 확장된다. 이는 시작 태그와 종료 태그의 요소 유형 이름을 확장하는 방식과 같지만,
xmlns로 선언된 기본 네임스페이스는 사용하지 않는다. 즉, QName에 접두사가 없으면 네임스페이스 URI는 null이다(이는 속성 이름을 확장하는 방식과 같다). QName에 표현식 컨텍스트에 네임스페이스 선언이 없는 접두사가 있으면 오류이다.
그런 다음 그 자리에 다음 내용을 삽입한다.
노드 테스트의 QName은 표현식 컨텍스트의 네임스페이스 선언을 사용하여 확장된 이름으로 확장된다. QName에 접두사가 있는 경우 표현식 컨텍스트에 해당 접두사에 대한 네임스페이스 선언이 있어야 하며, 해당 네임스페이스 URI가 그 접두사와 연결된다. QName에 표현식 컨텍스트에 네임스페이스 선언이 없는 접두사가 있으면 오류이다.
QName에 접두사가 없고 축의 주 노드 유형이 요소인 경우 기본 요소 네임스페이스가 사용된다. 그렇지 않고 QName에 접두사가 없으면 네임스페이스 URI는 null이다. 기본 요소 네임스페이스는 XPath 표현식 컨텍스트의 구성원이다. DOM3 XPath API를 통해 XPath 표현식을 실행할 때 기본 요소 네임스페이스의 값은 다음과 같이 결정된다.
- 컨텍스트 노드가 HTML DOM에서 온 경우 기본 요소 네임스페이스는 "http://www.w3.org/1999/xhtml"이다.
- 그렇지 않으면 기본 요소 네임스페이스 URI는 null이다.
이는 XPath 2.0의 기본 요소 네임스페이스 기능을 XPath 1.0에 추가하고 HTML 문서의 기본 요소 네임스페이스로 HTML 네임스페이스를 사용하는 것과 같다. 이는 구현이 레거시 HTML 콘텐츠와 호환되면서도 HTML 요소에 사용되는 네임스페이스와 관련하여 이 명세가 HTML에 도입하는 변경 사항을 지원하도록 하려는 목적과 XPath 2.0 대신 XPath 1.0을 사용하려는 목적에서 비롯된다.
이 변경은 XPath 1.0 명세에 대한 의도적 위반이며, 구현이 레거시 콘텐츠와 호환되면서도 HTML 요소에 어떤 네임스페이스가 사용되는지에 관해 이 명세가 HTML에 도입하는 변경 사항을 지원하도록 하기 위한 것이다. [XPATH10]
출력 메서드가 "html"인 경우(명시적으로 지정되거나 XSLT 1.0의 기본 규칙을 통해 지정된 경우) DOM으로 출력하는 XSLT 1.0 처리기는 다음과 같은 영향을 받는다.
변환 프로그램이 네임스페이스가 없는 요소를 출력하는 경우, 처리기는 해당 DOM 요소 노드를 구성하기 전에 요소의 네임스페이스를 HTML 네임스페이스로 변경하고, 요소의 로컬 이름을 ASCII 소문자로 변환하며, 요소의 네임스페이스가 없는 모든 속성 이름도 ASCII 소문자로 변환해야 한다.
이 요구 사항은 XSLT 1.0 명세에 대한 의도적 위반이다. 이 명세가 HTML의 네임스페이스 및 대소문자 구분 규칙을 DOM 기반 XSLT 변환과 호환되지 않는 방식으로 변경하기 때문에 이 요구 사항이 필요하다. (출력을 직렬화하는 처리기는 영향을 받지 않는다.) [XSLT10]
이 명세는 XSLT 처리가 HTML
파서 인프라와 정확히 어떻게 상호작용하는지 명시하지 않는다(예: XSLT 처리기가 요소를
열린 요소 스택에 넣는 것처럼
동작하는지 여부). 그러나 XSLT 처리기는 성공적으로 완료되면 파싱을
중지해야 하며, 중단된 경우 먼저 "interactive"로, 그다음
"complete"로 현재 문서 준비 상태를
업데이트해야 한다.
이 명세는 XSLT가 내비게이션 알고리즘과 어떻게 상호작용하는지, 이벤트 루프에 어떻게 통합되는지 또는 오류 페이지를 어떻게 처리해야 하는지(예: XSLT 오류가 점진적 XSLT 출력을 대체하는지, 인라인으로 렌더링되는지 등)를 명시하지 않는다.
XSLT와 HTML의 상호작용에 관한 추가 비규범적 설명은
script 요소 절에 있으며, XSLT, XPath 및 HTML의
상호작용에 관한 추가 비규범적 설명은 template 요소
절에 있다.
Headers/Permissions-Policy/document-domain
하나의 엔진에서만 지원됨.
이 문서는 다음 정책 제어 기능을 정의한다.
Headers/Feature-Policy/autoplay
Headers/Permissions-Policy/autoplay
하나의 엔진에서만 지원됨.
autoplay"는 'self'의 기본
허용 리스트를 갖는다.cross-origin-isolated"는 'self'의
기본
허용 리스트를 갖는다.
focus-without-user-activation"는
'self'의 기본
허용 리스트를 갖는다.
HTML에는 날짜나 숫자와 같은 특정 데이터 유형을 허용하는 여러 부분이 있다. 이 절에서는 이러한 형식의 콘텐츠에 대한 적합성 기준과 이를 파싱하는 방법을 설명한다.
구현자는 아래에서 설명하는 구문을 파싱하기 위해 사용을 고려하는 모든 서드파티 라이브러리를 신중히 검토할 것이 강력히 권고된다. 예를 들어 날짜 라이브러리는 이 명세에서 요구하는 것과 다른 오류 처리 동작을 구현할 가능성이 높다. 이 명세에서 사용하는 것과 유사한 날짜 구문을 설명하는 명세에서는 오류 처리 동작이 정의되지 않는 경우가 많으므로, 구현마다 오류를 처리하는 방식이 크게 달라지는 경향이 있기 때문이다.
아래에서 설명하는 일부 마이크로 파서는 파싱 중인 문자열을 보유하는 input 변수와 input에서 다음에 파싱할 문자를 가리키는 position 변수를 사용하는 패턴을 따른다.
여러 속성은 불리언 속성이다. 요소에 불리언 속성이 있으면 true 값을 나타내며, 속성이 없으면 false 값을 나타낸다.
속성이 있는 경우 해당 값은 빈 문자열이거나, 선행 또는 후행 공백 없이 속성의 정규 이름과 ASCII 대소문자를 구분하지 않고 일치하는 값이어야 한다.
불리언 속성에는 "true"와 "false" 값을 사용할 수 없다. false 값을 나타내려면 속성 자체를 완전히 생략해야 한다.
다음은 선택되어 있고 비활성화된 체크박스의 예이다. checked 및 disabled
속성이 불리언 속성이다.
< label >< input type = checkbox checked name = cheese disabled > Cheese</ label >
다음과 같이 동일하게 작성할 수도 있다.
< label >< input type = checkbox checked = checked name = cheese disabled = disabled > Cheese</ label >
스타일을 혼합할 수도 있으며, 다음 역시 동일하다.
< label >< input type = 'checkbox' checked name = cheese disabled = "" > Cheese</ label >
열거형 속성이라고 하는 일부 속성은 유한한 상태 집합 중 하나를 취한다. 이러한 속성의 상태는 속성의 값, 키워드와 상태 간의 매핑 집합, 그리고 속성 명세에서 지정할 수도 있는 세 가지 특수 상태를 조합하여 도출된다. 이러한 특수 상태는 잘못된 값 기본값, 누락된 값 기본값, 그리고 빈 값 기본값이다.
여러 키워드가 동일한 상태에 매핑될 수 있다.
속성의 상태를 결정하려면 다음 단계를 사용한다.
저작 적합성을 위해 열거형 속성이 지정된 경우 속성의 값은 다음 중 하나여야 한다.
선행 또는 후행 공백 없이 해당 속성의 적합한 키워드 중 하나와 ASCII 대소문자를 구분하지 않고 일치하는 값.
빈 문자열이며 속성에 빈 값 기본값이 정의되어 있어야 한다.
반영을 위해, 키워드가 하나라도 매핑되는 상태는 정규 키워드를 갖는다고 한다. 이는 다음과 같이 결정된다.
주어진 상태에 매핑되는 키워드가 하나뿐이면 그것이 정규 키워드이다.
주어진 상태에 매핑되는 적합한 키워드가 하나뿐이면 해당 적합한 키워드가 정규 키워드이다.
주어진 상태에 매핑되는 적합한 키워드가 두 개이고 그중 하나가 빈 문자열이면, 빈 문자열이 아닌 적합한 키워드가 정규 키워드이다.
그렇지 않으면 상태의 정규 키워드는 해당 속성의 명세에 명시적으로 제시된다.
문자열이 하나 이상의 ASCII 숫자로 구성되고, 선택적으로 앞에 U+002D HYPHEN-MINUS 문자(-)가 붙으면 유효한 정수이다.
U+002D HYPHEN-MINUS(-) 접두사가 없는 유효한 정수는 해당 숫자 문자열이 십진법으로 나타내는 수를 나타낸다. U+002D HYPHEN-MINUS(-) 접두사가 있는 유효한 정수는 U+002D HYPHEN-MINUS 뒤의 숫자 문자열이 십진법으로 나타내는 수를 0에서 뺀 수를 나타낸다.
정수 파싱 규칙은 다음 알고리즘과 같다. 호출되면 값을 반환하는 첫 번째 단계에서 중단하면서 주어진 순서대로 단계를 따라야 한다. 이 알고리즘은 정수 또는 오류를 반환한다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
sign의 값을 "positive"로 둔다.
position이 주어진 input에서 ASCII 공백을 건너뛴다.
position이 input의 끝을 지난 경우 오류를 반환한다.
position이 가리키는 문자(첫 번째 문자)가 U+002D HYPHEN-MINUS 문자(-)인 경우:
그렇지 않고 position이 가리키는 문자(첫 번째 문자)가 U+002B PLUS SIGN 문자(+)인 경우:
+"는
무시되지만 적합하지는 않다.)position이 가리키는 문자가 ASCII 숫자가 아니면 오류를 반환한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한다. value를 해당 정수로 둔다.
sign이 "positive"이면 value를 반환하고, 그렇지 않으면 0에서 value를 뺀 결과를 반환한다.
문자열이 하나 이상의 ASCII 숫자로 구성되면 유효한 음이 아닌 정수이다.
유효한 음이 아닌 정수는 해당 숫자 문자열이 십진법으로 나타내는 수를 나타낸다.
음이 아닌 정수 파싱 규칙은 다음 알고리즘과 같다. 호출되면 값을 반환하는 첫 번째 단계에서 중단하면서 주어진 순서대로 단계를 따라야 한다. 이 알고리즘은 0, 양의 정수 또는 오류를 반환한다.
input을 파싱 중인 문자열로 둔다.
value를 정수 파싱 규칙을 사용하여 input을 파싱한 결과로 둔다.
value가 오류이면 오류를 반환한다.
value가 0보다 작으면 오류를 반환한다.
value를 반환한다.
문자열이 다음으로 구성되면 유효한 부동 소수점 수이다.
선택적으로 U+002D HYPHEN-MINUS 문자(-).
주어진 순서로 다음 중 하나 또는 둘 다:
선택적으로:
U+0065 LATIN SMALL LETTER E 문자(e) 또는 U+0045 LATIN CAPITAL LETTER E 문자(E) 중 하나.
선택적으로 U+002D HYPHEN-MINUS 문자(-) 또는 U+002B PLUS SIGN 문자 (+).
하나 이상의 ASCII 숫자로 이루어진 시퀀스.
유효한 부동 소수점 수는 가수에 10의 지수승을 곱하여 얻은 수를 나타낸다. 여기서 가수는 첫 번째 수를 십진수로 해석한 값이다(소수점과 소수점 뒤의 수가 있으면 이를 포함하며, 전체 문자열이 U+002D HYPHEN-MINUS 문자(-)로 시작하고 수가 0이 아니면 가수를 음수로 해석한다). 지수는 E 뒤의 수가 있으면 해당 수이다 (E와 수 사이에 U+002D HYPHEN-MINUS 문자(-)가 있고 수가 0이 아니면 음수로 해석하며, E와 수 사이에 U+002B PLUS SIGN 문자(+)가 있으면 이를 무시한다). E가 없으면 지수는 0으로 처리한다.
Infinity 및 Not-a-Number(NaN) 값은 유효한 부동 소수점 수가 아니다.
유효한
부동 소수점 수 개념은 일반적으로
작성자에게 허용되는 값을 제한하는 데만 사용되며, 사용자 에이전트 요구 사항은 아래의
부동 소수점 수 값
파싱 규칙을 사용한다(예: progress 요소의
max 속성).
그러나 일부 경우 사용자 에이전트 요구 사항에는 문자열이 유효한
부동 소수점 수인지 검사하는 과정이 포함된다(예: input 요소의
Number
상태에 대한 값 정제
알고리즘 또는
srcset
속성 파싱 알고리즘).
수 n의 부동 소수점 수로서 가장 좋은 표현은 ToString(n)을 실행하여 얻은 문자열이다. 추상 연산 ToString은 유일하게 결정되지 않는다. 특정 값에 대해 ToString에서 얻을 수 있는 문자열이 여러 개인 경우, 사용자 에이전트는 해당 값에 대해 항상 동일한 문자열을 반환해야 한다 (다른 사용자 에이전트가 사용하는 값과는 다를 수 있다).
부동 소수점 수 값 파싱 규칙은 다음 알고리즘과 같다. 이 알고리즘은 무언가를 반환하는 첫 번째 단계에서 중단되어야 한다. 이 알고리즘은 수 또는 오류를 반환한다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
value의 값을 1로 둔다.
divisor의 값을 1로 둔다.
exponent의 값을 1로 둔다.
position이 주어진 input에서 ASCII 공백을 건너뛴다.
position이 input의 끝을 지난 경우 오류를 반환한다.
position이 가리키는 문자가 U+002D HYPHEN-MINUS 문자(-)인 경우:
그렇지 않고 position이 가리키는 문자(첫 번째 문자)가 U+002B PLUS SIGN 문자(+)인 경우:
+"는
무시되지만 적합하지는 않다.)position이 가리키는 문자가 U+002E FULL STOP(.)이고, 이것이 input의 마지막 문자가 아니며, position이 가리키는 문자 다음의 문자가 ASCII 숫자이면, value를 0으로 설정하고 fraction으로 표시된 단계로 이동한다.
position이 가리키는 문자가 ASCII 숫자가 아니면 오류를 반환한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한다. value에 해당 정수를 곱한다.
Fraction: position이 가리키는 문자가 U+002E FULL STOP(.)이면 다음 하위 단계를 실행한다.
position을 다음 문자로 이동한다.
position이 input의 끝을 지났거나, position이 가리키는 문자가 ASCII 숫자, U+0065 LATIN SMALL LETTER E(e) 또는 U+0045 LATIN CAPITAL LETTER E(E)가 아니면 conversion으로 표시된 단계로 이동한다.
position이 가리키는 문자가 U+0065 LATIN SMALL LETTER E 문자(e) 또는 U+0045 LATIN CAPITAL LETTER E 문자(E)이면 나머지 하위 단계를 건너뛴다.
Fraction loop: divisor에 10을 곱한다.
position을 다음 문자로 이동한다.
position이 input의 끝을 지난 경우 conversion으로 표시된 단계로 이동한다.
position이 가리키는 문자가 ASCII 숫자이면 이 하위 단계의 fraction loop로 표시된 단계로 돌아간다.
position이 가리키는 문자가 U+0065(e) 또는 U+0045(E)인 경우:
position을 다음 문자로 이동한다.
position이 input의 끝을 지난 경우 conversion으로 표시된 단계로 이동한다.
position이 가리키는 문자가 U+002D HYPHEN-MINUS 문자(-)인 경우:
position이 input의 끝을 지난 경우 conversion으로 표시된 단계로 이동한다.
그렇지 않고 position이 가리키는 문자가 U+002B PLUS SIGN 문자(+)인 경우:
position이 input의 끝을 지난 경우 conversion으로 표시된 단계로 이동한다.
position이 가리키는 문자가 ASCII 숫자가 아니면 conversion으로 표시된 단계로 이동한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한다. exponent에 해당 정수를 곱한다.
value에 10의 exponent승을 곱한다.
Conversion: S를 −0을 제외한 유한한 IEEE 754 배정밀도 부동 소수점 값의 집합에 두 특수 값 21024와 −21024를 추가한 집합으로 둔다.
rounded-value를 S에서 value에 가장 가까운 수로 두며, 동일하게 가까운 값이 두 개이면 가수가 짝수인 수를 선택한다. (이 목적을 위해 두 특수 값 21024와 −21024는 가수가 짝수인 것으로 간주한다.)
rounded-value가 21024 또는 −21024이면 오류를 반환한다.
rounded-value를 반환한다.
치수 값 파싱 규칙은 다음 알고리즘과 같다. 호출되면 값을 반환하는 첫 번째 단계에서 중단하면서 주어진 순서대로 단계를 따라야 한다. 이 알고리즘은 0.0 이상인 수 또는 실패를 반환한다. 수가 반환되면 백분율 또는 길이 중 하나로 추가 분류된다.
input을 파싱 중인 문자열로 둔다.
position을 input의 위치 변수로 두고, 처음에는 input의 시작을 가리키게 한다.
position이 주어진 input에서 ASCII 공백을 건너뛴다.
position이 input의 끝을 지났거나 input 내 position의 코드 포인트가 ASCII 숫자가 아니면 실패를 반환한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한다. value를 해당 수로 둔다.
position이 input의 끝을 지난 경우 value를 길이로 반환한다.
input 내 position의 코드 포인트가 U+002E(.)인 경우:
value, input 및 position이 주어진 현재 치수 값을 반환한다.
value, input 및 position이 주어진 현재 치수 값은 다음과 같이 결정된다.
position이 input의 끝을 지난 경우 value를 길이로 반환한다.
input 내 position의 코드 포인트가 U+0025(%)이면 value를 백분율로 반환한다.
value를 길이로 반환한다.
0이 아닌 치수 값 파싱 규칙은 다음 알고리즘과 같다. 호출되면 값을 반환하는 첫 번째 단계에서 중단하면서 주어진 순서대로 단계를 따라야 한다. 이 알고리즘은 0.0보다 큰 수 또는 오류를 반환한다. 수가 반환되면 백분율 또는 길이 중 하나로 추가 분류된다.
input을 파싱 중인 문자열로 둔다.
value를 치수 값 파싱 규칙을 사용하여 input을 파싱한 결과로 둔다.
value가 오류이면 오류를 반환한다.
value가 0이면 오류를 반환한다.
value가 백분율이면 value를 백분율로 반환한다.
value를 길이로 반환한다.
유효한 부동 소수점 수 리스트는 U+002C COMMA 문자로 구분된 여러 유효한 부동 소수점 수이며, 그 밖의 문자는 포함하지 않는다(예: ASCII 공백도 포함하지 않는다). 또한 지정할 수 있는 부동 소수점 수의 개수나 허용되는 값의 범위에 제한이 있을 수 있다.
부동 소수점 수 리스트 파싱 규칙은 다음과 같다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
numbers를 처음에는 비어 있는 부동 소수점 수 리스트로 둔다. 이 리스트가 이 알고리즘의 결과가 된다.
position이 주어진 input에서 ASCII 공백, U+002C COMMA 또는 U+003B SEMICOLON 문자로 이루어진 코드 포인트 시퀀스를 수집한다. 이는 선행 구분 기호를 건너뛴다.
position이 input의 끝을 지나지 않은 동안:
position이 주어진 input에서 ASCII 공백, U+002C COMMA, U+003B SEMICOLON, ASCII 숫자, U+002E FULL STOP 또는 U+002D HYPHEN-MINUS 문자가 아닌 코드 포인트 시퀀스를 수집한다. 이는 선행 쓰레기를 건너뛴다.
position이 주어진 input에서 ASCII 공백, U+002C COMMA 또는 U+003B SEMICOLON 문자가 아닌 코드 포인트 시퀀스를 수집하고, unparsed number를 그 결과로 둔다.
number를 부동 소수점 수 값 파싱 규칙을 사용하여 unparsed number를 파싱한 결과로 둔다.
number가 오류이면 number를 0으로 설정한다.
number를 numbers에 추가한다.
position이 주어진 input에서 ASCII 공백, U+002C COMMA 또는 U+003B SEMICOLON 문자로 이루어진 코드 포인트 시퀀스를 수집한다. 이는 구분 기호를 건너뛴다.
numbers를 반환한다.
치수 리스트 파싱 규칙은 다음과 같다. 이 규칙은 수와 단위로 구성된 0개 이상의 쌍 리스트를 반환하며, 단위는 percentage, relative, absolute 중 하나이다.
raw input을 파싱 중인 문자열로 둔다.
raw input의 마지막 문자가 U+002C COMMA 문자(,)이면 raw input에서 해당 문자를 제거한다.
문자열 raw input을 쉼표를 기준으로 분할한다. raw tokens를 그 결과 토큰 리스트로 둔다.
result를 비어 있는 수/단위 쌍 리스트로 둔다.
raw tokens의 각 토큰에 대해 다음 하위 단계를 실행한다.
input을 해당 토큰으로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
value를 숫자 0으로 둔다.
unit을 absolute로 둔다.
position이 input의 끝을 지난 경우 unit을 relative로 설정하고 마지막 하위 단계로 이동한다.
position의 문자가 ASCII 숫자이면, position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한 다음 value에 해당 정수를 더한다.
position의 문자가 U+002E(.)인 경우:
position이 주어진 input에서 ASCII 공백과 ASCII 숫자로 구성된 코드 포인트 시퀀스를 수집한다. s를 그 결과 시퀀스로 둔다.
s의 모든 ASCII 공백을 제거한다.
s가 빈 문자열이 아닌 경우:
length를 s의 문자 수로 둔다 (공백을 제거한 이후).
fraction을 s를 십진 정수로 해석한 결과를 10length으로 나눈 수로 둔다.
value에 fraction을 더한다.
position이 주어진 input에서 ASCII 공백을 건너뛴다.
position의 문자가 U+0025 PERCENT SIGN 문자(%)이면 unit을 percentage로 설정한다.
그렇지 않고 position의 문자가 U+002A ASTERISK 문자(*)이면 unit을 relative로 설정한다.
value가 나타내는 수와 unit이 나타내는 단위로 구성된 항목을 result에 추가한다.
result 리스트를 반환한다.
아래 알고리즘에서 연도 year의 월 month에 있는 일수는 다음과 같다. month가 1, 3, 5, 7, 8, 10 또는 12이면 31, month가 4, 6, 9 또는 11이면 30, month가 2이고 year가 400으로 나누어떨어지는 수이거나, year가 4로 나누어떨어지지만 100으로는 나누어떨어지지 않는 수이면 29, 그 밖의 경우에는 28이다. 이는 그레고리력의 윤년을 고려한다. [GREGORIAN]
이 절에 정의된 날짜 및 시간 구문에서 ASCII 숫자를 사용하는 경우, 해당 숫자는 십진수를 나타낸다.
여기에서 설명하는 형식은 해당 ISO8601 형식의 부분집합이 되도록 의도되었지만, 이 명세는 ISO8601보다 훨씬 자세하게 파싱 규칙을 정의한다. 따라서 구현자는 아래에서 설명하는 파싱 규칙을 구현하기 위해 날짜 파싱 라이브러리를 사용하기 전에 이를 신중히 검토하는 것이 권장된다. ISO8601 라이브러리는 날짜와 시간을 정확히 동일한 방식으로 파싱하지 않을 수 있다. [ISO8601]
이 명세에서 역산 그레고리력을 언급하는 경우, 이는 현대 그레고리력을 1년까지 거슬러 올라가도록 확장한 것을 의미한다. 역산 그레고리력의 날짜는 때때로 명시적으로 역산 그레고리력 날짜라고 하며, 해당 시기 또는 장소에서 그 달력이 사용되지 않았더라도 그 달력을 사용하여 설명되는 날짜이다. [GREGORIAN]
이 명세에서 전송 형식으로 그레고리력을 사용하는 것은 해당 결정에
관여한 사람들의 문화적 편향에서 비롯된 임의의 선택이다. 폼의 날짜, 시간 및 숫자 형식에 관한 절(작성자용),
폼 컨트롤 현지화에 관한 구현 참고 사항 및 time 요소도 참조한다.
월은 시간대 정보가 없고 연도와 월을 제외한 날짜 정보가 없는 특정 역산 그레고리력 날짜로 구성된다. [GREGORIAN]
문자열이 다음 구성요소를 주어진 순서대로 포함하면 연도 year와 월 month를 나타내는 유효한 월 문자열이다.
월 문자열을 파싱하는 규칙은 다음과 같다. 이는 연도와 월 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
year와 month를 얻기 위해 월 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지나지 않은 경우 실패한다.
year와 month를 반환한다.
input 문자열과 position이 주어진 경우 월 구성요소를 파싱하는 규칙은 다음과 같다. 이는 연도와 월 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 네 문자 이상이 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. year를 해당 수로 둔다.
year가 0보다 큰 수가 아니면 실패한다.
position이 input의 끝을 지났거나 position의 문자가 U+002D HYPHEN-MINUS 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. month를 해당 수로 둔다.
month가 1 ≤ month ≤ 12 범위의 수가 아니면 실패한다.
year와 month를 반환한다.
날짜는 시간대 정보가 없으며 연도, 월 및 일로 구성되는 특정 역산 그레고리력 날짜이다. [GREGORIAN]
문자열이 다음 구성요소를 주어진 순서대로 포함하면 연도 year, 월 month 및 일 day를 나타내는 유효한 날짜 문자열이다.
날짜 문자열을 파싱하는 규칙은 다음과 같다. 이는 날짜 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
year, month 및 day를 얻기 위해 날짜 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지나지 않은 경우 실패한다.
date를 연도가 year, 월이 month, 일이 day인 날짜로 둔다.
date를 반환한다.
input 문자열과 position이 주어진 경우 날짜 구성요소를 파싱하는 규칙은 다음과 같다. 이는 연도, 월 및 일 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
year와 month를 얻기 위해 월 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
maxday를 연도 year의 월 month에 있는 일수로 둔다.
position이 input의 끝을 지났거나 position의 문자가 U+002D HYPHEN-MINUS 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. day를 해당 수로 둔다.
day가 1 ≤ day ≤ maxday 범위의 수가 아니면 실패한다.
year, month 및 day를 반환한다.
연도 없는 날짜는 그레고리력의 월과 해당 월의 일로 구성되지만 연도는 연결되지 않는다. [GREGORIAN]
문자열이 다음 구성요소를 주어진 순서대로 포함하면 월 month와 일 day를 나타내는 유효한 연도 없는 날짜 문자열이다.
즉, month가 2월을 의미하는 "02"인 경우
연도가 윤년인 것처럼 일을 29로 지정할 수 있다.
연도 없는 날짜 문자열을 파싱하는 규칙은 다음과 같다. 이는 월과 일 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
month와 day를 얻기 위해 연도 없는 날짜 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지나지 않은 경우 실패한다.
month와 day를 반환한다.
input 문자열과 position이 주어진 경우 연도 없는 날짜 구성요소를 파싱하는 규칙은 다음과 같다. 이는 월과 일 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
position이 주어진 input에서 U+002D HYPHEN-MINUS 문자(-)인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 0개 또는 2개 문자가 아니면 실패한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. month를 해당 수로 둔다.
month가 1 ≤ month ≤ 12 범위의 수가 아니면 실패한다.
maxday를 임의의 윤년(예: 4 또는 2000)의 월 month에 있는 일수로 둔다.
position이 input의 끝을 지났거나 position의 문자가 U+002D HYPHEN-MINUS 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. day를 해당 수로 둔다.
day가 1 ≤ day ≤ maxday 범위의 수가 아니면 실패한다.
month와 day를 반환한다.
시간은 시간대 정보가 없는 특정 시각이며, 시, 분, 초 및 초의 소수 부분으로 구성된다.
문자열이 다음 구성요소를 주어진 순서대로 포함하면 시 hour, 분 minute 및 초 second를 나타내는 유효한 시간 문자열이다.
second 구성요소는 60 또는 61일 수 없으며, 윤초는 나타낼 수 없다.
시간 문자열을 파싱하는 규칙은 다음과 같다. 이는 시간 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
hour, minute 및 second를 얻기 위해 시간 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지나지 않은 경우 실패한다.
time을 시가 hour, 분이 minute, 초가 second인 시간으로 둔다.
time을 반환한다.
input 문자열과 position이 주어진 경우 시간 구성요소를 파싱하는 규칙은 다음과 같다. 이는 시, 분 및 초 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. hour를 해당 수로 둔다.
position이 input의 끝을 지났거나 position의 문자가 U+003A COLON 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. minute를 해당 수로 둔다.
second를 0으로 둔다.
position이 input의 끝을 지나지 않았고 position의 문자가 U+003A(:)인 경우:
position을 input의 다음 문자로 이동한다.
position이 input의 끝을 지났거나 input의 마지막 문자를 가리키거나, position에서 시작하는 input의 다음 두 문자가 모두 ASCII 숫자가 아니면 실패한다.
position이 주어진 input에서 ASCII 숫자 또는 U+002E FULL STOP 문자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 세 문자이거나, 길이가 세 문자보다 길고 세 번째 문자가 U+002E FULL STOP 문자가 아니거나, U+002E FULL STOP 문자가 두 개 이상이면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진수로 해석한다(소수 부분이 있을 수 있음). second를 해당 수로 설정한다.
second가 0 ≤ second < 60 범위의 수가 아니면 실패한다.
hour, minute 및 second를 반환한다.
현지 날짜와 시간은 연도, 월 및 일로 구성되는 특정 역산 그레고리력 날짜와 시, 분, 초 및 초의 소수 부분으로 구성되는 시간으로 이루어지지만, 시간대 없이 표현된다. [GREGORIAN]
문자열이 다음 구성요소를 주어진 순서대로 포함하면 날짜와 시간을 나타내는 유효한 현지 날짜 및 시간 문자열이다.
문자열이 다음 구성요소를 주어진 순서대로 포함하면 날짜와 시간을 나타내는 유효하게 정규화된 현지 날짜 및 시간 문자열이다.
현지 날짜 및 시간 문자열을 파싱하는 규칙은 다음과 같다. 이는 날짜와 시간 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
year, month 및 day를 얻기 위해 날짜 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지났거나 position의 문자가 U+0054 LATIN CAPITAL LETTER T 문자(T)도 아니고 U+0020 SPACE 문자도 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.
hour, minute 및 second를 얻기 위해 시간 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지나지 않은 경우 실패한다.
date를 연도가 year, 월이 month, 일이 day인 날짜로 둔다.
time을 시가 hour, 분이 minute, 초가 second인 시간으로 둔다.
date와 time을 반환한다.
시간대 오프셋은 부호가 있는 시와 분의 수로 구성된다.
문자열이 다음 중 하나로 구성되면 시간대 오프셋을 나타내는 유효한 시간대 오프셋 문자열이다.
시간대가 UTC인 경우에만 허용되는 U+005A LATIN CAPITAL LETTER Z 문자(Z)
또는 주어진 순서로 다음 구성요소:
이 형식은 -23:59부터 +23:59까지의 시간대 오프셋을 허용한다. 현재 실제 시간대의 오프셋 범위는 -12:00부터 +14:00까지이며, 실제 시간대 오프셋의 분 구성요소는 항상 00, 30 또는 45 중 하나이다. 그러나 시간대는 정치적으로 이용되며 매우 변덕스러운 정책 결정의 영향을 받으므로, 이러한 상태가 영원히 유지된다는 보장은 없다.
정식 시간대가 형성되기 이전의 역사적 시각에 시간대 오프셋을 사용하는 방법에 관한 자세한 내용은 아래 전역 날짜와 시간 절의 사용 참고 사항과 예도 참조한다.
시간대 오프셋 문자열을 파싱하는 규칙은 다음과 같다. 이는 시간대 오프셋 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
timezonehours와 timezoneminutes를 얻기 위해 시간대 오프셋 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지나지 않은 경우 실패한다.
UTC에서 timezonehours시간과 timezoneminutes분만큼 떨어진 시간대 오프셋을 반환한다.
input 문자열과 position이 주어진 경우 시간대 오프셋 구성요소를 파싱하는 규칙은 다음과 같다. 이는 시간대 시와 시간대 분 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
position의 문자가 U+005A LATIN CAPITAL LETTER Z 문자 (Z)인 경우:
timezonehours를 0으로 둔다.
timezoneminutes를 0으로 둔다.
position을 input의 다음 문자로 이동한다.
그렇지 않고 position의 문자가 U+002B PLUS SIGN(+) 또는 U+002D HYPHEN-MINUS(-) 중 하나인 경우:
position의 문자가 U+002B PLUS SIGN(+)이면 sign을 "positive"로 둔다. 그렇지 않으면 U+002D HYPHEN-MINUS(-)이므로 sign을 "negative"로 둔다.
position을 input의 다음 문자로 이동한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. s를 수집된 시퀀스로 둔다.
s의 길이가 정확히 두 문자인 경우:
s를 십진 정수로 해석한다. timezonehours를 해당 수로 둔다.
position이 input의 끝을 지났거나 position의 문자가 U+003A COLON 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. timezoneminutes를 해당 수로 둔다.
s의 길이가 정확히 네 문자인 경우:
s의 처음 두 문자를 십진 정수로 해석한다. timezonehours를 해당 수로 둔다.
s의 마지막 두 문자를 십진 정수로 해석한다. timezoneminutes를 해당 수로 둔다.
그렇지 않으면 실패한다.
그렇지 않으면 실패한다.
timezonehours와 timezoneminutes를 반환한다.
전역 날짜와 시간은 연도, 월 및 일로 구성되는 특정 역산 그레고리력 날짜와 시, 분, 초 및 초의 소수 부분으로 구성되는 시간으로 이루어지며, 부호가 있는 시와 분의 수로 구성되는 시간대 오프셋과 함께 표현된다. [GREGORIAN]
문자열이 다음 구성요소를 주어진 순서대로 포함하면 날짜, 시간 및 시간대 오프셋을 나타내는 유효한 전역 날짜 및 시간 문자열이다.
20세기 중반 UTC가 형성되기 이전 날짜의 시각은 UTC가 아니라 UT1(경도 0°에서의 당시 지구 태양시)을 기준으로 표현하고 해석해야 한다. UTC는 SI 초 단위로 흐르는 UT1의 근사치이다. 시간대가 형성되기 이전의 시각은 적절한 현지 시각과 영국 런던 그리니치 지역에서 관측된 시각 사이의 당시 차이를 근사하는 명시적 시간대를 사용한 UT1 시각으로 표현하고 해석해야 한다.
다음은 유효한 전역 날짜 및 시간 문자열로 작성된 날짜의 몇 가지 예이다.
0037-12-13 00:00Z"1979-10-14T12:00:00.001-04:00"8592-01-01T02:09+02:09"이 날짜들에는 주목할 만한 몇 가지 사항이 있다.
T"를 공백으로 바꾸는 경우 단일 공백 문자여야 한다.
구성요소 사이에 두 개의 공백이 있는 문자열
"2001-12-21 12:00Z"은 성공적으로 파싱되지 않는다.전역 날짜 및 시간 문자열을 파싱하는 규칙은 다음과 같다. 이는 왕복 변환 또는 표시 목적을 위한 관련 시간대 오프셋 정보가 있는 UTC 시각 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
year, month 및 day를 얻기 위해 날짜 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지났거나 position의 문자가 U+0054 LATIN CAPITAL LETTER T 문자(T)도 아니고 U+0020 SPACE 문자도 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.
hour, minute 및 second를 얻기 위해 시간 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지난 경우 실패한다.
timezonehours와 timezoneminutes를 얻기 위해 시간대 오프셋 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지나지 않은 경우 실패한다.
time을 연도 year, 월 month, 일 day, 시 hour, 분 minute, 초 second인 시점에서 timezonehours시간과 timezoneminutes분을 뺀 시점으로 둔다. 해당 시점은 UTC 시간대의 시점이다.
timezone을 UTC에서 timezonehours시간과 timezoneminutes분만큼 떨어진 시간대로 둔다.
time과 timezone을 반환한다.
주는 월요일에 시작하는 7일 기간을 나타내는 주 연도 번호와 주 번호로 구성된다. 이 달력 체계에서 각 주 연도는 아래 정의에 따라 이러한 7일 기간을 52개 또는 53개 갖는다. 그레고리력 날짜 1969년 12월 29일 월요일(1969-12-29)에 시작하는 7일 기간은 주 연도 1970의 1주로 정의된다. 연속된 주에는 순차적으로 번호가 매겨진다. 주 연도의 1주 전 주는 이전 주 연도의 마지막 주이며, 그 반대도 마찬가지이다. [GREGORIAN]
번호가 year인 주 연도는 역산 그레고리력의 연도 year가 목요일을 첫날(1월 1일)로 갖거나, 역산 그레고리력의 연도 year가 수요일을 첫날(1월 1일)로 갖고 year가 400으로 나누어떨어지는 수이거나 4로 나누어떨어지지만 100으로는 나누어떨어지지 않는 수이면 53주를 갖는다. 그 밖의 모든 주 연도는 52주를 갖는다.
53주가 있는 주 연도의 마지막 날의 주 번호는 53이고, 52주가 있는 주 연도의 마지막 날의 주 번호는 52이다.
특정 일의 주 연도 번호는 역산 그레고리력에서 해당 일을 포함하는 연도의 번호와 다를 수 있다. 주 연도 y의 첫 번째 주는 그레고리력 연도 y의 첫 번째 목요일을 포함하는 주이다.
현대적 용도에서 여기에 정의된 주는 ISO 8601에 정의된 ISO 주와 동일하다. [ISO8601]
문자열이 다음 구성요소를 주어진 순서대로 포함하면 주 연도 year와 주 week를 나타내는 유효한 주 문자열이다.
주 문자열을 파싱하는 규칙은 다음과 같다. 이는 주 연도 번호와 주 번호 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 네 문자 이상이 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. year를 해당 수로 둔다.
year가 0보다 큰 수가 아니면 실패한다.
position이 input의 끝을 지났거나 position의 문자가 U+002D HYPHEN-MINUS 문자가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.
position이 input의 끝을 지났거나 position의 문자가 U+0057 LATIN CAPITAL LETTER W 문자(W)가 아니면 실패한다. 그렇지 않으면 position을 한 문자 앞으로 이동한다.
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. 수집된 시퀀스의 길이가 정확히 두 문자가 아니면 실패한다. 그렇지 않으면 그 결과 시퀀스를 십진 정수로 해석한다. week를 해당 수로 둔다.
maxweek를 연도 year의 마지막 날의 주 번호로 둔다.
week가 1 ≤ week ≤ maxweek 범위의 수가 아니면 실패한다.
position이 input의 끝을 지나지 않은 경우 실패한다.
주 연도 번호 year와 주 번호 week를 반환한다.
지속 시간은 초의 수로 구성된다.
월과 초는 비교할 수 없으므로(월은 정확한 초의 수가 아니라, 측정이 시작되는 정확한 날짜에 따라 실제 길이가 달라지는 기간이다), 이 명세에 정의된 지속 시간에는 월 (또는 12개월과 동일한 연도)을 포함할 수 없다. 특정 초의 수를 설명하는 지속 시간만 나타낼 수 있다.
문자열이 다음 중 하나로 구성되면 지속 시간 t를 나타내는 유효한 지속 시간 문자열이다.
리터럴 U+0050 LATIN CAPITAL LETTER P 문자 뒤에 주어진 순서로 다음 하위 구성요소 중 하나 이상이 이어지며, 일, 시, 분 및 초의 수가 t와 동일한 초의 수에 해당한다.
일의 수를 나타내는 하나 이상의 ASCII 숫자 뒤에 U+0044 LATIN CAPITAL LETTER D 문자가 이어진다.
U+0054 LATIN CAPITAL LETTER T 문자 뒤에 주어진 순서로 다음 하위 구성요소 중 하나 이상이 이어진다.
이는 이 명세에 정의된 다른 여러 날짜 및 시간 관련 마이크로구문과 마찬가지로 ISO 8601에 정의된 형식 중 하나를 기반으로 한다. [ISO8601]
각각 서로 다른 지속 시간 구성요소 배율을 갖는 하나 이상의 지속 시간 구성요소가 임의의 순서로 나타나며, 나타낸 초의 합이 t의 초 수와 같아야 한다.
지속 시간 구성요소는 다음 구성요소로 이루어진 문자열이다.
0개 이상의 ASCII 공백.
시간 단위의 수를 나타내는 하나 이상의 ASCII 숫자. 지정된 지속 시간 구성요소 배율(아래 참조)을 곱하여 초의 수를 나타낸다.
지정된 지속 시간 구성요소 배율이 1인 경우(즉, 단위가 초인 경우), 선택적으로 U+002E FULL STOP 문자(.) 뒤에 초의 소수 부분을 나타내는 한 개, 두 개 또는 세 개의 ASCII 숫자가 이어진다.
0개 이상의 ASCII 공백.
지속 시간 구성요소의 숫자 부분에 사용된 시간 단위의 지속 시간 구성요소 배율을 나타내는 다음 문자 중 하나:
0개 이상의 ASCII 공백.
이는 ISO 8601의 어떤 형식도 기반으로 하지 않는다. ISO 8601 지속 시간 형식보다 사람이 읽기 쉬운 대안을 제공하기 위한 것이다.
지속 시간 문자열을 파싱하는 규칙은 다음과 같다. 이는 지속 시간 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
months, seconds 및 component count를 모두 0으로 둔다.
M-disambiguator를 minutes로 둔다.
이 플래그의 다른 값은 months이다. 이는 월과 분에 동일한 단위를 사용하는 ISO8601 지속 시간에서 "M" 단위를 구분하는 데 사용된다. 월은 허용되지 않지만, 향후 호환성을 위해 파싱하며 다른 컨텍스트에서는 유효한 ISO8601 지속 시간을 잘못 해석하지 않도록 한다.
position이 주어진 input에서 ASCII 공백을 건너뛴다.
position이 input의 끝을 지난 경우 실패한다.
position이 가리키는 input의 문자가 U+0050 LATIN CAPITAL LETTER P 문자이면 position을 다음 문자로 이동하고, M-disambiguator를 months로 설정한 다음, position이 주어진 input에서 ASCII 공백을 건너뛴다.
true인 동안:
units를 undefined로 둔다. 이후 다음 값 중 하나가 할당된다. years, months, weeks, days, hours, minutes, seconds.
next character를 undefined로 둔다. 이는 input의 문자를 처리하는 데 사용된다.
position이 input의 끝을 지난 경우 중단한다.
position이 가리키는 input의 문자가 U+0054 LATIN CAPITAL LETTER T 문자이면 position을 다음 문자로 이동하고, M-disambiguator를 minutes로 설정한 다음, position이 주어진 input에서 ASCII 공백을 건너뛰고, 계속한다.
next character를 position이 가리키는 input의 문자로 설정한다.
next character가 U+002E FULL STOP 문자(.)이면 N을 0으로 둔다. (position은 이동하지 않는다. 이는 아래에서 처리된다.)
그렇지 않고 next character가 ASCII 숫자이면, position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집하고, 그 결과 시퀀스를 십진 정수로 해석한 다음 N을 해당 수로 둔다.
그렇지 않으면 next character는 수의 일부가 아니므로 실패한다.
position이 input의 끝을 지난 경우 실패한다.
next character를 position이 가리키는 input의 문자로 설정하고, 이번에는 position을 다음 문자로 이동한다. (앞서 next character가 U+002E FULL STOP 문자(.)였다면 이번에도 여전히 해당 문자이다.)
next character가 U+002E(.)인 경우:
position이 주어진 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집한다. s를 그 결과 시퀀스로 둔다.
s가 빈 문자열이면 실패한다.
length를 s의 문자 수로 둔다.
fraction을 s를 십진 정수로 해석한 결과를 10length으로 나눈 수로 둔다.
N에 fraction을 더한다.
position이 주어진 input에서 ASCII 공백을 건너뛴다.
position이 input의 끝을 지난 경우 실패한다.
next character를 position이 가리키는 input의 문자로 설정하고 position을 다음 문자로 이동한다.
next character가 U+0053 LATIN CAPITAL LETTER S 문자도 아니고 U+0073 LATIN SMALL LETTER S 문자도 아니면 실패한다.
units를 seconds로 설정한다.
그렇지 않으면:
next character가 ASCII 공백이면, position이 주어진 input에서 ASCII 공백을 건너뛰고, next character를 position이 가리키는 input의 문자로 설정한 다음 position을 다음 문자로 이동한다.
next character가 U+0059 LATIN CAPITAL LETTER Y 문자 또는 U+0079 LATIN SMALL LETTER Y 문자이면 units를 years로 설정하고 M-disambiguator를 months로 설정한다.
next character가 U+004D LATIN CAPITAL LETTER M 문자 또는 U+006D LATIN SMALL LETTER M 문자이고 M-disambiguator가 months이면 units를 months로 설정한다.
next character가 U+0057 LATIN CAPITAL LETTER W 문자 또는 U+0077 LATIN SMALL LETTER W 문자이면 units를 weeks로 설정하고 M-disambiguator를 minutes로 설정한다.
next character가 U+0044 LATIN CAPITAL LETTER D 문자 또는 U+0064 LATIN SMALL LETTER D 문자이면 units를 days로 설정하고 M-disambiguator를 minutes로 설정한다.
next character가 U+0048 LATIN CAPITAL LETTER H 문자 또는 U+0068 LATIN SMALL LETTER H 문자이면 units를 hours로 설정하고 M-disambiguator를 minutes로 설정한다.
next character가 U+004D LATIN CAPITAL LETTER M 문자 또는 U+006D LATIN SMALL LETTER M 문자이고 M-disambiguator가 minutes이면 units를 minutes로 설정한다.
next character가 U+0053 LATIN CAPITAL LETTER S 문자 또는 U+0073 LATIN SMALL LETTER S 문자이면 units를 seconds로 설정하고 M-disambiguator를 minutes로 설정한다.
그렇지 않고 next character가 위 문자 중 어느 것도 아니면 실패한다.
component count를 1 증가시킨다.
multiplier를 1로 둔다.
units가 years이면 multiplier에 12를 곱하고 units를 months로 설정한다.
units가 months이면 N과 multiplier의 곱을 months에 더한다.
그렇지 않으면:
units가 weeks이면 multiplier에 7을 곱하고 units를 days로 설정한다.
units가 days이면 multiplier에 24를 곱하고 units를 hours로 설정한다.
units가 hours이면 multiplier에 60을 곱하고 units를 minutes로 설정한다.
units가 minutes이면 multiplier에 60을 곱하고 units를 seconds로 설정한다.
이제 units는 반드시 seconds이다. N과 multiplier의 곱을 seconds에 더한다.
position이 주어진 input에서 ASCII 공백을 건너뛴다.
component count가 0이면 실패한다.
months가 0이 아니면 실패한다.
seconds초로 구성된 지속 시간을 반환한다.
문자열이 다음 중 하나이기도 하면 선택적 시간이 포함된 유효한 날짜 문자열이다.
날짜 또는 시간 문자열을 파싱하는 규칙은 다음과 같다. 이 알고리즘은 날짜, 시간, 전역 날짜와 시간 또는 아무것도 반환하지 않는다. 알고리즘에서 어느 시점이든 "실패한다"고 하면 해당 시점에서 중단되고 아무것도 반환하지 않는다는 뜻이다.
input을 파싱 중인 문자열로 둔다.
position을 input 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
start position을 position과 같은 위치로 설정한다.
date present 및 time present 플래그를 true로 설정한다.
year, month 및 day를 얻기 위해 날짜 구성요소를 파싱한다. 이것이 실패하면 date present 플래그를 false로 설정한다.
date present가 true이고, position이 input의 끝을 지나지 않았으며, position의 문자가 U+0054 LATIN CAPITAL LETTER T 문자(T) 또는 U+0020 SPACE 문자 중 하나이면 position을 input의 다음 문자로 이동한다.
그렇지 않고 date present가 true이며, position이 input의 끝을 지났거나 position의 문자가 U+0054 LATIN CAPITAL LETTER T 문자 (T)도 아니고 U+0020 SPACE 문자도 아니면 time present를 false로 설정한다.
그렇지 않고 date present가 false이면 position을 start position과 같은 위치로 되돌린다.
time present 플래그가 true이면 hour, minute 및 second를 얻기 위해 시간 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
date present 및 time present 플래그가 모두 true이지만 position이 input의 끝을 지난 경우 실패한다.
date present 및 time present 플래그가 모두 true이면 timezonehours 및 timezoneminutes를 얻기 위해 시간대 오프셋 구성요소를 파싱한다. 아무것도 반환하지 않으면 실패한다.
position이 input의 끝을 지나지 않은 경우 실패한다.
date present 플래그가 true이고 time present 플래그가 false이면 date를 연도가 year, 월이 month, 일이 day인 날짜로 두고 date를 반환한다.
그렇지 않고 time present 플래그가 true이고 date present 플래그가 false이면 time을 시가 hour, 분이 minute, 초가 second인 시간으로 두고 time을 반환한다.
그렇지 않으면 time을 연도 year, 월 month, 일 day, 시 hour, 분 minute, 초 second인 시점에서 timezonehours시간과 timezoneminutes분을 뺀 시점으로 두며, 해당 시점은 UTC 시간대의 시점이다. timezone을 UTC에서 timezonehours시간과 timezoneminutes분만큼 떨어진 시간대로 두고, time과 timezone을 반환한다.
일부 폐기된 레거시 속성은 문자열 input이 주어진 레거시 색상 값 파싱 규칙을 사용하여 색상을 파싱한다. 이 규칙은 CSS 색상 또는 실패를 반환한다.
input이 빈 문자열이면 실패를 반환한다.
input에서 선행 및 후행 ASCII 공백을 제거한다.
input이 "transparent"와 ASCII
대소문자를 구분하지 않고 일치하면 실패를 반환한다.
input이 명명된 색상 중 하나와 ASCII 대소문자를 구분하지 않고 일치하면 해당 키워드에 대응하는 CSS 색상을 반환한다. [CSSCOLOR]
CSS2 시스템 색상은 인식되지 않는다.
input의 코드 포인트 길이가 4이고, input의 첫 번째 문자가 U+0023(#)이며, input의 마지막 세 문자가 모두 ASCII 16진수 숫자인 경우:
result를 CSS 색상으로 둔다.
input의 두 번째 문자를 16진수 숫자로 해석한다. result의 빨간색 구성요소를 그 결과에 17을 곱한 수로 둔다.
input의 세 번째 문자를 16진수 숫자로 해석한다. result의 초록색 구성요소를 그 결과에 17을 곱한 수로 둔다.
input의 네 번째 문자를 16진수 숫자로 해석한다. result의 파란색 구성요소를 그 결과에 17을 곱한 수로 둔다.
result를 반환한다.
input에서 U+FFFF보다 큰 모든 코드 포인트(즉, 기본 다국어 평면에 속하지 않는 모든 문자)를
"00"으로 바꾼다.
input의 코드 포인트 길이가 128보다 크면 처음 128개 문자만 남도록 input을 잘라낸다.
input의 첫 번째 문자가 U+0023(#)이면 해당 문자를 제거한다.
input에서 ASCII 16진수 숫자가 아닌 모든 문자를 U+0030(0)으로 바꾼다.
input의 코드 포인트 길이가 0이거나 3의 배수가 아닌 동안 input에 U+0030(0)을 추가한다.
세 구성요소를 얻기 위해 input을 동일한 코드 포인트 길이를 갖는 세 문자열로 나눈다. length를 각 구성요소의 코드 포인트 길이(input의 코드 포인트 길이의 3분의 1)로 둔다.
length가 8보다 크면 각 구성요소에서 앞쪽의 length-8개 문자를 제거하고 length를 8로 둔다.
length가 2보다 크고 각 구성요소의 첫 번째 문자가 U+0030(0)인 동안 해당 문자를 제거하고 length를 1 감소시킨다.
length가 여전히 2보다 크면 각 구성요소에서 처음 두 문자만 남도록 잘라낸다.
result를 CSS 색상으로 둔다.
첫 번째 구성요소를 16진수로 해석한다. result의 빨간색 구성요소를 그 결과로 둔다.
두 번째 구성요소를 16진수로 해석한다. result의 초록색 구성요소를 그 결과로 둔다.
세 번째 구성요소를 16진수로 해석한다. result의 파란색 구성요소를 그 결과로 둔다.
result를 반환한다.
공백으로 구분된 토큰 집합은 하나 이상의 ASCII 공백으로 구분된 0개 이상의 단어 (토큰이라고 함)를 포함하는 문자열이다. 각 단어는 하나 이상의 문자로 구성된 임의의 문자열이며, 그중 어느 문자도 ASCII 공백이 아니다.
공백으로 구분된 토큰 집합을 포함하는 문자열은 선행 또는 후행 ASCII 공백을 가질 수 있다.
고유한 공백 구분 토큰의 순서 없는 집합은 토큰이 중복되지 않는 공백으로 구분된 토큰 집합이다.
고유한 공백 구분 토큰의 순서 있는 집합은 토큰이 중복되지 않지만 토큰의 순서에는 의미가 있는 공백으로 구분된 토큰 집합이다.
공백으로 구분된 토큰 집합에는 허용되는 값의 집합이 정의되어 있는 경우가 있다. 허용되는 값의 집합이 정의되어 있으면 모든 토큰은 해당 허용 값 리스트에 속해야 하며, 다른 값은 부적합하다. 그러한 허용 값 집합이 제공되지 않으면 모든 값이 적합하다.
공백으로 구분된 토큰 집합의 토큰을 비교하는 방법(예: 대소문자를 구분하는지 여부)은 집합별로 정의된다.
쉼표로 구분된 토큰 집합은 각각이 다음 토큰과 단일 U+002C COMMA 문자(,)로 구분되는 0개 이상의 토큰을 포함하는 문자열이다. 각 토큰은 0개 이상의 문자로 구성된 임의의 문자열이며, ASCII 공백으로 시작하거나 끝나지 않고, U+002C COMMA 문자(,)를 포함하지 않으며, 선택적으로 ASCII 공백으로 둘러싸일 수 있다.
예를 들어 문자열 " a ,b,,d d "은 "a", "b",
빈 문자열 및 "d d"라는 네 개의 토큰으로 구성된다. 각 토큰 주변의 선행 및 후행
공백은 토큰의 일부로 간주되지 않으며, 빈 문자열도 토큰이 될 수 있다.
쉼표로 구분된 토큰 집합에는 유효한 토큰을 구성하는 항목에 추가 제한이 있는 경우가 있다. 그러한 제한이 정의되어 있으면 모든 토큰은 해당 제한을 충족해야 하며, 다른 값은 부적합하다. 그러한 제한이 지정되지 않으면 모든 값이 적합하다.
유형 type인 요소에 대한 유효한 해시 이름 참조는
U+0023 NUMBER SIGN 문자(#) 뒤에 동일한 트리에 있는
유형 type인 요소의 name 속성값과 정확히 일치하는 문자열이 이어지는
문자열이다.
컨텍스트 노드 scope가 주어진 경우 유형 type인 요소에 대한 해시 이름 참조 파싱 규칙은 다음과 같다.
파싱 중인 문자열에 U+0023 NUMBER SIGN 문자가 없거나, 문자열에서 처음 나타나는 해당 문자가 문자열의 마지막 문자이면 null을 반환한다.
s를 파싱 중인 문자열에서 첫 번째 U+0023 NUMBER SIGN 문자 바로 다음 문자부터 해당 문자열의 끝까지의 문자열로 둔다.
scope의 트리에서
트리 순서상 id 또는
name 속성의 값이 s인 유형 type의 첫 번째 요소를 반환하고,
그러한 요소가 없으면 null을 반환한다.
파싱할 때 id
속성이
고려되지만, 값이 유효한
해시 이름
참조인지 결정할 때는 사용되지 않는다. 즉, id를 기준으로
요소를 참조하는 해시 이름 참조는 적합성 오류이다. 단, 해당 요소에 동일한 값을 갖는
name 속성도 있는 경우는 제외한다.
문자열이 미디어 쿼리의 <media-query-list> 생성 규칙과
일치하면 유효한 미디어 쿼리 리스트이다.
[MQ]
문자열이 빈 문자열이거나, ASCII 공백만으로 이루어진 문자열이거나, 미디어 쿼리에 제시된 정의에 따라 사용자의 환경과 일치하는 미디어 쿼리 리스트이면 해당 문자열은 사용자의 환경과 일치한다. [MQ]
고유한 내부 값은 직렬화할 수 있고, 값으로 비교할 수 있으며, 스크립트에 노출되지 않는 값이다.
새로운 고유한 내부 값을 생성하려면 이 알고리즘이 이전에 한 번도 반환한 적 없는 고유한 내부 값을 반환한다.
문자열이 유효한 URL 문자열이지만 빈 문자열이 아니면 유효한 비어 있지 않은 URL이다.
문자열에서 선행 및 후행 ASCII 공백을 제거한 후 유효한 URL 문자열이면 공백으로 둘러싸일 수 있는 유효한 URL이다.
문자열에서 선행 및 후행 ASCII 공백을 제거한 후 유효한 비어 있지 않은 URL이면 공백으로 둘러싸일 수 있는 유효한 비어 있지 않은 URL이다.
이 명세는 URL about:legacy-compat를
해석할 수는 없지만 예약된 about: URL로 정의하며,
XML 도구와의 호환성을 위해 필요한 경우 HTML 문서의
DOCTYPE에서 사용한다.
[ABOUT]
이 명세는 URL about:html-kind를
해석할 수는 없지만 예약된 about: URL로 정의하며,
미디어 트랙 종류의 식별자로 사용한다. [ABOUT]
이 명세는 URL about:srcdoc를
해석할 수는 없지만 예약된 about: URL로 정의하며,
iframe
srcdoc 문서의 URL로 사용한다.
[ABOUT]
URL의 스킴이
"about"이고, 경로가
단일 문자열 "blank"를 포함하며, 사용자 이름과
비밀번호가
빈 문자열이고, 호스트가 null이면
해당 URL은 about:blank와 일치한다.
그러한 URL의 쿼리와
프래그먼트는
null이 아닐 수 있다. 예를 들어 "about:blank?foo#bar"를 파싱하여 생성된 URL 레코드는
about:blank와
일치한다.
URL의 스킴이
"about"이고, 경로가
단일 문자열 "srcdoc"을 포함하며, 쿼리가 null이고,
사용자 이름과
비밀번호가
빈 문자열이며, 호스트가 null이면
해당 URL은 about:srcdoc과 일치한다.
about:srcdoc과
일치한다가
URL의 쿼리가 null임을
보장하는 이유는, URL이 about:blank와
일치하는 Document와 달리,
iframe
srcdoc 문서에서는 URL의
쿼리가
null이 아닌 문서를 생성할 수 없기 때문이다. 다시 말해 URL 중
about:srcdoc과
일치하는 모든 URL의 집합은 프래그먼트만 서로 다르다.
URL을 파싱하는 것은 문자열을 받아 그것이 나타내는 URL 레코드를 얻는 과정이다. 이 과정은 URL에 정의되어 있지만, HTML 표준은 기준 URL과 인코딩을 추상화하는 여러 래퍼를 정의한다. [URL]
대부분의 새 API는 URL을 파싱해야 한다. 오래된 API와 HTML 요소는 URL을 인코딩 파싱해야 할 이유가 있을 수 있다. 사용자 정의 기준 URL이 필요하거나 기준 URL을 원하지 않는 경우에는 물론 URL 파서를 직접 사용할 수도 있다.
문자열 url과, 해당 문자열의 기준이 되는 Document 객체
또는
환경 설정 객체
environment가
주어진 경우 URL을 파싱하려면 다음 단계를 실행한다.
이 단계는 실패 또는 URL을 반환한다.
environment가 Document 객체이면
baseURL을 environment의 기준
URL로 두고, 그렇지 않으면 environment의
API 기준 URL로 둔다.
url과 baseURL을 사용하여 URL 파서를 적용한 결과를 반환한다.
문자열 url과, 해당 문자열의 기준이 되는 Document 객체 또는
환경
설정 객체 environment가 주어진 경우
URL을 인코딩 파싱하려면 다음 단계를 실행한다.
이 단계는 실패 또는 URL을 반환한다.
encoding을 UTF-8로 둔다.
environment가 Document 객체이면
encoding을 environment의 문자
인코딩으로 설정한다.
그렇지 않고 environment의 관련 전역 객체가
Window 객체이면,
encoding을 environment의 관련
전역 객체의 연관된
Document의 문자
인코딩으로 설정한다.
environment가 Document 객체이면
baseURL을 environment의 기준
URL로 두고, 그렇지 않으면 environment의
API 기준 URL로 둔다.
url, baseURL 및 encoding을 사용하여 URL 파서를 적용한 결과를 반환한다.
문자열 url과, 해당 문자열의 기준이 되는 Document
객체 또는
환경 설정
객체 environment가 주어진 경우
URL을 인코딩 파싱하고 직렬화하려면
다음 단계를 실행한다. 이 단계는 실패 또는 문자열을 반환한다.
url을 environment를 기준으로 url이 주어진 URL을 인코딩 파싱한 결과로 둔다.
url이 실패이면 실패를 반환한다.
url에 URL 직렬화기를 적용한 결과를 반환한다.
Document 객체
document의 대체 기준 URL은 다음 단계를 실행하여
얻는 URL 레코드이다.
document가 iframe
srcdoc 문서인 경우:
단언: document의 about 기준 URL은 null이 아니다.
document의 about 기준 URL을 반환한다.
document의 URL이
about:blank와
일치하고 document의 about 기준 URL이 null이 아니면,
document의 about 기준
URL을 반환한다.
document의 URL을 반환한다.
Document
document의 URL을 설정하여 URL
레코드 url로 만들려면:
document의 URL을 url로 설정한다.
document가 주어진 기준 URL 변경에 대응한다.
Document
document의 기준 URL 변경에 대응하려면:
사용자 에이전트는 영향을 받는 URL 또는 그러한 URL에서 파생된 데이터를 사용자에게 표시하는
모든 사용자 인터페이스 요소를 업데이트하는 것이 좋다. 그러한 사용자 인터페이스 요소의 예로는
하이퍼링크의
url을 표시하는
상태 표시줄이나, q, blockquote, ins 또는
del
요소의 cite 속성에 지정된 URL을 표시하는 사용자 인터페이스가 있다.
document의 섀도를 포함하는 자손 각각의 descendant에 대해 다음을 수행한다.
descendant가 결과가 예측 규칙 파싱
결과인 script 요소인 경우:
oldResult를 element의 결과로 둔다.
newResult를 element의 자식 텍스트 콘텐츠와 element의 노드 문서가 주어진 예측 규칙 파싱 결과를 생성한 결과로 둔다.
element의 관련 전역 객체, oldResult 및 newResult가 주어진 예측 규칙을 업데이트한다.
document가 주어진 예측 로드를 고려한다.
이는 기준 URL을 변경해도 예를 들어
img 요소가 표시하는
이미지에는 영향을 주지 않는다는 의미이다. 따라서 이후 스크립트에서 src IDL 속성에 접근하면,
현재 표시 중인 이미지와 더 이상 대응하지 않을 수 있는 새로운 절대 URL을 반환한다.
url, destination, corsAttributeState 및 선택적인 동일 출처 대체 플래그가 주어진 경우 잠재적 CORS 요청을 생성하려면 다음 단계를 실행한다.
corsAttributeState가 CORS
없음이면 mode를
"no-cors"로 두고, 그렇지 않으면 "cors"로 둔다.
동일 출처 대체 플래그가 설정되어 있고 mode가 "no-cors"이면,
mode를 "same-origin"으로 설정한다.
credentialsMode를 "include"로 둔다.
corsAttributeState가 익명이면 credentialsMode를
"same-origin"으로 설정한다.
요청의 URL이 url이고, 대상이 destination이며, 모드가 mode이고, 자격 증명 모드가 credentialsMode이며, URL 자격 증명 사용 플래그가 설정된 새로운 요청을 반환한다.
리소스의 Content-Type 메타데이터는 MIME 스니핑의 요구 사항과 일치하는 방식으로 가져오고 해석해야 한다. [MIMESNIFF]
리소스의 계산된 MIME 유형은 MIME 스니핑에 제시된 요구 사항과 일치하는 방식으로 찾아야 한다. [MIMESNIFF]
이미지를 구체적으로 스니핑하는 규칙, 리소스가 텍스트인지 바이너리인지 구분하는 규칙 및 오디오와 비디오를 구체적으로 스니핑하는 규칙도 MIME 스니핑에 정의되어 있다. 이 규칙은 결과로 MIME 유형을 반환한다. [MIMESNIFF]
MIME 스니핑의 규칙을 정확히 따라야 한다. 사용자 에이전트가 서버가 예상하는 것과 다른 휴리스틱을 콘텐츠 유형 감지에 사용하면 보안 문제가 발생할 수 있다. 자세한 내용은 MIME 스니핑을 참조한다. [MIMESNIFF]
meta
요소에서 문자 인코딩 추출문자열 s가 주어진 경우
meta 요소에서
문자 인코딩을 추출하는 알고리즘은 다음과 같다. 이는 문자 인코딩 또는
아무것도 반환하지 않는다.
position을 s 내부를 가리키는 포인터로 두고, 처음에는 문자열의 시작을 가리키게 한다.
루프: position 이후의 s에서 단어
"charset"과 ASCII
대소문자를 구분하지 않고 일치하는
첫 번째 일곱 문자를 찾는다. 일치 항목을 찾지 못하면 아무것도 반환하지 않는다.
단어 "charset" 바로 뒤에 오는 모든 ASCII 공백을 건너뛴다
(공백이 없을 수도 있다).
다음 문자가 U+003D EQUALS SIGN(=)이 아니면 position을 해당 다음 문자 바로 앞으로 이동하고 루프로 표시된 단계로 돌아간다.
등호 바로 뒤에 오는 모든 ASCII 공백을 건너뛴다 (공백이 없을 수도 있다).
다음 문자를 다음과 같이 처리한다.
이 알고리즘은 HTTP 명세의 알고리즘과 다르다. 예를 들어 HTTP는 작은따옴표 사용을 허용하지 않으며, 이 알고리즘이 지원하지 않는 백슬래시 이스케이프 메커니즘을 지원하도록 요구한다. 이 알고리즘은 역사적으로 HTTP와 관련된 컨텍스트에서 사용되지만, 구현이 지원하는 구문은 오래전에 서로 달라졌다. [HTTP]
현재 모든 엔진에서 지원됨.
CORS 설정 속성은 다음 키워드와 상태를 갖는 열거형 속성이다.
| 키워드 | 상태 | 간단한 설명 |
|---|---|---|
anonymous
|
익명 | 요소에 대한 요청은
모드가
"cors"로 설정되고,
자격 증명 모드가
"same-origin"으로 설정된다.
|
use-credentials
|
자격 증명 사용 | 요소에 대한 요청은 모드가
"cors"로 설정되고, 자격 증명 모드가
"include"로 설정된다.
|
CORS 설정 속성이 제어하는 대부분의 가져오기는 잠재적 CORS 요청 생성 알고리즘을 통해 수행된다.
요청의 모드가 항상
"cors"인
더 현대적인 기능에서는 일부 CORS 설정
속성이 약간 다른 의미를 갖도록 용도가 변경되었으며, 이 경우 해당 속성은
요청의 자격 증명 모드에만 영향을 준다.
이 변환을 수행하기 위해 주어진 CORS
설정 속성의 CORS 설정 속성 자격 증명 모드를 속성 상태에
따라
다음과 같이 결정하도록 정의한다.
리퍼러 정책 속성은 열거형 속성이다. 빈 문자열을 포함한 각 리퍼러 정책은 이 속성의 키워드이며 동일한 이름의 상태에 매핑된다.
이러한 상태가 여러 가져오기의 처리 모델에 미치는 영향은 이 명세 전반과 Fetch 및 Referrer Policy에 더 자세히 정의되어 있다. [FETCH] [REFERRERPOLICY]
여러 신호가 주어진 가져오기에 어떤 처리 모델이 사용되는지 결정하는 데 영향을 줄 수 있으며, 리퍼러 정책 속성은 그중 하나일 뿐이다. 일반적으로 이러한 신호를 처리하는 순서는 다음과 같다.
먼저 noreferrer 링크
유형의 존재 여부.
그다음 리퍼러 정책 속성의 값.
마지막으로 `Referrer-Policy`
HTTP
헤더.
현재 모든 엔진에서 지원됨.
nonce 콘텐츠
속성은 콘텐츠 보안 정책이 주어진 가져오기의 진행 허용 여부를 결정하는 데
사용할 수 있는 암호학적 논스("한 번만 사용되는 숫자")를 나타낸다. 값은 텍스트이다.
[CSP]
nonce 콘텐츠
속성이 있는 요소는 콘텐츠 속성에서 값을 가져와
[[CryptographicNonce]]라는 내부 슬롯으로 옮기고,
HTMLOrSVGOrMathMLElement
인터페이스 믹스인을 통해 스크립트에 노출한 다음 콘텐츠 속성을
빈 문자열로 설정함으로써, 암호학적 논스가 스크립트에만 노출되고 CSS 속성 선택기와 같은
사이드 채널에는 노출되지 않도록 한다. 별도로 지정하지 않는 한 슬롯의 값은 빈 문자열이다.
element.nonce
element의 암호학적 논스에 설정된 값을 반환한다. 설정자가 사용되지
않았다면 이는 원래 nonce
콘텐츠 속성에서 발견된 값이다.
element.nonce = value
element의 암호학적 논스 값을 업데이트한다.
nonce IDL 속성은 가져올 때
이 요소의 [[CryptographicNonce]] 값을 반환해야
하며,
설정할 때 이 요소의 [[CryptographicNonce]]를
주어진 값으로
설정해야 한다.
nonce IDL 속성의 설정자가
대응하는 콘텐츠 속성을 업데이트하지 않는다는 점에 유의한다. 이것과 아래에서 요소가
브라우징 컨텍스트에
연결될 때
nonce 콘텐츠 속성을
빈 문자열로 설정하는 것은 선택기처럼 콘텐츠 속성을 쉽게 읽을 수 있는 메커니즘을 통해
논스 값이 유출되는 것을 방지하기 위한 것이다. 이 동작이 도입된
이슈 #2369에서 자세히 알아볼 수 있다.
다음 속성 변경
단계는 nonce 콘텐츠 속성에 사용된다.
element가 HTMLOrSVGOrMathMLElement을 포함하지 않으면 반환한다.
localName이 nonce가 아니거나
namespace가 null이 아니면 반환한다.
value가 null이면 element의 [[CryptographicNonce]]를 빈 문자열로 설정한다.
그렇지 않으면 element의 [[CryptographicNonce]]를 value로 설정한다.
HTMLOrSVGOrMathMLElement을 포함하는
요소가 브라우징
컨텍스트에 연결될 때마다,
사용자 에이전트는 element에 대해 다음 단계를 실행해야 한다.
CSP list를 element의 섀도를 포함하는 루트의 정책 컨테이너의 CSP 리스트로 둔다.
CSP list가 헤더로 전달된 콘텐츠
보안 정책을 포함하고, element에 값이 빈 문자열이 아닌
nonce
콘텐츠 속성이 있는 경우:
nonce를 element의 [[CryptographicNonce]]로 둔다.
element의 [[CryptographicNonce]]를 nonce로 설정한다.
element의 [[CryptographicNonce]]가 복원되지 않았다면 이 시점에서 빈 문자열이 된다.
node, copy 및 subtree가 주어진 경우
HTMLOrSVGOrMathMLElement을 포함하는 요소의 복제 단계는
copy의 [[CryptographicNonce]]를
node의 [[CryptographicNonce]]로 설정하는 것이다.
현재 모든 엔진에서 지원됨.
지연 로딩 속성은 다음 키워드와 상태를 갖는 열거형 속성이다.
| 키워드 | 상태 | 간단한 설명 |
|---|---|---|
lazy
|
지연 | 일부 조건이 충족될 때까지 리소스 가져오기를 지연하는 데 사용된다. |
eager
|
즉시 | 리소스를 즉시 가져오는 데 사용되며 기본 상태이다. |
이 속성은 현재 상태에 따라 사용자 에이전트가 리소스를 즉시 가져오거나, 요소와 관련된 일부 조건이 충족될 때까지 가져오기를 지연하도록 지시한다.
요소 element가 주어진 경우 요소가 지연 로딩될지 판단하는 단계는 다음과 같다.
element에 대해 스크립팅이 비활성화되어 있으면 false를 반환한다.
이는 추적 방지 조치이다. 스크립팅이 비활성화된 상태에서도 사용자 에이전트가 지연 로딩을 지원한다면, 서버가 요청된 이미지의 수와 시점을 추적할 수 있도록 이미지들을 페이지 마크업에 전략적으로 배치함으로써 사이트가 세션 전반에 걸친 사용자의 대략적인 스크롤 위치를 여전히 추적할 수 있기 때문이다.
false를 반환한다.
각 img, audio, video 및 iframe 요소에는
처음에는 null인 연관된
지연 로드 재개 단계가 있다.
각 video 요소에는
처음에는 null인 연관된 포스터 지연 로드 재개 단계도 있다.
지연
로딩될 img, audio, video 및 iframe 요소의 경우,
이러한 단계는 지연
로드
교차 관찰자의 콜백에서 실행되거나, 해당 요소의 지연 로딩
속성이 즉시 상태로 설정될
때 실행된다.
이로 인해 요소가 로딩을 계속한다. video 요소의 경우
포스터 지연
로드
재개 단계도 동시에 실행된다.
각 Document에는 처음에는
null로 설정되어 있지만 IntersectionObserver
인스턴스로 설정할 수 있는 지연 로드 교차 관찰자가 있다.
element인 지연 로딩 요소의 교차 관찰을 시작하려면 다음 단계를 실행한다.
doc를 element의 노드 문서로 둔다.
doc의 지연 로드 교차 관찰자가
null이면 다음과 같이 초기화된 새로운 IntersectionObserver
인스턴스로 설정한다.
의도는 IntersectionObserver
생성자의 원래 값을 사용하는 것이다. 그러나 Intersection Observer가
명세에서 사용할 수 있는 저수준 훅을 노출할 때까지 이 명세에서는 JavaScript에 노출된
생성자를 사용할 수밖에 없다. 이를 추적하는 버그
w3c/IntersectionObserver#464를
참조한다. [INTERSECTIONOBSERVER]
callback은 인수 entries 및 observer를 받는 다음 단계이다.
entries의 각 entry에 대해 개발자가 수정할 수 있는 배열 접근자 또는 반복 훅을 트리거하지 않는 반복 메서드를 사용하여 다음을 수행한다.
resumptionSteps를 null로 둔다.
entry.isIntersecting이
true이면 resumptionSteps를
entry.target의
지연
로드 재개 단계로 설정한다.
posterResumptionSteps를 null로 둔다.
entry.isIntersecting이
true이고 entry.target이
video
요소이면 posterResumptionSteps를 video
요소의 포스터 지연 로드 재개
단계로 설정한다.
resumptionSteps가 null이고 posterResumptionSteps도 null이면 반환한다.
entry.target에
대해 지연 로딩
요소의 교차 관찰을 중지한다.
resumptionSteps가 null이 아닌 경우:
entry.target의
지연 로드 재개
단계를 null로 설정한다.
resumptionSteps를 호출한다.
posterResumptionSteps가 null이 아닌 경우:
video
요소의 포스터 지연 로드 재개
단계를 null로 설정한다.
posterResumptionSteps를 호출한다.
의도는 isIntersecting
및
target
가져오기의 원래 값을 사용하는 것이다. w3c/IntersectionObserver#464를
참조한다.
[INTERSECTIONOBSERVER]
options는 다음 딕셔너리 멤버를 갖는 IntersectionObserverInit
딕셔너리이다. «[ "scrollMargin" → 지연 로드 스크롤
여백 ]»
이를 통해 이미지가 아직 뷰포트와 교차하지 않지만 곧 교차하려는 스크롤 도중에 이미지를 가져올 수 있다.
지연 로드
스크롤 여백에 대한 제안은
값의 동적 변경을 암시하지만 IntersectionObserver
API는 스크롤 여백 변경을 지원하지 않는다. 이슈
w3c/IntersectionObserver#428을
참조한다.
element를 인수로 사용하여 doc의
지연
로드 교차 관찰자의
observe
메서드를 호출한다.
의도는 observe
메서드의 원래 값을 사용하는 것이다. w3c/IntersectionObserver#464를
참조한다.
[INTERSECTIONOBSERVER]
element인 지연 로딩 요소의 교차 관찰을 중지하려면 다음 단계를 실행한다.
doc를 element의 노드 문서로 둔다.
단언: doc의 지연 로드 교차 관찰자는 null이 아니다.
element를 인수로 사용하여 doc의
지연
로드 교차 관찰자의
unobserve
메서드를 호출한다.
의도는 unobserve
메서드의 원래 값을 사용하는 것이다. w3c/IntersectionObserver#464를
참조한다.
[INTERSECTIONOBSERVER]
지연 로드 스크롤 여백은
구현 정의 값이지만 다음 제안을 고려한다.
주어진 장치의 일반적인 사용 패턴에서 리소스가 뷰포트와 교차하기 전에 로드되는 결과를 가장 자주 만드는 최솟값을 설정한다.
일반적인 스크롤 속도: 일반적인 스크롤 속도가 빠른 장치에서는 값을 늘린다.
현재 스크롤 속도 또는 운동량: 사용자 에이전트는 스크롤이 멈출 가능성이 높은 지점을 예측하고 그에 따라 값을 조정할 수 있다.
네트워크 품질: 느리거나 지연 시간이 긴 연결에서는 값을 늘린다.
사용자 환경 설정이 값에 영향을 줄 수 있다.
지연 로드 스크롤 여백이 추가 정보를 유출하지 않도록 하는 것은 개인정보 보호를 위해 중요하다. 예를 들어 새로운 핑거프린팅 벡터가 도입되지 않도록 현재 장치의 일반적인 스크롤 속도를 부정확하게 표현할 수 있다.
차단 속성은 외부 리소스를 가져올 때 특정 작업을 차단해야 함을 명시적으로 나타낸다. 차단할 수 있는 작업은 다음 표에 나열된 문자열인 가능한 차단 토큰으로 나타낸다.
| 가능한 차단 토큰 | 설명 |
|---|---|
"render"
|
요소는 잠재적으로 렌더링을 차단한다. |
향후 더 많은 가능한 차단 토큰이 생길 수 있다.
차단 속성의 값은 각 항목이 가능한 차단 토큰인 고유한 공백 구분 토큰의 순서 없는 집합이어야 한다. 차단 속성의 지원되는 토큰은 가능한 차단 토큰이다. 모든 요소는 최대 하나의 차단 속성을 가질 수 있다.
요소 el의 차단 토큰 집합은 다음 단계의 결과이다.
value를 el의 차단 속성 값으로 두고, 그러한 속성이 없으면 빈 문자열로 둔다.
value를 ASCII 소문자로 변환된 value로 설정한다.
rawTokens를 value를 ASCII 공백으로 분할한 결과로 둔다.
rawTokens의 요소 중 가능한 차단 토큰인 요소를 포함하는 집합을 반환한다.
요소의 차단 토큰 집합이
"render"를 포함하거나, 요소가 개별 요소에서
정의되는 암묵적으로 잠재적 렌더링 차단인 경우,
해당 요소는 잠재적으로 렌더링을 차단한다.
기본적으로 요소는 암묵적으로 잠재적 렌더링 차단이
아니다.
가져오기 우선순위 속성은 다음 키워드와 상태를 갖는 열거형 속성이다.
| 키워드 | 상태 | 간단한 설명 |
|---|---|---|
high
|
높음 | 동일한 대상을 갖는 다른 리소스에 비해 우선순위가 높은 가져오기임을 나타낸다. |
low
|
낮음 | 동일한 대상을 갖는 다른 리소스에 비해 우선순위가 낮은 가져오기임을 나타낸다. |
auto
|
자동 | 동일한 대상을 갖는 다른 리소스에 비해 가져오기 우선순위를 자동으로 결정하도록 나타낸다. |
반영을 위한 구성 요소는 다음과 같다.
반영 대상은 요소 또는 ElementInternals
객체이다. 일반적으로 컨텍스트에서 명확하며, 대개 반영된 IDL 속성의
인터페이스와 동일하다. ElementInternals
객체인 경우에는 항상 해당 인터페이스와 동일하다.
반영된 IDL 속성은 속성 인터페이스 멤버이다.
반영된 콘텐츠 속성 이름은 문자열이다. 반영
대상이 요소인 경우 네임스페이스가 null인 콘텐츠 속성의 로컬 이름을 나타낸다. 반영 대상이 ElementInternals
객체인 경우 반영
대상의 대상
요소의 내부 콘텐츠 속성
맵에 있는 키를 나타낸다.
반영된 IDL 속성은 반영 대상의 반영된 콘텐츠 속성 이름을 반영하도록 정의할 수 있다. 일반적으로 이는 IDL 속성 가져오기가 콘텐츠 속성의 현재 값을 반환하고, 설정자가 콘텐츠 속성의 값을 주어진 값으로 변경한다는 뜻이다.
반영 대상에는 다음 연관 알고리즘이 있다.
요소 element인 반영 대상에 대해 다음과 같이 정의된다.
element를 반환한다.
attribute를 null, 반영된 콘텐츠 속성 이름 및 element가 주어진 네임스페이스 및 로컬 이름으로 속성을 가져온 결과로 둔다.
attribute가 null이면 null을 반환한다.
attribute의 값을 반환한다.
element, 반영된 콘텐츠 속성 이름 및 value가 주어진 속성 값을 설정한다.
null, 반영된 콘텐츠 속성 이름 및 element가 주어진 네임스페이스 및 로컬 이름으로 속성을 제거한다.
ElementInternals
객체 elementInternals인 반영 대상에 대해 다음과
같이 정의된다.
elementInternals의 대상 요소의 내부 콘텐츠 속성 맵[반영된 콘텐츠 속성 이름]이 존재하지 않으면 null을 반환한다.
elementInternals의 대상 요소의 내부 콘텐츠 속성 맵[반영된 콘텐츠 속성 이름]을 반환한다.
elementInternals의 대상 요소의 내부 콘텐츠 속성 맵[반영된 콘텐츠 속성 이름]을 value로 설정한다.
elementInternals의 대상 요소의 내부 콘텐츠 속성 맵[반영된 콘텐츠 속성 이름]을 제거한다.
이로 인해 ElementInternals
객체에는 다소 중복된 데이터 구조가 생긴다. 해당 객체의 대상
요소의 내부 콘텐츠 속성
맵은 직접 조작할 수 없으므로 반영은 한 방향으로만 일어난다. 그럼에도 이 접근법은
반영 대상 간에
공유되며
공통 API 의미론의 이점을 얻는 IDL 속성을 정의할 때 오류 가능성을 줄이기 위해 선택되었다.
열거형
콘텐츠 속성을
반영하는
DOMString
또는
DOMString?
유형의 IDL 속성은 알려진 값으로만 제한될 수 있다.
아래 처리 모델에 따라 이러한 IDL 속성의 가져오기는 해당 열거형 속성의 키워드, 빈 문자열 또는
null만 반환하게 된다.
반영된 IDL 속성의
유형이 DOMString인
경우:
가져오기 단계는 다음과 같다.
contentAttributeValue를 this의 콘텐츠 속성 가져오기를 실행한 결과로 둔다.
attributeDefinition을 네임스페이스가 null이고 로컬 이름이 반영된 콘텐츠 속성 이름인 element의 콘텐츠 속성에 대한 속성 정의로 둔다.
attributeDefinition이 열거형 속성임을 나타내고 반영된 IDL 속성이 알려진 값으로만 제한되도록 정의된 경우:
contentAttributeValue가 null이면 빈 문자열을 반환한다.
contentAttributeValue를 반환한다.
반영된 IDL 속성의
유형이
DOMString?인
경우:
가져오기 단계는 다음과 같다.
contentAttributeValue를 this의 콘텐츠 속성 가져오기를 실행한 결과로 둔다.
attributeDefinition을 네임스페이스가 null이고 로컬 이름이 반영된 콘텐츠 속성 이름인 element의 콘텐츠 속성에 대한 속성 정의로 둔다.
attributeDefinition이 열거형 속성임을 나타내는 경우:
단언: 반영된 IDL 속성은 알려진 값으로만 제한되어 있다.
단언: contentAttributeValue는 attributeDefinition의 상태에 대응한다.
contentAttributeValue가 연관된 키워드 값이 없는 attributeDefinition의 상태에 대응하면 null을 반환한다.
contentAttributeValue가 대응하는 attributeDefinition 상태의 정규 키워드를 반환한다.
contentAttributeValue를 반환한다.
반영된 IDL 속성의
유형이 USVString이고,
선택적으로 URL로 취급되는 경우:
가져오기 단계는 다음과 같다.
contentAttributeValue를 this의 콘텐츠 속성 가져오기를 실행한 결과로 둔다.
반영된 IDL 속성이 URL로 취급되는 경우:
contentAttributeValue가 null이면 빈 문자열을 반환한다.
urlString을 element의 노드 문서를 기준으로 contentAttributeValue가 주어진 URL을 인코딩 파싱하고 직렬화한 결과로 둔다.
urlString이 실패가 아니면 urlString을 반환한다.
contentAttributeValue를 스칼라 값 문자열로 변환하여 반환한다.
반영된 IDL 속성의
유형이 boolean인
경우:
가져오기 단계는 다음과 같다.
contentAttributeValue를 this의 콘텐츠 속성 가져오기를 실행한 결과로 둔다.
contentAttributeValue가 null이면 false를 반환한다.
true를 반환한다.
이는 불리언 콘텐츠 속성 규칙에 대응한다.
반영된 IDL 속성의
유형이 long이고,
선택적으로 음이 아닌 수로만 제한되며
선택적으로 기본
값 defaultValue를 갖는 경우:
가져오기 단계는 다음과 같다.
contentAttributeValue를 this의 콘텐츠 속성 가져오기를 실행한 결과로 둔다.
contentAttributeValue가 null이 아닌 경우:
반영된 IDL 속성이 음이 아닌 수로만 제한되지 않은 경우 parsedValue를 contentAttributeValue에 대한 정수 파싱 결과로 두고, 그렇지 않으면 contentAttributeValue에 대한 음이 아닌 정수 파싱 결과로 둔다.
parsedValue가 오류가 아니고 long
범위 내에 있으면 parsedValue를 반환한다.
반영된 IDL 속성에 기본값이 있으면 defaultValue를 반환한다.
반영된 IDL 속성이 음이 아닌 수로만 제한되어 있으면 −1을 반환한다.
0을 반환한다.
설정 단계는 다음과 같다.
반영된 IDL
속성이 음이
아닌
수로만 제한되어 있고 주어진 값이 음수이면
"IndexSizeError" DOMException을
던진다.
주어진 값을 수를 유효한 정수로 나타내는 가능한 가장 짧은 문자열로 변환한 뒤, 이를 사용하여 this의 콘텐츠 속성 설정을 실행한다.
반영된 IDL 속성의
유형이 unsigned long이고,
선택적으로 양수로만
제한, 대체값이 있는
양수로만
제한 또는 범위로 제한
[clampedMin,
clampedMax]되며, 선택적으로 기본값 defaultValue를
갖는 경우:
가져오기 단계는 다음과 같다.
contentAttributeValue를 this의 콘텐츠 속성 가져오기를 실행한 결과로 둔다.
minimum을 0으로 둔다.
반영된 IDL 속성이 양수로만 제한되거나 대체값이 있는 양수로만 제한되면 minimum을 1로 설정한다.
반영된 IDL 속성이 범위로 제한되면 minimum을 clampedMin으로 설정한다.
반영된 IDL 속성이 범위로 제한되지 않았으면 maximum을 2147483647로 두고, 그렇지 않으면 clampedMax로 둔다.
contentAttributeValue가 null이 아닌 경우:
parsedValue를 contentAttributeValue에 대한 음이 아닌 정수 파싱 결과로 둔다.
parsedValue가 오류가 아니고 minimum부터 maximum까지의 범위에 양 끝을 포함하여 있으면 parsedValue를 반환한다.
parsedValue가 오류가 아니고 반영된 IDL 속성이 범위로 제한된 경우:
parsedValue가 minimum보다 작으면 minimum을 반환한다.
maximum을 반환한다.
반영된 IDL 속성에 기본값이 있으면 defaultValue를 반환한다.
minimum을 반환한다.
설정 단계는 다음과 같다.
반영된 IDL
속성이 양수로만
제한되어 있고 주어진 값이 0이면
"IndexSizeError" DOMException을
던진다.
minimum을 0으로 둔다.
반영된 IDL 속성이 양수로만 제한되거나 대체값이 있는 양수로만 제한되면 minimum을 1로 설정한다.
newValue를 minimum으로 둔다.
반영된 IDL 속성에 기본값이 있으면 newValue를 defaultValue로 설정한다.
주어진 값이 minimum부터 2147483647까지의 범위에 양 끝을 포함하여 있으면 newValue를 해당 값으로 설정한다.
newValue를 수를 유효한 음이 아닌 정수로 나타내는 가능한 가장 짧은 문자열로 변환한 뒤, 이를 사용하여 this의 콘텐츠 속성 설정을 실행한다.
범위로 제한은 설정 단계에 영향을 주지 않는다.
반영된 IDL 속성의
유형이 double이고,
선택적으로 양수로만 제한되며
선택적으로 기본값
defaultValue를
갖는 경우:
가져오기 단계는 다음과 같다.
contentAttributeValue를 this의 콘텐츠 속성 가져오기를 실행한 결과로 둔다.
contentAttributeValue가 null이 아닌 경우:
parsedValue를 contentAttributeValue에 대한 부동 소수점 수 파싱 결과로 둔다.
parsedValue가 오류가 아니고 0보다 크면 parsedValue를 반환한다.
parsedValue가 오류가 아니고 반영된 IDL 속성이 양수로만 제한되지 않았으면 parsedValue를 반환한다.
반영된 IDL 속성에 기본값이 있으면 defaultValue를 반환한다.
0을 반환한다.
설정 단계는 다음과 같다.
반영된 IDL 속성이 양수로만 제한되어 있고 주어진 값이 0보다 크지 않으면 반환한다.
주어진 값을 수의 부동 소수점 수로서 가장 좋은 표현으로 변환한 뒤, 이를 사용하여 this의 콘텐츠 속성 설정을 실행한다.
Infinity와 Not-a-Number(NaN) 값은 Web IDL에 정의된 대로 설정할 때 예외를 던진다. [WEBIDL]
반영된 IDL 속성의
유형이 DOMTokenList이면
가져오기 단계는 연관 요소가 this이고 연관 속성의 로컬 이름이 반영된 콘텐츠
속성 이름인 DOMTokenList
객체를 반환하는 것이다. 명세 작성자는 이 유형의 IDL 속성을 ElementInternals에
반영할 수 없다.
반영된 IDL 속성의
유형이 T?이고, T가 Element
또는 Element에서
상속하는 인터페이스인 경우, attr을 반영된 콘텐츠
속성 이름으로 두면:
해당 반영 대상에는 요소에 대한 약한 참조 또는 null인 명시적으로 설정된 attr-요소가 있다. 처음에는 null이다.
해당 반영 대상 reflectedTarget에는 다음 단계를 실행하는 attr-연관 요소 가져오기 알고리즘이 있다.
element를 reflectedTarget의 요소 가져오기를 실행한 결과로 둔다.
contentAttributeValue를 reflectedTarget의 콘텐츠 속성 가져오기를 실행한 결과로 둔다.
reflectedTarget의 명시적으로 설정된 attr-요소가 null이 아닌 경우:
reflectedTarget의 명시적으로 설정된 attr-요소가 element의 섀도를 포함하는 조상 중 하나의 자손이면 reflectedTarget의 명시적으로 설정된 attr-요소를 반환한다.
null을 반환한다.
그렇지 않고 contentAttributeValue가 null이 아니면 다음 기준을 충족하는 첫 번째 요소 candidate를 트리 순서로 반환한다.
그러한 요소가 없으면 null을 반환한다.
null을 반환한다.
가져오기 단계는 this의 attr-연관 요소 가져오기를 실행한 결과를 반환하는 것이다.
설정 단계는 다음과 같다.
주어진 값이 null인 경우:
this의 명시적으로 설정된 attr-요소를 null로 설정한다.
반환한다.
this의 명시적으로 설정된 attr-요소를 주어진 값에 대한 약한 참조로 설정한다.
요소 반영 대상에만 해당: element, localName, oldValue, value 및 namespace가 주어진 다음 속성 변경 단계는 콘텐츠 속성과 IDL 속성 사이를 동기화하는 데 사용된다.
localName이 attr이 아니거나 namespace가 null이 아니면 반환한다.
element의 명시적으로 설정된 attr-요소를 null로 설정한다.
이 유형의 반영된 IDL 속성은
일관성을 위해 식별자가 "Element"로 끝나도록 하는 것이 강력히 권장된다.
반영된 IDL 속성의
유형이 FrozenArray<T>?이고, T가
Element
또는 Element에서
상속하는 인터페이스인 경우, attr을 반영된 콘텐츠
속성 이름으로 두면:
해당 반영 대상에는 요소에 대한 약한 참조의 리스트 또는 null인 명시적으로 설정된 attr-요소들이 있다. 처음에는 null이다.
해당 반영
대상에는
FrozenArray<T>?인 캐시된
attr-연관
요소 객체가 있다. 처음에는 null이다.
해당 반영 대상 reflectedTarget에는 다음 단계를 실행하는 attr-연관 요소들 가져오기 알고리즘이 있다.
elements를 비어 있는 리스트로 둔다.
element를 reflectedTarget의 요소 가져오기를 실행한 결과로 둔다.
reflectedTarget의 명시적으로 설정된 attr-요소들이 null이 아닌 경우:
reflectedTarget의 명시적으로 설정된 attr-요소들의 각 attrElement에 대해 다음을 수행한다.
attrElement가 element의 섀도를 포함하는 조상 중 어느 것의 자손도 아니면 계속한다.
attrElement를 elements에 추가한다.
그렇지 않으면:
contentAttributeValue를 reflectedTarget의 콘텐츠 속성 가져오기를 실행한 결과로 둔다.
contentAttributeValue가 null이면 null을 반환한다.
tokens를 ASCII 공백으로 분할된 contentAttributeValue로 둔다.
tokens의 각 id에 대해 다음을 수행한다.
elements를 반환한다.
가져오기 단계는 다음과 같다.
elements를 this의 attr-연관 요소들 가져오기를 실행한 결과로 둔다.
elements의 내용이 this의 캐시된 attr-연관 요소들의 내용과 같으면 this의 캐시된 attr-연관 요소 객체를 반환한다.
elementsAsFrozenArray를 FrozenArray<T>?로 변환된 elements로 둔다.
this의 캐시된 attr-연관 요소들을 elements로 설정한다.
this의 캐시된 attr-연관 요소 객체를 elementsAsFrozenArray로 설정한다.
elementsAsFrozenArray를 반환한다.
이 추가 캐싱 계층은
element.reflectedElements === element.reflectedElements라는 불변 조건을
유지하는 데 필요하다.
요소 반영 대상에만 해당: element, localName, oldValue, value 및 namespace가 주어진 다음 속성 변경 단계는 콘텐츠 속성과 IDL 속성 사이를 동기화하는 데 사용된다.
localName이 attr이 아니거나 namespace가 null이 아니면 반환한다.
element의 명시적으로 설정된 attr-요소들을 null로 설정한다.
이 유형의 반영된 IDL 속성은
일관성을 위해 식별자가 "Elements"로 끝나도록 하는 것이 강력히 권장된다.
반영은 IDL에서
확장
속성을 통해 사용할 수 있다. [Reflect], [ReflectSetter], [ReflectURL],
[ReflectNonNegative], [ReflectPositive] 및
[ReflectPositiveWithFallback]은 모두
반영을
트리거한다. 이들은 인수를 받지 않거나 문자열을 받아야 하고, 인터페이스 멤버 속성 이외의
항목에는 나타나서는 안 되며, 한 번에 하나만 사용할 수 있다.
이러한 기본 반영 확장 속성 중 하나에서 반영된 콘텐츠 속성 이름은 값이 제공되면 해당 속성이 받는 문자열 값이고, 그렇지 않으면 IDL 속성 이름을 ASCII 소문자로 변환한 값이다.
[Reflect]
확장
속성을 갖는 IDL 속성은 [Reflect]의
반영된 콘텐츠 속성
이름을 반영해야 한다.
[ReflectSetter]
확장
속성을 갖는 IDL 속성은 설정할 때 [ReflectSetter]의
반영된 콘텐츠 속성
이름을 반영해야 한다.
[ReflectURL]
확장
속성은 USVString
유형의 속성에만 나타나야 한다.
[ReflectURL]
확장
속성을 갖는 IDL 속성은 [ReflectURL]의
반영된 콘텐츠 속성
이름을 URL로 반영해야 한다.
[ReflectNonNegative]
확장
속성은 long
유형의 속성에만 나타나야 한다.
[ReflectNonNegative]
확장
속성을 갖는 IDL 속성은 [ReflectNonNegative]의
반영된 콘텐츠 속성
이름을 음이 아닌 수로만
제한하여 반영해야 한다.
[ReflectPositive]
및 [ReflectPositiveWithFallback]
확장
속성은 double
또는 unsigned
long 유형의 속성에만 나타나야 한다.
[ReflectPositive]
확장
속성을 갖는 IDL 속성은 [ReflectPositive]의
반영된
콘텐츠 속성 이름을 양수로만
제한하여 반영해야 한다.
[ReflectPositiveWithFallback]
확장
속성을 갖는 IDL 속성은 [ReflectPositiveWithFallback]의
반영된
콘텐츠 속성 이름을 대체값이
있는 양수로만 제한하여 반영해야 한다.
위 확장
속성을 보완하기 위해 [ReflectRange] 및 [ReflectDefault]도
도입한다. 이들은 반영이 작동하는 방식을 확장하며
인터페이스 멤버 속성에만 나타나야 한다.
[ReflectRange]
확장
속성은 두 값으로 제한된 정수 리스트를 받아야 한다. 이는 unsigned long
유형의 속성에만 사용되어야 한다. 또한 [Reflect]와
함께만 나타나야 한다.
[ReflectRange]
확장
속성을 갖는 IDL 속성은 [clampedMin,
clampedMax] 범위로 제한된다.
여기서 clampedMin은 [ReflectRange]에
제공된 리스트의 첫 번째 인수이고, clampedMax는 두 번째 인수이다.
[ReflectDefault]
확장
속성은 double,
long
또는 unsigned long
유형의 속성에만 사용되어야 한다. double
유형의 속성에 사용될 때는 십진수를 받아야 하며, 그렇지 않으면 정수를 받아야 한다.
또한 [Reflect],
[ReflectNonNegative],
[ReflectPositive]
또는 [ReflectPositiveWithFallback]와
함께만 나타나야 한다.
[ReflectDefault]
확장
속성을 갖는 IDL 속성에는 [ReflectDefault]에
제공된 인수가 제공하는 기본값이 있다.
반영은 주로 웹 개발자가 반영된 IDL 속성을 통해 콘텐츠 속성에 유형이 지정된 방식으로 접근할 수 있게 하여 개발자 편의성을 개선하는 데 목적이 있다. 웹 플랫폼이 기반으로 삼는 궁극적인 진실의 원천은 콘텐츠 속성 자체이다. 즉, 명세 작성자는 반영된 IDL 속성의 가져오기 또는 설정 단계를 사용해서는 안 되며, 대신 콘텐츠 속성의 존재 여부와 값을 사용해야 한다. (또는 열거형 속성의 상태와 같은 상위 추상화를 사용해야 한다.)
이에 대한 두 가지 중요한 예외는 유형이 다음 중 하나인 반영된 IDL 속성이다.
이러한 경우 명세 작성자는 각각 반영 대상의 attr-연관 요소 가져오기와 attr-연관 요소들 가져오기를 사용해야 한다. 콘텐츠 속성의 존재 여부와 값은 반영된 IDL 속성과 완전히 동기화할 수 없으므로 사용해서는 안 된다.
반영 대상의 명시적으로 설정된 attr-요소, 명시적으로 설정된 attr-요소들, 캐시된 attr-연관 요소들 및 캐시된 attr-연관 요소 객체는 내부 구현 세부 사항으로 취급해야 하며, 이를 기반으로 기능을 구축해서는 안 된다.
HTMLFormControlsCollection
및 HTMLOptionsCollection
인터페이스는
HTMLCollection
인터페이스에서 파생된 컬렉션이다. HTMLAllCollection
인터페이스는 컬렉션이지만, 이와 같이 파생되지는 않는다.
HTMLAllCollection
인터페이스HTMLAllCollection
인터페이스는 레거시 document.all
속성에 사용된다. 이는
HTMLCollection과
유사하게 작동한다. 주요 차이점은 메서드를 놀라울 정도로 다양한 방식으로 사용하거나 오용해도
모두 무언가를 반환할 수 있다는 점과, 프로퍼티 접근 대신 함수로 호출할 수 있다는 점이다.
모든 HTMLAllCollection
객체는 Document를
루트로 하며 모든 요소와 일치하는 필터를 갖는다. 따라서 HTMLAllCollection
객체의 컬렉션이 나타내는
요소는 루트 Document의 모든 자손
요소로 구성된다.
HTMLAllCollection
인터페이스를 구현하는 객체는 레거시
플랫폼 객체이며, 아래 절에서 설명하는 추가 [[Call]] 내부
메서드를 갖는다. 또한 [[IsHTMLDDA]] 내부 슬롯도
갖는다.
HTMLAllCollection
인터페이스를 구현하는 객체는 [[IsHTMLDDA]]
내부 슬롯을 갖기 때문에 다음과 같은 몇 가지 특이한 동작을 한다.
JavaScript의 ToBoolean 추상 연산은
HTMLAllCollection
인터페이스를 구현하는 객체가 주어지면 false를 반환한다.
IsLooselyEqual 추상 연산은
HTMLAllCollection
인터페이스를 구현하는 객체가 주어졌을 때 undefined 및 null 값과
비교하면 true를 반환한다.
(IsStrictlyEqual 추상 연산을 사용하는 비교와,
문자열 또는 객체와 같은 다른 값에 대한 IsLooselyEqual 비교에는 영향을 주지 않는다.)
JavaScript의 typeof
연산자는
HTMLAllCollection
인터페이스를 구현하는 객체에 적용되면 문자열 "undefined"를 반환한다.
이러한 특수 동작은 두 종류의 레거시 콘텐츠와의 호환성을 위한 것이다. 하나는 document.all의
존재 여부를 레거시 사용자 에이전트를 감지하는 방법으로 사용하는 콘텐츠이고, 다른 하나는 해당
레거시 사용자 에이전트만 지원하며 존재 여부를 먼저 검사하지 않고 document.all
객체를 사용하는 콘텐츠이다. [JAVASCRIPT]
[Exposed =Window ,
LegacyUnenumerableNamedProperties ]
interface HTMLAllCollection {
readonly attribute unsigned long length ;
getter Element (unsigned long index );
getter (HTMLCollection or Element )? namedItem (DOMString name );
(HTMLCollection or Element )? item (optional DOMString nameOrIndex );
// Note: HTMLAllCollection objects have a custom [[Call]] internal method and an [[IsHTMLDDA]] internal slot.
};
객체의 지원되는 프로퍼티 인덱스는
HTMLCollection
객체에 대해 정의된 것과 같다.
지원되는 프로퍼티 이름은 컬렉션이 나타내는 모든 요소의
모든 id
속성의 비어 있지 않은 값과, 컬렉션이 나타내는 모든 "all"-명명 요소의 모든
name 속성의 비어 있지 않은 값으로 구성된다. 이 값들은 컬렉션이 나타내는
요소에서 컬렉션이 나타내는 요소까지
트리 순서로 나열되며, 뒤에 나오는 중복 항목은 무시한다. 요소가
두 속성을 모두 제공하고 값이 서로 다르며 어느 것도 앞선 항목의 중복이 아닌 경우, 요소의 id가
해당 요소의 name보다 앞선다.
length 가져오기 단계는 컬렉션이 나타내는 노드 수를 반환하는 것이다.
인덱스 프로퍼티 가져오기는 전달된 인덱스가 주어진 this에서 "all"-인덱스 요소를 가져온 결과를 반환해야 한다.
namedItem(name) 메서드 단계는
name이 주어진 this에서 "all"-명명 요소를
가져온 결과를 반환하는 것이다.
item(nameOrIndex) 메서드 단계는
다음과 같다.
nameOrIndex가 제공되지 않았으면 null을 반환한다.
nameOrIndex가 주어진 this에서 "all"-인덱스 또는 명명 요소를 가져온 결과를 반환한다.
다음 요소는 "all"-명명 요소이다.
a,
button,
embed,
form,
frame,
frameset,
iframe,
img,
input,
map,
meta,
object,
select 및
textarea
인덱스 index가 주어진 HTMLAllCollection
collection에서 "all"-인덱스 요소를 가져오려면,
collection의 index번째 요소를 반환하고, 그러한
index번째 요소가 없으면 null을 반환한다.
이름 name이 주어진 HTMLAllCollection
collection에서 "all"-명명 요소를 가져오려면
다음 단계를 수행한다.
name이 빈 문자열이면 null을 반환한다.
subCollection을 collection과 동일한
Document를
루트로 하는 HTMLCollection
객체로 둔다. 이 객체의 필터는 다음 중 하나인 요소에만 일치한다.
name 속성이 name과 같은 "all"-명명
요소, 또는
ID가 name과 같은 요소.
subCollection에 요소가 정확히 하나 있으면 해당 요소를 반환한다.
그렇지 않고 subCollection이 비어 있으면 null을 반환한다.
그렇지 않으면 subCollection을 반환한다.
nameOrIndex가 주어진 HTMLAllCollection
collection에서 "all"-인덱스 또는 명명
요소를 가져오려면:
nameOrIndex를 JavaScript String 값으로 변환한 결과가 배열 인덱스 프로퍼티 이름이면, nameOrIndex가 나타내는 수를 사용하여 collection에서 "all"-인덱스 요소를 가져온 결과를 반환한다.
nameOrIndex가 주어진 collection에서 "all"-명명 요소를 가져온 결과를 반환한다.
argumentsList의 크기가 0이거나 argumentsList[0]이 undefined이면 null을 반환한다.
result를 nameOrIndex가 주어진 이 HTMLAllCollection에서
"all"-인덱스 또는 명명
요소를 가져온 결과로 둔다.
result를 ECMAScript 값으로 변환한 결과를 반환한다.
thisArgument는 무시되므로
Function.prototype.call.call(document.all, null, "x")와 같은 코드도 여전히
요소를 검색한다. (document.all은 Function.prototype에서 상속하지 않으므로
document.all.call은 존재하지 않는다.)
HTMLFormControlsCollection
인터페이스HTMLFormControlsCollection
인터페이스는 form
요소에 있는 나열된
요소의 컬렉션에
사용된다.
현재 모든 엔진에서 지원됨.
현재 모든 엔진에서 지원됨.
[Exposed =Window ]
interface HTMLFormControlsCollection : HTMLCollection {
// inherits length and item()
getter (RadioNodeList or Element )? namedItem (DOMString name ); // shadows inherited namedItem()
};
[Exposed =Window ]
interface RadioNodeList : NodeList {
attribute DOMString value ;
};
collection.length
collection에 있는 요소 수를 반환한다.
element = collection.item(index)
element = collection[index]collection의 인덱스 index에 있는 항목을 반환한다. 항목은 트리 순서로 정렬된다.
element = collection.namedItem(name)
HTMLFormControlsCollection/namedItem
현재 모든 엔진에서 지원됨.
radioNodeList = collection.namedItem(name)
element = collection[name]radioNodeList = collection[name]collection에서 ID 또는 name이
name인 항목을 반환한다.
일치하는 항목이 여러 개이면 해당 요소를 모두 포함하는 RadioNodeList
객체를 반환한다.
radioNodeList.value
radioNodeList가 나타내는 선택된 첫 번째 라디오 버튼의 값을 반환한다.
radioNodeList.value = value
radioNodeList가 나타내며 값이 value인 첫 번째 라디오 버튼을 선택한다.
객체의 지원되는 프로퍼티 인덱스는
HTMLCollection
객체에 대해 정의된 것과 같다.
지원되는 프로퍼티 이름은 컬렉션이 나타내는 모든 요소의
모든 id
및 name
속성의 비어 있지 않은 값으로 구성된다. 값은 트리 순서로
나열되며, 뒤에 나오는 중복 항목은 무시한다. 요소가 두 속성을 모두 제공하고 값이 서로 다르며 어느 것도
앞선 항목의 중복이 아닌 경우, 요소의 id가
해당 요소의 name보다
앞선다.
namedItem(name) 메서드는
다음 알고리즘에 따라 동작해야 한다.
id
속성 또는 name
속성이 name과 같은 노드가 정확히 하나 있으면 해당 노드를 반환하고 알고리즘을 중단한다.id
속성 또는 name
속성이
name과 같은 노드가 없으면 null을 반환하고 알고리즘을 중단한다.
HTMLFormControlsCollection
객체의 라이브
뷰를 나타내는 새로운 RadioNodeList
객체를 생성하고, RadioNodeList
객체에 포함되는 노드가 id
속성 또는 name
속성이
name과 같은 노드뿐이도록 추가로 필터링한다. RadioNodeList
객체의 노드는 트리 순서로 정렬되어야 한다.
RadioNodeList
객체를 반환한다.RadioNodeList
인터페이스가 NodeList
인터페이스에서 상속한 멤버는 NodeList
객체에서와 같이 동작해야 한다.
현재 모든 엔진에서 지원됨.
RadioNodeList
객체의 value IDL 속성은 가져올 때
다음 단계를 실행하여 반환된 값을 반환해야 한다.
설정할 때 value
IDL 속성은 다음 단계를 실행해야 한다.
새 값이 문자열 "on"이면 element를 RadioNodeList
객체가 나타내는 요소 중 트리 순서상 첫 번째 요소로 둔다.
이 요소는
input
요소이고, 해당 요소의 type
속성이 라디오 버튼 상태이며,
해당 요소의 value
콘텐츠 속성이 없거나, 존재하는 경우 새 값과 같아야 한다. 그러한 요소가 없으면
대신 element를 null로 둔다.
그렇지 않으면 element를 RadioNodeList
객체가 나타내는 요소 중 트리 순서상 첫 번째 요소로 둔다.
이 요소는
input
요소이고, 해당 요소의 type
속성이 라디오 버튼 상태이며,
해당 요소의 value
콘텐츠 속성이 존재하고 새 값과 같아야 한다. 그러한 요소가 없으면 대신
element를 null로 둔다.
element가 null이 아니면 해당 요소의 선택 여부를 true로 설정한다.
HTMLOptionsCollection
인터페이스현재 모든 엔진에서 지원됨.
HTMLOptionsCollection
인터페이스는 option
요소의 컬렉션에
사용된다. 이는 항상 select
요소를 루트로 하며 해당 요소의 자손을 조작하는 속성과 메서드를 갖는다.
[Exposed =Window ]
interface HTMLOptionsCollection : HTMLCollection {
// inherits item(), namedItem()
[CEReactions ] attribute unsigned long length ; // shadows inherited length
[CEReactions ] setter undefined (unsigned long index , HTMLOptionElement ? option );
[CEReactions ] undefined add ((HTMLOptionElement or HTMLOptGroupElement ) element , optional (HTMLElement or long )? before = null );
[CEReactions ] undefined remove (long index );
attribute long selectedIndex ;
};
collection.length
collection의 요소 수를 반환한다.
collection.length = value
기존 길이보다 작은 수로 설정하면 collection에 대응하는 컨테이너의
option
요소 수를 줄인다.
기존 길이보다 큰 수로 설정하고 해당 수가 100000 이하이면
collection에 대응하는 컨테이너에 새로운 빈 option
요소를 추가한다.
element = collection.item(index)
element = collection[index]collection의 인덱스 index에 있는 항목을 반환한다. 항목은 트리 순서로 정렬된다.
collection[index] = elementindex가 collection의 항목 수보다 크면 대응하는 컨테이너에
새로운 빈 option
요소를 추가한다.
null로 설정하면 collection에서 인덱스 index의 항목을 제거한다.
option
요소로 설정하면 collection의 인덱스 index에 해당 요소를 추가하거나
기존 요소를 대체한다.
element = collection.namedItem(name)
element = collection[name]collection에서 ID 또는 name이
name인 항목을 반환한다.
일치하는 항목이 여러 개이면 첫 번째 항목을 반환한다.
collection.add(element[, before])
before가 지정하는 노드 앞에 element를 삽입한다.
before 인수는 숫자일 수 있으며, 이 경우 element는 해당 번호의 항목 앞에 삽입된다. 또는 collection의 요소일 수 있으며, 이 경우 element는 해당 요소 앞에 삽입된다.
before가 생략되거나 null이거나 범위를 벗어난 숫자이면 element는 리스트의 끝에 추가된다.
element가 삽입될 요소의 조상이면
"HierarchyRequestError" DOMException을
던진다.
collection.remove(index)
collection에서 인덱스 index의 항목을 제거한다.
collection.selectedIndex
선택된 첫 번째 항목이 있으면 그 인덱스를 반환하고, 선택된 항목이 없으면 −1을 반환한다.
collection.selectedIndex = index
선택 항목을 collection의 인덱스 index에 있는 option
요소로 변경한다.
객체의 지원되는 프로퍼티 인덱스는
HTMLCollection
객체에 대해 정의된 것과 같다.
length 가져오기 단계는
컬렉션이 나타내는 노드 수를 반환하는 것이다.
length
설정 단계는 다음과 같다.
current를 컬렉션이 나타내는 노드 수로 둔다.
주어진 값이 current보다 큰 경우:
주어진 값이 100,000보다 크면 반환한다.
n을 value − current로 둔다.
n이 주어진 this가 루트로 하는 select
요소에 새로운 option 요소를 추가한다.
주어진 값이 current보다 작은 경우:
n을 current − value로 둔다.
컬렉션의 마지막 n개 노드를 해당 부모 노드에서 제거한다.
length를
설정해도 optgroup
요소를 제거하거나 추가하지 않으며, 기존 optgroup
요소에 새로운 자식을 추가하지도 않는다. 단, 그 요소의 자식을 제거할 수는 있다.
지원되는 프로퍼티 이름은
컬렉션이 나타내는 모든 요소의
모든 id 및
name
속성의 비어 있지 않은 값으로 구성된다. 값은 트리 순서로 나열되며 뒤에 나오는 중복
항목은 무시한다.
요소가 두 속성을 모두 제공하고 값이 서로 다르며 어느 것도 앞선 항목의 중복이 아닌 경우, 요소의
id가
해당 요소의 name보다
앞선다.
음이 아닌 정수 count가 주어진 select
요소 select에 새로운 option 요소를 추가하려면:
fragment를 select의 노드 문서가 주어졌을 때 문서 프래그먼트를 생성한 결과로 설정합니다.
fragment에 새로운 option
요소 count개를 추가합니다.
fragment를 select에 추가합니다.
프로퍼티 인덱스 index와 새로운 값
value가 주어진 HTMLOptionsCollection
collection에 대해 새로운 인덱스 프로퍼티의 값을 설정하거나
기존 인덱스
프로퍼티의 값을 설정하려면:
value가 null이면 index가 주어진 collection에서 option을 제거하고 반환한다.
length를 collection이 나타내는 노드 수로 둔다.
delta를 index − length로 둔다.
delta가 0보다 크면 delta가 주어진
collection이 루트로 하는 select
요소에 새로운 option 요소를 추가한다.
delta가 0 이상이면 collection이 루트로 하는 select
요소에 value를 추가한다. 그렇지 않으면 collection의
index번째 요소를 value로 대체한다.
add(element, before)
메서드 단계는 다음과 같다.
element가 this가 루트로 하는 select
요소의 조상이면 "HierarchyRequestError"
DOMException을
던진다.
before가 요소이지만 해당 요소가 this가 루트로 하는
select
요소의 자손이 아니면
"NotFoundError" DOMException을
던진다.
element와 before가 같은 요소이면 반환한다.
reference를 null로 둔다.
before가 노드이면 reference를 before로 설정한다. 그렇지 않고 before가 정수이며 this에 before번째 노드가 있으면 reference를 해당 노드로 설정한다.
reference가 null이 아니면 parent를 reference의 부모
노드로 두고, 그렇지 않으면 this가 루트로 하는 select
요소로 둔다.
reference 앞에서 element를 parent 노드에 사전 삽입한다.
정수 index가 주어진 HTMLOptionsCollection
collection에서 option을 제거하려면:
remove(index) 메서드 단계는
index가 주어진 this에서 option을 제거하는 것이다.
selectedIndex
설정 단계는 this가 루트로 하는 select
요소의 선택된
인덱스를 설정하여 주어진 값으로 만드는 것이다.
DOMStringList 인터페이스현재 모든 엔진에서 지원됨.
DOMStringList
인터페이스는 문자열 리스트를 나타내는 유행이 지난 복고풍 방식이다.
[Exposed =(Window ,Worker )]
interface DOMStringList {
readonly attribute unsigned long length ;
getter DOMString ? item (unsigned long index );
boolean contains (DOMString string );
};
새로운 API는 DOMStringList 대신
sequence<DOMString> 또는 이와 동등한 것을 사용해야 한다.
strings.length
strings의 문자열 수를 반환한다.
strings[index]strings.item(index)
strings에서 인덱스 index의 문자열을 반환한다.
strings.contains(string)
strings가 string을 포함하면 true를 반환하고, 그렇지 않으면 false를 반환한다.
각 DOMStringList
객체에는 연관된 리스트가 있다.
DOMStringList
인터페이스는 인덱스 프로퍼티를 지원한다. 지원되는 프로퍼티 인덱스는 this의 연관된 리스트의
인덱스이다.
현재 모든 엔진에서 지원됨.
현재 모든 엔진에서 지원됨.
item(index) 메서드 단계는
this의 연관된 리스트에서
index번째 항목을 반환하고, index에 1을 더한 값이 this의 연관된 리스트의
크기보다 크면 null을 반환하는 것이다.
현재 모든 엔진에서 지원됨.
플랫폼 객체를
포함한 JavaScript 객체를 렐름 경계를 넘어 전달할 수 있도록, 이 명세는 객체를 직렬화하고
역직렬화하기 위한 다음 기반 구조를 정의한다. 일부 경우에는 기초 데이터를 복사하는 대신
전송하는 것도 포함한다. 이 직렬화/역직렬화 프로세스를 통칭하여 "구조화된 복제"라고 하지만,
대부분의 API는 직렬화 단계와 역직렬화 단계를 별도로 수행한다.
(주목할 만한 예외는 structuredClone()
메서드이다.)
이 절에서는 JavaScript 명세의 용어와 타이포그래피 규칙을 사용한다. [JAVASCRIPT]
/developer.mozilla.org/en-US/docs/Glossary/Serializable_object
/developer.mozilla.org/en-US/docs/Glossary/Serializable_object
/developer.mozilla.org/en-US/docs/Glossary/Serializable_object
/developer.mozilla.org/en-US/docs/Glossary/Serializable_object
/developer.mozilla.org/en-US/docs/Glossary/Serializable_object
/developer.mozilla.org/en-US/docs/Glossary/Serializable_object
/developer.mozilla.org/en-US/docs/Glossary/Serializable_object
직렬화 가능 객체는 특정 렐름과 독립적인 방식으로 직렬화되고 나중에 역직렬화되는 것을 지원한다. 이를 통해 디스크에 저장한 후 나중에 복원하거나, 에이전트 및 에이전트 클러스터 경계를 넘어 복제할 수도 있다.
모든 객체가 직렬화 가능 객체인 것은 아니며, 직렬화 가능 객체인 객체의 모든 측면이 직렬화될 때 반드시 보존되는 것도 아니다.
플랫폼 객체는 해당 기본 인터페이스가
[Serializable]
IDL 확장
속성으로 장식된 경우 직렬화 가능 객체일 수
있다. 이러한 인터페이스는
다음 알고리즘도 정의해야 한다.
value의 데이터를 serialized의 필드로 직렬화하는 단계 집합이다. serialized로 직렬화된 결과 데이터는 어떤 렐름과도 독립적이어야 한다.
직렬화할 수 없으면 이 단계에서 예외를 던질 수 있다.
이 단계에서는 중첩 데이터 구조를 직렬화하기 위해 하위 직렬화를 수행할 수 있다. 중요한 memory 인수를 누락하게 되므로 StructuredSerialize를 직접 호출해서는 안 된다.
forStorage 인수가 알고리즘과 관련이 없으면 이 단계의 도입부에서 해당 인수를 언급하지 않아야 한다.
serialized의 데이터를 역직렬화하여 적절하게 value를 설정하는 데 사용하는 단계 집합이다. value는 해당 플랫폼 객체 유형의 새로 생성된 인스턴스이며, 내부 데이터는 아무것도 설정되지 않은 상태이다. 이를 설정하는 것이 이 단계의 역할이다.
역직렬화할 수 없으면 이 단계에서 예외를 던질 수 있다.
이 단계에서는 중첩 데이터 구조를 역직렬화하기 위해 하위 역직렬화를 수행할 수 있다. 중요한 targetRealm 및 memory 인수를 누락하게 되므로 StructuredDeserialize를 직접 호출해서는 안 된다.
이 단계에서 어떤 데이터를 직렬화하고 역직렬화할지는 각 플랫폼 객체의 정의에 달려 있다. 일반적으로 이 단계들은 매우 대칭적이다.
[Serializable] 확장
속성은 인수를 받지 않아야 하며 인터페이스에만 나타나야 한다. 하나의 인터페이스에 두 번 이상
나타나서는 안 된다.
주어진 플랫폼 객체의
경우 (역)직렬화 프로세스에서는 해당 객체의 기본
인터페이스만 고려된다. 따라서 인터페이스 정의에 상속이 포함되면 상속 체인에서 [Serializable]로 주석 처리된
각 인터페이스는 상속된 인터페이스에서 비롯될 수 있는 중요한 데이터까지 고려하는 독립적인
직렬화 단계와
역직렬화 단계를
정의해야 한다.
두 개의 연관 데이터가 연결된 플랫폼 객체 Person을 정의한다고 가정해 보자.
문자열인 이름 값, 그리고
다른 Person 인스턴스 또는 null인 가장 친한 친구 값.
그런 다음 Person 인터페이스에 [Serializable] 확장 속성을 지정하고 다음 부속 알고리즘을 정의하여
Person 인스턴스를 직렬화 가능
객체로 정의할 수 있다.
JavaScript 명세에 정의된 객체는 StructuredSerialize 추상 연산에서 직접 처리된다.
원래 이 명세에서는 한 렐름에서 다른 렐름으로 복제할 수 있는 "복제 가능 객체"라는 개념을 정의했다. 그러나 더 복잡한 특정 상황의 동작을 더 정확하게 명시하기 위해 직렬화와 역직렬화를 명시적으로 만드는 모델로 업데이트되었다.
전송 가능 객체는 에이전트 간에 전송되는 것을 지원한다. 전송은 기초 데이터에 대한 참조를 공유하면서 객체를 사실상 다시 생성한 다음 전송되는 객체를 분리하는 것이다. 이는 비용이 많이 드는 리소스의 소유권을 전송하는 데 유용하다. 모든 객체가 전송 가능 객체인 것은 아니며, 전송 가능 객체인 객체의 모든 측면이 전송될 때 반드시 보존되는 것도 아니다.
전송은 되돌릴 수 없고 멱등성이 없는 연산이다. 객체가 전송되면 다시 전송할 수도, 실제로 다시 사용할 수도 없다.
플랫폼 객체는 해당 기본 인터페이스가
[Transferable]
IDL 확장
속성으로 장식된 경우 전송 가능 객체일 수
있다.
이러한 인터페이스는 다음 알고리즘도 정의해야 한다.
이 단계에서 어떤 데이터를 전송할지는 각 플랫폼 객체의 정의에 달려 있다. 일반적으로 이 단계들은 매우 대칭적이다.
[Transferable] 확장
속성은 인수를 받지 않아야 하며 인터페이스에만 나타나야 한다. 하나의 인터페이스에 두 번 이상
나타나서는 안 된다.
주어진 플랫폼 객체의
경우 전송 프로세스에서는 해당 객체의 기본
인터페이스만 고려된다. 따라서 인터페이스 정의에 상속이 포함되면 상속 체인에서 [Transferable]로 주석 처리된
각 인터페이스는 상속된 인터페이스에서 비롯될 수 있는 중요한 데이터까지 고려하는 독립적인
전송 단계와
전송 수신 단계를
정의해야 한다.
플랫폼 객체 중 전송 가능 객체인 객체에는 [[Detached]] 내부 슬롯이 있다. 이는 플랫폼 객체가 한 번 전송된 후 다시 전송되지 않도록 보장하는 데 사용된다.
JavaScript 명세에 정의된 객체는 StructuredSerializeWithTransfer 추상 연산에서 직접 처리된다.
StructuredSerializeInternal 추상 연산은 JavaScript 값 value를 입력으로 받아 렐름과 독립적인 형식으로 직렬화하며, 여기서는 이를 Record로 나타낸다. 이 직렬화된 형식에는 나중에 다른 렐름에서 새로운 JavaScript 값으로 역직렬화하는 데 필요한 모든 정보가 포함된다.
이 프로세스는 예를 들어 직렬화할 수 없는 객체를 직렬화하려고 할 때 예외를 던질 수 있다.
memory가 제공되지 않았으면 memory를 비어 있는 맵으로 둔다.
memory 맵의 목적은 객체를 두 번 직렬화하지 않도록 하는 것이다. 그 결과 그래프의 순환과 중복 객체의 동일성이 보존된다.
memory[value]가 존재하면 memory[value]를 반환한다.
deep을 false로 둔다.
value가 undefined, null, Boolean, Number, BigInt 또는 String이면 { [[Type]]: "primitive", [[Value]]: value }를 반환한다.
value가 Symbol이면
"DataCloneError" DOMException을 던진다.
serialized를 초기화되지 않은 값으로 둔다.
value에 [[BooleanData]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "Boolean", [[BooleanData]]: value.[[BooleanData]] }로 설정한다.
그렇지 않고 value에 [[NumberData]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "Number", [[NumberData]]: value.[[NumberData]] }로 설정한다.
그렇지 않고 value에 [[BigIntData]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "BigInt", [[BigIntData]]: value.[[BigIntData]] }로 설정한다.
그렇지 않고 value에 [[StringData]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "String", [[StringData]]: value.[[StringData]] }로 설정한다.
그렇지 않고 value에 [[DateValue]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "Date", [[DateValue]]: value.[[DateValue]] }로 설정한다.
그렇지 않고 value에 [[RegExpMatcher]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "RegExp", [[RegExpMatcher]]: value.[[RegExpMatcher]], [[OriginalSource]]: value.[[OriginalSource]], [[OriginalFlags]]: value.[[OriginalFlags]] }로 설정한다.
그렇지 않고 value에 [[ArrayBufferData]] 내부 슬롯이 있는 경우:
IsSharedArrayBuffer(value)가 true인 경우:
현재 설정
객체의 교차 출처
격리
기능이 false이면 "DataCloneError"
DOMException을 던진다.
이 검사는 직렬화할 때만 필요하고 역직렬화할 때는 필요하지 않다.
교차 출처
격리 기능은 시간에 따라 변경될 수 없고 SharedArrayBuffer는
에이전트
클러스터를 벗어날 수 없기 때문이다.
forStorage가 true이면
"DataCloneError" DOMException을 던진다.
value에 [[ArrayBufferMaxByteLength]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "GrowableSharedArrayBuffer", [[ArrayBufferData]]: value.[[ArrayBufferData]], [[ArrayBufferByteLengthData]]: value.[[ArrayBufferByteLengthData]], [[ArrayBufferMaxByteLength]]: value.[[ArrayBufferMaxByteLength]], [[AgentCluster]]: 주변 에이전트의 에이전트 클러스터 }로 설정한다.
그렇지 않으면 serialized를 { [[Type]]: "SharedArrayBuffer", [[ArrayBufferData]]: value.[[ArrayBufferData]], [[ArrayBufferByteLength]]: value.[[ArrayBufferByteLength]], [[AgentCluster]]: 주변 에이전트의 에이전트 클러스터 }로 설정한다.
그렇지 않은 경우:
IsDetachedBuffer(value)가 true이면
"DataCloneError" DOMException을 던진다.
size를 value.[[ArrayBufferByteLength]]로 둔다.
dataCopy를 ? CreateByteDataBlock(size)로 둔다.
이는 할당 실패 시 RangeError
예외를 던질 수 있다.
CopyDataBlockBytes(dataCopy, 0, value.[[ArrayBufferData]], 0, size)를 수행한다.
value에 [[ArrayBufferMaxByteLength]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "ResizableArrayBuffer", [[ArrayBufferData]]: dataCopy, [[ArrayBufferByteLength]]: size, [[ArrayBufferMaxByteLength]]: value.[[ArrayBufferMaxByteLength]] }로 설정한다.
그렇지 않으면 serialized를 { [[Type]]: "ArrayBuffer", [[ArrayBufferData]]: dataCopy, [[ArrayBufferByteLength]]: size }로 설정한다.
그렇지 않고 value에 [[ViewedArrayBuffer]] 내부 슬롯이 있는 경우:
IsArrayBufferViewOutOfBounds(value)가
true이면
"DataCloneError" DOMException을 던진다.
buffer를 value의 [[ViewedArrayBuffer]] 내부 슬롯 값으로 둔다.
bufferSerialized를 ? StructuredSerializeInternal(buffer, forStorage, memory)로 둔다.
단언: bufferSerialized.[[Type]]은 "ArrayBuffer", "ResizableArrayBuffer", "SharedArrayBuffer" 또는 "GrowableSharedArrayBuffer"이다.
value에 [[DataView]] 내부 슬롯이 있으면 serialized를 { [[Type]]: "ArrayBufferView", [[Constructor]]: "DataView", [[ArrayBufferSerialized]]: bufferSerialized, [[ByteLength]]: value.[[ByteLength]], [[ByteOffset]]: value.[[ByteOffset]] }로 설정한다.
그렇지 않은 경우:
단언: value에는 [[TypedArrayName]] 내부 슬롯이 있다.
serialized를 { [[Type]]: "ArrayBufferView", [[Constructor]]: value.[[TypedArrayName]], [[ArrayBufferSerialized]]: bufferSerialized, [[ByteLength]]: value.[[ByteLength]], [[ByteOffset]]: value.[[ByteOffset]], [[ArrayLength]]: value.[[ArrayLength]] }로 설정한다.
그렇지 않고 value에 [[MapData]] 내부 슬롯이 있는 경우:
serialized를 { [[Type]]: "Map", [[MapData]]: 새로운 빈 List }로 설정한다.
deep을 true로 설정한다.
그렇지 않고 value에 [[SetData]] 내부 슬롯이 있는 경우:
serialized를 { [[Type]]: "Set", [[SetData]]: 새로운 빈 List }로 설정한다.
deep을 true로 설정한다.
그렇지 않고 value에 [[ErrorData]] 내부 슬롯이 있으며 value가 플랫폼 객체가 아닌 경우:
name을 ? Get(value, "name")으로 둔다.
name이 "Error", "EvalError", "RangeError", "ReferenceError", "SyntaxError", "TypeError" 또는 "URIError" 중 하나가 아니면 name을 "Error"로 설정한다.
valueMessageDesc를 ? value.[[GetOwnProperty]]("message")로 둔다.
IsDataDescriptor(valueMessageDesc)가 false이면 message를 undefined로 두고, 그렇지 않으면 ? ToString(valueMessageDesc.[[Value]])로 둔다.
stack을 value.[[Stack]]을 나타내는 구현 정의 문자열로 둔다. [JSERRORSTACKACCESSOR] [JSERRORSTACKS]
serialized를 { [[Type]]: "Error", [[Name]]: name, [[Message]]: message, [[Stack]]: stack }로 설정한다.
사용자 에이전트는 아직 명시되지 않은 흥미로운 부가 데이터의 직렬화된 표현을 serialized에 첨부하는 것이 좋다.
그렇지 않고 value가 Array 특수 객체인 경우:
valueLenDescriptor를 ?
OrdinaryGetOwnProperty(value,
"length")로 둔다.
valueLen을 valueLenDescriptor.[[Value]]로 둔다.
serialized를 { [[Type]]: "Array", [[Length]]: valueLen, [[Properties]]: 새로운 빈 List }로 설정한다.
deep을 true로 설정한다.
그렇지 않고 value가 플랫폼 객체이며 직렬화 가능 객체인 경우:
value에 값이 true인 [[Detached]]
내부 슬롯이 있으면
"DataCloneError" DOMException을 던진다.
typeString을 value의 기본 인터페이스 식별자로 둔다.
serialized를 { [[Type]]: typeString }로 설정한다.
deep을 true로 설정한다.
그렇지 않고 value가 플랫폼 객체이면
"DataCloneError" DOMException을 던진다.
그렇지 않고 IsCallable(value)가 true이면
"DataCloneError" DOMException을 던진다.
그렇지 않고 value에 [[Prototype]], [[Extensible]] 또는 [[PrivateElements]] 이외의
내부 슬롯이 있으면 "DataCloneError"
DOMException을 던진다.
예를 들어 [[PromiseState]] 또는 [[WeakMapData]] 내부 슬롯이다.
그렇지 않고 value가 특수 객체이며 value가 어떤 렐름과 연관된 %Object.prototype% 내장 객체가 아니면
"DataCloneError" DOMException을 던진다.
예를 들어 프록시 객체이다.
그렇지 않은 경우:
serialized를 { [[Type]]: "Object", [[Properties]]: 새로운 빈 List }로 설정한다.
deep을 true로 설정한다.
%Object.prototype%은 이 단계와 이후 단계에서 처리된다. 최종 결과로 특수성은 무시되며, 역직렬화 후 결과는 빈 객체가 된다(불변 프로토타입 특수 객체가 아님).
memory[value]를 serialized로 설정한다.
deep이 true인 경우:
value에 [[MapData]] 내부 슬롯이 있는 경우:
copiedList를 새로운 빈 List로 둔다.
value.[[MapData]]의 각 요소인 Record { [[Key]], [[Value]] } entry에 대해:
copiedList의 각 요소인 Record { [[Key]], [[Value]] } entry에 대해:
serializedKey를 ? StructuredSerializeInternal(entry.[[Key]], forStorage, memory)로 둔다.
serializedValue를 ? StructuredSerializeInternal(entry.[[Value]], forStorage, memory)로 둔다.
{ [[Key]]: serializedKey, [[Value]]: serializedValue }를 serialized.[[MapData]]에 추가한다.
그렇지 않고 value에 [[SetData]] 내부 슬롯이 있는 경우:
그렇지 않고 value가 플랫폼 객체이며 직렬화 가능 객체이면, value, serialized 및 forStorage가 주어진 value의 기본 인터페이스에 대한 직렬화 단계를 수행한다.
직렬화 단계에서는 하위 직렬화를 수행해야 할 수 있다. 이는 값 subValue를 입력으로 받아 StructuredSerializeInternal(subValue, forStorage, memory)를 반환하는 연산이다. (다시 말해 하위 직렬화는 이 호출 내에서 일관성을 유지하도록 StructuredSerializeInternal을 특수화한 것이다.)
그렇지 않으면 ! EnumerableOwnProperties(value, key)의 각 key에 대해:
! HasOwnProperty(value, key)가 true이면:
inputValue를 ? value.[[Get]](key, value)로 둔다.
outputValue를 ? StructuredSerializeInternal(inputValue, forStorage, memory)로 둔다.
{ [[Key]]: key, [[Value]]: outputValue }를 serialized.[[Properties]]에 추가한다.
serialized를 반환한다.
StructuredSerializeInternal이 생성한 Record에는 순환 참조를 만드는 다른 레코드에 대한 "포인터"가 포함될 수 있다는 점을 이해하는 것이 중요하다. 예를 들어 다음 JavaScript 객체를 StructuredSerializeInternal에 전달하면:
const o = {};
o. myself = o;
다음 결과를 생성한다.
{
[[Type]]: "Object",
[[Properties]]: «
{
[[Key]]: "myself",
[[Value]]: <이 전체 구조를 가리키는 포인터>
}
»
}
? StructuredSerializeInternal(value, false)를 반환한다.
? StructuredSerializeInternal(value, true)를 반환한다.
StructuredDeserialize 추상 연산은 이전에 StructuredSerialize 또는 StructuredSerializeForStorage가 생성한 Record serialized를 입력으로 받아 targetRealm에서 생성된 새로운 JavaScript 값으로 역직렬화한다.
이 프로세스는 예를 들어 새로운 객체, 특히 ArrayBuffer 객체에 메모리를
할당하려고 할 때 예외를 던질 수 있다.
memory가 제공되지 않았으면 memory를 비어 있는 맵으로 둔다.
memory 맵의 목적은 객체를 두 번 역직렬화하지 않도록 하는 것이다. 그 결과 그래프의 순환과 중복 객체의 동일성이 보존된다.
memory[serialized]가 존재하면 memory[serialized]를 반환한다.
deep을 false로 둔다.
value를 초기화되지 않은 값으로 둔다.
serialized.[[Type]]이 "primitive"이면 value를 serialized.[[Value]]로 설정한다.
그렇지 않고 serialized.[[Type]]이 "Boolean"이면 value를 [[BooleanData]] 내부 슬롯 값이 serialized.[[BooleanData]]인 targetRealm의 새로운 Boolean 객체로 설정한다.
그렇지 않고 serialized.[[Type]]이 "Number"이면 value를 [[NumberData]] 내부 슬롯 값이 serialized.[[NumberData]]인 targetRealm의 새로운 Number 객체로 설정한다.
그렇지 않고 serialized.[[Type]]이 "BigInt"이면 value를 [[BigIntData]] 내부 슬롯 값이 serialized.[[BigIntData]]인 targetRealm의 새로운 BigInt 객체로 설정한다.
그렇지 않고 serialized.[[Type]]이 "String"이면 value를 [[StringData]] 내부 슬롯 값이 serialized.[[StringData]]인 targetRealm의 새로운 String 객체로 설정한다.
그렇지 않고 serialized.[[Type]]이 "Date"이면 value를 [[DateValue]] 내부 슬롯 값이 serialized.[[DateValue]]인 targetRealm의 새로운 Date 객체로 설정한다.
그렇지 않고 serialized.[[Type]]이 "RegExp"이면 value를 [[RegExpMatcher]] 내부 슬롯 값이 serialized.[[RegExpMatcher]]이고, [[OriginalSource]] 내부 슬롯 값이 serialized.[[OriginalSource]]이며, [[OriginalFlags]] 내부 슬롯 값이 serialized.[[OriginalFlags]]인 targetRealm의 새로운 RegExp 객체로 설정한다.
그렇지 않고 serialized.[[Type]]이 "SharedArrayBuffer"인 경우:
targetRealm에 대응하는 에이전트 클러스터가
serialized.[[AgentCluster]]가 아니면
"DataCloneError" DOMException을 던진다.
그렇지 않으면 value를 [[ArrayBufferData]] 내부 슬롯 값이 serialized.[[ArrayBufferData]]이고 [[ArrayBufferByteLength]] 내부 슬롯 값이 serialized.[[ArrayBufferByteLength]]인 targetRealm의 새로운 SharedArrayBuffer 객체로 설정한다.
그렇지 않고 serialized.[[Type]]이 "GrowableSharedArrayBuffer"인 경우:
targetRealm에 대응하는 에이전트 클러스터가
serialized.[[AgentCluster]]가 아니면
"DataCloneError" DOMException을 던진다.
그렇지 않으면 value를 [[ArrayBufferData]] 내부 슬롯 값이 serialized.[[ArrayBufferData]]이고, [[ArrayBufferByteLengthData]] 내부 슬롯 값이 serialized.[[ArrayBufferByteLengthData]]이며, [[ArrayBufferMaxByteLength]] 내부 슬롯 값이 serialized.[[ArrayBufferMaxByteLength]]인 targetRealm의 새로운 SharedArrayBuffer 객체로 설정한다.
그렇지 않고 serialized.[[Type]]이 "ArrayBuffer"이면 value를 [[ArrayBufferData]] 내부 슬롯 값이 serialized.[[ArrayBufferData]]이고, [[ArrayBufferByteLength]] 내부 슬롯 값이 serialized.[[ArrayBufferByteLength]]인 targetRealm의 새로운 ArrayBuffer 객체로 설정한다.
이 과정에서 예외가 발생하면 이를 포착한 다음
"DataCloneError" DOMException을 던진다.
이러한 ArrayBuffer 객체를 생성할 수 있을 만큼 충분한 메모리가 없으면 이 단계에서 예외가 발생할 수 있다.
그렇지 않고 serialized.[[Type]]이 "ResizableArrayBuffer"이면 value를 [[ArrayBufferData]] 내부 슬롯 값이 serialized.[[ArrayBufferData]]이고, [[ArrayBufferByteLength]] 내부 슬롯 값이 serialized.[[ArrayBufferByteLength]]이며, [[ArrayBufferMaxByteLength]] 내부 슬롯 값이 serialized.[[ArrayBufferMaxByteLength]]인 targetRealm의 새로운 ArrayBuffer 객체로 설정한다.
이 과정에서 예외가 발생하면 이를 포착한 다음
"DataCloneError" DOMException을 던진다.
이러한 ArrayBuffer 객체를 생성할 수 있을 만큼 충분한 메모리가 없으면 이 단계에서 예외가 발생할 수 있다.
그렇지 않고 serialized.[[Type]]이 "ArrayBufferView"인 경우:
deserializedArrayBuffer를 ? StructuredDeserialize(serialized.[[ArrayBufferSerialized]], targetRealm, memory)로 둔다.
serialized.[[Constructor]]가 "DataView"이면 value를 [[ViewedArrayBuffer]] 내부 슬롯 값이 deserializedArrayBuffer이고, [[ByteLength]] 내부 슬롯 값이 serialized.[[ByteLength]]이며, [[ByteOffset]] 내부 슬롯 값이 serialized.[[ByteOffset]]인 targetRealm의 새로운 DataView 객체로 설정한다.
그렇지 않으면 value를 serialized.[[Constructor]]가 지정한 생성자를 사용하여 생성한 targetRealm의 새로운 형식화 배열 객체로 설정한다. 이 객체의 [[ViewedArrayBuffer]] 내부 슬롯 값은 deserializedArrayBuffer이고, [[TypedArrayName]] 내부 슬롯 값은 serialized.[[Constructor]]이며, [[ByteLength]] 내부 슬롯 값은 serialized.[[ByteLength]]이고, [[ByteOffset]] 내부 슬롯 값은 serialized.[[ByteOffset]]이며, [[ArrayLength]] 내부 슬롯 값은 serialized.[[ArrayLength]]이다.
그렇지 않고 serialized.[[Type]]이 "Map"인 경우:
value를 [[MapData]] 내부 슬롯 값이 새로운 빈 List인 targetRealm의 새로운 Map 객체로 설정한다.
deep을 true로 설정한다.
그렇지 않고 serialized.[[Type]]이 "Set"인 경우:
value를 [[SetData]] 내부 슬롯 값이 새로운 빈 List인 targetRealm의 새로운 Set 객체로 설정한다.
deep을 true로 설정한다.
그렇지 않고 serialized.[[Type]]이 "Array"인 경우:
outputProto를 targetRealm.[[Intrinsics]].[[%Array.prototype%]]로 둔다.
value를 ! ArrayCreate(serialized.[[Length]], outputProto)로 설정한다.
deep을 true로 설정한다.
그렇지 않고 serialized.[[Type]]이 "Object"인 경우:
value를 targetRealm의 새로운 Object로 설정한다.
deep을 true로 설정한다.
그렇지 않고 serialized.[[Type]]이 "Error"인 경우:
prototype을 %Error.prototype%으로 둔다.
serialized.[[Name]]이 "EvalError"이면 prototype을 %EvalError.prototype%으로 설정한다.
serialized.[[Name]]이 "RangeError"이면 prototype을 %RangeError.prototype%으로 설정한다.
serialized.[[Name]]이 "ReferenceError"이면 prototype을 %ReferenceError.prototype%으로 설정한다.
serialized.[[Name]]이 "SyntaxError"이면 prototype을 %SyntaxError.prototype%으로 설정한다.
serialized.[[Name]]이 "TypeError"이면 prototype을 %TypeError.prototype%으로 설정한다.
serialized.[[Name]]이 "URIError"이면 prototype을 %URIError.prototype%으로 설정한다.
message를 serialized.[[Message]]로 둔다.
value를 OrdinaryObjectCreate(prototype, « [[ErrorData]], [[Stack]] »)로 설정한다.
messageDesc를 PropertyDescriptor { [[Value]]: message, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }로 둔다.
message가 undefined가 아니면 !
OrdinaryDefineOwnProperty(value,
"message",
messageDesc)를 수행한다.
value.[[Stack]]을 serialized.[[Stack]]으로 설정한다.
serialized에 첨부된 흥미로운 부가 데이터는 역직렬화하여 value에 첨부하는 것이 좋다.
그렇지 않은 경우:
interfaceName을 serialized.[[Type]]으로 둔다.
interfaceName이 식별하는 인터페이스가 targetRealm에
노출되지 않았으면
"DataCloneError" DOMException을 던진다.
value를 targetRealm에서 생성된, interfaceName이 식별하는 인터페이스의 새로운 인스턴스로 설정한다.
deep을 true로 설정한다.
memory[serialized]를 value로 설정한다.
deep이 true인 경우:
serialized.[[Type]]이 "Map"인 경우:
serialized.[[MapData]]의 각 요소인 Record { [[Key]], [[Value]] } entry에 대해:
deserializedKey를 ? StructuredDeserialize(entry.[[Key]], targetRealm, memory)로 둔다.
deserializedValue를 ? StructuredDeserialize(entry.[[Value]], targetRealm, memory)로 둔다.
{ [[Key]]: deserializedKey, [[Value]]: deserializedValue }를 value.[[MapData]]에 추가한다.
그렇지 않고 serialized.[[Type]]이 "Set"인 경우:
serialized.[[SetData]]의 각 요소 entry에 대해:
deserializedEntry를 ? StructuredDeserialize(entry, targetRealm, memory)로 둔다.
deserializedEntry를 value.[[SetData]]에 추가한다.
그렇지 않고 serialized.[[Type]]이 "Array" 또는 "Object"인 경우:
serialized.[[Properties]]의 각 요소인 Record { [[Key]], [[Value]] } entry에 대해:
deserializedValue를 ? StructuredDeserialize(entry.[[Value]], targetRealm, memory)로 둔다.
result를 ! CreateDataProperty(value, entry.[[Key]], deserializedValue)로 둔다.
단언: result는 true이다.
그렇지 않은 경우:
serialized, value 및 targetRealm이 주어진, serialized.[[Type]]이 식별하는 인터페이스에 대한 적절한 역직렬화 단계를 수행한다.
역직렬화 단계에서는 하위 역직렬화를 수행해야 할 수 있다. 이는 이전에 직렬화된 Record subSerialized를 입력으로 받아 StructuredDeserialize(subSerialized, targetRealm, memory)를 반환하는 연산이다. (다시 말해 하위 역직렬화는 이 호출 내에서 일관성을 유지하도록 StructuredDeserialize를 특수화한 것이다.)
value를 반환한다.
memory를 빈 맵으로 둔다.
StructuredSerializeInternal에서 일반적으로 사용되는 방식에 더해, 이 알고리즘에서 memory는 또한 StructuredSerializeInternal이 transferList의 항목을 무시하도록 보장하고, 대신 자체적으로 처리할 수 있게 하는 데 사용된다.
각각에 대해 transferList의 transferable:
transferable에 [[ArrayBufferData]] 내부 슬롯도
[[Detached]] 내부 슬롯도 없으면
"DataCloneError" DOMException을
던진다.
transferable에 [[ArrayBufferData]] 내부 슬롯이 있고
IsSharedArrayBuffer(transferable)가 true이면
"DataCloneError" DOMException을
던진다.
memory[transferable]가 존재하면,
"DataCloneError" DOMException을
던진다.
설정한다. memory[transferable]를 { [[Type]]: 초기화되지 않은 값 }으로.
전송에는 부작용이 있고 StructuredSerializeInternal이 먼저 예외를 던질 수 있어야 하므로 transferable은 아직 전송되지 않는다.
serialized를 ? StructuredSerializeInternal(value, false, memory)로 둔다.
transferDataHolders를 새로운 빈 List로 둔다.
각각에 대해 transferList의 transferable:
transferable에 [[ArrayBufferData]] 내부 슬롯이 있고
IsDetachedBuffer(transferable)가 true이면
"DataCloneError" DOMException을
던진다.
transferable에 [[Detached]] 내부 슬롯이 있고
transferable.[[Detached]]가 true이면
"DataCloneError" DOMException을
던진다.
dataHolder를 memory[transferable]로 둔다.
transferable에 [[ArrayBufferData]] 내부 슬롯이 있으면:
transferable에 [[ArrayBufferMaxByteLength]] 내부 슬롯이 있으면:
dataHolder.[[Type]]을 "ResizableArrayBuffer"로 설정한다.
dataHolder.[[ArrayBufferData]]를 transferable.[[ArrayBufferData]]로 설정한다.
dataHolder.[[ArrayBufferByteLength]]를 transferable.[[ArrayBufferByteLength]]로 설정한다.
dataHolder.[[ArrayBufferMaxByteLength]]를 transferable.[[ArrayBufferMaxByteLength]]로 설정한다.
그렇지 않은 경우:
dataHolder.[[Type]]을 "ArrayBuffer"로 설정한다.
dataHolder.[[ArrayBufferData]]를 transferable.[[ArrayBufferData]]로 설정한다.
dataHolder.[[ArrayBufferByteLength]]를 transferable.[[ArrayBufferByteLength]]로 설정한다.
? DetachArrayBuffer(transferable)를 수행한다.
명세는 [[ArrayBufferDetachKey]] 내부 슬롯을 사용하여
ArrayBuffer가
분리되지 않도록 할 수 있다. 예를 들어 이는
WebAssembly JavaScript Interface에서 사용된다. [WASMJS]
그렇지 않은 경우:
추가한다. dataHolder를 transferDataHolders에.
{ [[Serialized]]: serialized, [[TransferDataHolders]]: transferDataHolders }를 반환한다.
memory를 빈 맵으로 둔다.
StructuredSerializeWithTransfer와 마찬가지로, 이 알고리즘에서 memory는 StructuredDeserialize에서 일반적으로 사용되는 방식에 더해 StructuredDeserialize가 serializeWithTransferResult.[[TransferDataHolders]]의 항목을 무시하도록 보장하고, 대신 자체적으로 처리할 수 있게 하는 데에도 사용된다.
transferredValues를 새로운 빈 List로 둔다.
각 serializeWithTransferResult.[[TransferDataHolders]]의 transferDataHolder에 대해:
value를 초기화되지 않은 값으로 둔다.
transferDataHolder.[[Type]]이 "ArrayBuffer"이면, value를 [[ArrayBufferData]] 내부 슬롯 값이 transferDataHolder.[[ArrayBufferData]]이고, [[ArrayBufferByteLength]] 내부 슬롯 값이 transferDataHolder.[[ArrayBufferByteLength]]인 targetRealm의 새로운 ArrayBuffer 객체로 설정한다.
[[ArrayBufferData]]가 원래 차지하던 메모리에 역직렬화 중 접근할 수 있는 경우에는 새로운 메모리를 할당할 필요가 없으므로 이 단계에서 예외가 발생할 가능성이 낮다. 대신 [[ArrayBufferData]]가 차지하던 메모리가 새로운 ArrayBuffer로 그대로 전송된다. 예를 들어 출처 렐름과 대상 렐름이 모두 같은 프로세스에 있는 경우가 이에 해당할 수 있다.
그렇지 않고 transferDataHolder.[[Type]]이 "ResizableArrayBuffer"이면, value를 [[ArrayBufferData]] 내부 슬롯 값이 transferDataHolder.[[ArrayBufferData]]이고, [[ArrayBufferByteLength]] 내부 슬롯 값이 transferDataHolder.[[ArrayBufferByteLength]]이며, [[ArrayBufferMaxByteLength]] 내부 슬롯 값이 transferDataHolder.[[ArrayBufferMaxByteLength]]인 targetRealm의 새로운 ArrayBuffer 객체로 설정한다.
이전 단계와 같은 이유로 이 단계에서도 예외가 발생할 가능성이 낮다.
그렇지 않은 경우:
interfaceName을 transferDataHolder.[[Type]]으로 둔다.
interfaceName으로 식별되는 인터페이스가
targetRealm에 노출되지 않으면 "DataCloneError"
DOMException을
던진다.
value를 targetRealm에서 생성된, interfaceName으로 식별되는 인터페이스의 새로운 인스턴스로 설정한다.
transferDataHolder와 value가 주어졌을 때 interfaceName으로 식별되는 인터페이스에 적절한 전송 수신 단계를 수행한다.
memory[transferDataHolder]를 설정하여 value로 한다.
value를 추가하여 transferredValues에 넣는다.
deserialized를 ? StructuredDeserialize(serializeWithTransferResult.[[Serialized]], targetRealm, memory)로 둔다.
{ [[Deserialized]]: deserialized, [[TransferredValues]]: transferredValues }를 반환한다.
다른 명세에서는 여기에 정의된 추상 연산을 사용할 수 있다. 다음에서는 각 추상 연산이 일반적으로 유용한 경우에 관한 몇 가지 지침과 예를 제공한다.
전송 리스트와 함께 값을 다른 렐름으로 복제하지만 대상 렐름을 미리 알 수 없는 경우이다. 이 경우 직렬화 단계는 즉시 수행할 수 있으며, 역직렬화 단계는 대상 렐름을 알게 될 때까지 지연할 수 있다.
messagePort.postMessage()는
대상 렐름을
MessagePort가
전송될
때까지 알 수 없으므로 이 추상 연산 쌍을 사용한다.
주어진 값에 대해 렐름과 독립적인 스냅샷을 생성하여 무기한 저장한 다음, 나중에 하나 이상의 JavaScript 값으로 다시 구체화할 수 있는 경우이다.
StructuredSerializeForStorage는
직렬화 결과를 렐름 간에 전달하는 대신 영구적인 방식으로
저장할 것으로 예상되는 상황에서 사용할 수 있다. 공유 메모리를 저장하는 것은
의미가 없으므로 SharedArrayBuffer
객체를 직렬화하려고 하면 예외를 던진다.
마찬가지로 forStorage 인수가 true일 때 사용자 정의 플랫폼
객체에 직렬화 단계가 있으면
예외를 던지거나 다른 동작을 할 수 있다.
history.pushState()와
history.replaceState()는
작성자가 제공한 상태 객체에
StructuredSerializeForStorage를
사용하고, 이를 적절한 직렬화된 상태로
세션 기록 항목에 저장한다.
그런 다음
StructuredDeserialize를
사용하여 history.state
속성이 원래 제공된 상태 객체의 복제본을 반환할 수 있게 한다.
broadcastChannel.postMessage()는
입력에
StructuredSerialize를
사용한 다음 결과에 StructuredDeserialize를
여러 번 사용하여 브로드캐스트되는 각 대상에 새로운 복제본을 생성한다.
여러 대상이 있는 상황에서는 전송이 의미가 없다는 점에 유의한다.
JavaScript 값을 파일 시스템에 영구 저장하는 모든 API 역시 입력에 StructuredSerializeForStorage를 사용하고 출력에 StructuredDeserialize를 사용한다.
일반적으로 호출 지점은 JavaScript 값 대신 Web IDL 값을 전달할 수 있다. 이는 이러한 알고리즘을 호출하기 전에 JavaScript 값으로 암시적인 변환을 수행하는 것으로 이해해야 한다.
작성자 코드가 사용자 에이전트 메서드를 동기적으로 호출한 결과로 호출되지 않는 호출 지점은 임의의 객체에 대해 StructuredSerialize, StructuredSerializeForStorage 또는 StructuredSerializeWithTransfer 추상 연산을 호출하기 전에 적절하게 스크립트 실행을 준비하고 콜백 실행을 준비해야 한다. 이는 직렬화 프로세스가 마지막 심층 직렬화 단계의 일부로 작성자가 정의한 접근자를 호출할 수 있고, 이러한 접근자가 진입 및 현행 개념이 올바르게 설정되어 있어야 하는 연산을 호출할 수 있기 때문이다.
window.postMessage()는
인수에
StructuredSerializeWithTransfer를
사용하지만 알고리즘의 동기적 부분 내에서 즉시 수행하도록 주의한다.
따라서 스크립트 실행을 준비하고
콜백 실행을
준비할 필요 없이 이 알고리즘을 사용할 수 있다.
반대로 가상의 API가 StructuredSerialize를 사용하여 작성자가 제공한 객체를 태스크에서 직접 이벤트 루프상에서 주기적으로 직렬화한다면, 사전에 적절한 준비를 수행하도록 보장해야 한다. 현재 플랫폼에는 이러한 API가 없는 것으로 알려져 있다. 일반적으로 작성자 코드의 동기적인 결과로 직렬화를 미리 수행하는 것이 더 간단하다.
result = self.structuredClone(value[, { transfer }])
입력 값을 받아 구조화된 복제 알고리즘을 수행하여 심층 복사본을 반환한다.
전송 가능 객체 중
transfer
배열에 나열된 객체는 단순히 복제되는 것이 아니라 전송되며, 이는 입력 값에서 더 이상
사용할 수 없음을 의미한다.
입력 값의 일부라도 "DataCloneError" DOMException을
던진다.
입력 값의 일부라도 직렬화 가능하지 않은 경우이다.
현재 모든 엔진에서 지원된다.
structuredClone(value,
options) 메서드 단계는 다음과 같다.
serialized를 ?
StructuredSerializeWithTransfer(value,
options["transfer"])로
둔다.
deserializeRecord를 ? StructuredDeserializeWithTransfer(serialized, this의 관련 렐름)으로 둔다.
deserializeRecord.[[Deserialized]]를 반환한다.
HTML UA의 모든 XML 및 HTML 문서는 Document 객체로 표현된다.
[DOM]
Document 객체의 URL은
DOM에 정의되어 있다. 이는 Document 객체가 생성될 때 처음
설정되지만,
Document 객체의 수명 동안 변경될 수 있다.
예를 들어 사용자가 페이지의 탐색을 통해 프래그먼트로 이동하거나
pushState() 메서드가
새로운 URL과
함께 호출되면 변경된다. [DOM]
대화형 사용자 에이전트는 일반적으로 Document 객체의
URL을 사용자 인터페이스에 노출한다. 이는 사용자가 사이트가
다른 사이트를 사칭하려 하는지 판단할 수 있는 주요
메커니즘이다.
Document 객체의 출처는
DOM에 정의되어 있다. 이는 Document 객체가 생성될 때 처음
설정되며,
Document의 수명 동안
document.domain을 설정할
때에만 변경될 수 있다. Document의 출처는 그 출처인 URL과 다를 수 있다.
예를 들어 자식 탐색 가능 항목이 생성되면, 그 활성 문서의 출처는 그 부모의 활성 문서의
출처에서 상속된다. 이는 그 활성 문서의 URL이
about:blank인 경우에도 마찬가지이다. [DOM]
Document가 스크립트에서
createDocument()
또는 createHTMLDocument()
메서드를 사용하여 생성되면,
Document는 즉시 로드 후 태스크를 수행할 준비가 된다.
문서의 리퍼러는 URL을 나타내는
문자열로, Document가 생성될 때 설정할 수
있다. 명시적으로 설정하지 않으면 그 값은
빈 문자열이다.
Document 객체현재 모든 엔진에서 지원된다.
DOM은 Document
인터페이스를 정의하며, 이 명세는 이를
상당히 확장한다.
enum DocumentReadyState { "loading" , "interactive" , "complete" };
enum DocumentVisibilityState { "visible" , "hidden" };
typedef (HTMLScriptElement or SVGScriptElement ) HTMLOrSVGScriptElement ;
[LegacyOverrideBuiltIns ]
partial interface Document {
static Document parseHTMLUnsafe ((TrustedHTML or DOMString ) html , optional ParseHTMLUnsafeOptions options = {});
static Document parseHTML (DOMString html , optional SetHTMLOptions options = {});
// resource metadata management
[PutForwards =href , LegacyUnforgeable ] readonly attribute Location ? location ;
attribute USVString domain ;
readonly attribute USVString referrer ;
attribute USVString cookie ;
readonly attribute DOMString lastModified ;
readonly attribute DocumentReadyState readyState ;
// DOM tree accessors
getter object (DOMString name );
[CEReactions ] attribute DOMString title ;
[CEReactions ] attribute DOMString dir ;
[CEReactions ] attribute HTMLElement ? body ;
readonly attribute HTMLHeadElement ? head ;
[SameObject ] readonly attribute HTMLCollection images ;
[SameObject ] readonly attribute HTMLCollection embeds ;
[SameObject ] readonly attribute HTMLCollection plugins ;
[SameObject ] readonly attribute HTMLCollection links ;
[SameObject ] readonly attribute HTMLCollection forms ;
[SameObject ] readonly attribute HTMLCollection scripts ;
NodeList getElementsByName (DOMString elementName );
readonly attribute HTMLOrSVGScriptElement ? currentScript ; // classic scripts in a document tree only
// dynamic markup insertion
[CEReactions ] Document open (optional DOMString unused1 , optional DOMString unused2 ); // both arguments are ignored
WindowProxy ? open (USVString url , DOMString name , DOMString features );
[CEReactions ] undefined close ();
[CEReactions ] undefined write ((TrustedHTML or DOMString )... text );
[CEReactions ] undefined writeln ((TrustedHTML or DOMString )... text );
// user interaction
readonly attribute WindowProxy ? defaultView ;
boolean hasFocus ();
[CEReactions ] attribute DOMString designMode ;
[CEReactions ] boolean execCommand (DOMString commandId , optional boolean showUI = false , optional DOMString value = "");
boolean queryCommandEnabled (DOMString commandId );
boolean queryCommandIndeterm (DOMString commandId );
boolean queryCommandState (DOMString commandId );
boolean queryCommandSupported (DOMString commandId );
DOMString queryCommandValue (DOMString commandId );
readonly attribute boolean hidden ;
readonly attribute DocumentVisibilityState visibilityState ;
// special event handler IDL attributes that only apply to Document objects
[LegacyLenientThis ] attribute EventHandler onreadystatechange ;
attribute EventHandler onvisibilitychange ;
// also has obsolete members
};
Document includes GlobalEventHandlers ;
각 Document에는 정책 컨테이너가 있으며,
이는 처음에는 새로운 정책 컨테이너이고, Document에 적용되는 정책을 포함한다.
각 Document에는 권한 정책이 있으며,
이는 권한
정책이고 처음에는
비어 있다.
각 Document에는 모듈 맵이 있으며,
이는 처음에 비어 있는 모듈 맵이다.
각 Document에는 오프너 정책이 있으며,
이는 처음에 새로운 오프너 정책인 오프너
정책이다.
각 Document에는 초기 about:blank 여부가 있으며,
이는 처음에 false인 불리언이다.
각 Document에는 WebDriver BiDi용 로드 중
탐색 ID가 있으며, 이는 처음에
null인 탐색 ID 또는 null이다.
이름에서 알 수 있듯이 이는 WebDriver
BiDi 명세와 상호작용하는 데 사용된다. 이 명세에는 Document 수명 주기의 초기
부분에 발생하는 특정 사건을 알려야 하며, 이 사건을 해당 Document를
생성한 탐색이
진행 중인 탐색이었을 때 사용된
원래
탐색 ID에 연결해야 한다. 이는
WebDriver
BiDi가 로드 프로세스가 완료되었다고 간주한 후 결국 다시 null로 설정된다. [BIDI]
각 Document에는 about 기준
URL이 있으며, 이는 처음에 null인 URL 또는 null이다.
이는 "about:" 스킴을 사용하는
Document에만 채워진다.
각 Document에는 bfcache 차단 세부 정보가 있으며, 이는
처음에 비어 있는 집합인
복원되지 않은 이유 세부 정보의 집합이다.
각 Document에는 열린 대화상자 리스트가 있으며, 이는 처음에 비어 있는 리스트인
dialog 요소의
리스트이다.
DocumentOrShadowRoot
인터페이스DOM은 DocumentOrShadowRoot
믹스인을 정의하며, 이 명세는 이를
확장한다.
partial interface mixin DocumentOrShadowRoot {
readonly attribute Element ? activeElement ;
};
Document 객체에는 연관된 내부
조상 출처 객체
리스트가 있으며, 처음에는 null이다.
Document 객체
document와 리퍼러
정책
referrerPolicy이 주어질 때 내부 조상
출처 객체 리스트 생성
단계는 다음과 같다.
output을 « »로 둔다.
parentDoc을 document의 컨테이너 문서로 둔다.
parentDoc이 null이면 output을 반환한다.
ancestorOrigins를 parentDoc의 내부 조상 출처 객체 리스트로 둔다.
container를 document의 노드 탐색 가능 항목의 컨테이너로 둔다.
masked를 false로 둔다.
referrerPolicy가 "no-referrer"이면
masked를 true로 설정한다.
그렇지 않고 referrerPolicy가 "same-origin"이며
parentDoc의 출처가
document의 동일
출처인 출처가 아니면
masked를 true로 설정한다.
혼합
콘텐츠 검사는 비보안
컨텍스트
환경이 보안 컨텍스트 환경에 존재하는 것을 방지하므로, "strict-origin",
"strict-origin-when-cross-origin" 및 "no-referrer-when-downgrade"에 대해
보안 컨텍스트를 확인할 필요가 없다.
여기서는 최대한 출처만
노출하므로 "origin" 및 "origin-when-cross-origin" 값에도 특별한 처리가
필요하지 않다.
그렇지 않으면 parentDoc의 추가할 출처를 output에 넣는다.
각 ancestorOrigins의 ancestorOrigin에 대해:
output을 반환한다.
Document 객체에는 연관된 조상 출처 리스트가
있으며, 처음에는 null이다.
Document 객체
document가 주어질 때 조상 출처 리스트 생성 단계는
다음과 같다.
ancestorOrigins를 document의 내부 조상 출처 객체 리스트로 둔다.
단언: ancestorOrigins는 null이 아니다.
output을 « »로 둔다.
각 ancestorOrigins의 origin에 대해:
origin의 추가할 직렬화를 output에 넣는다.
연관 리스트가
output인 새로운 DOMStringList
객체를 반환한다.
URL이 https://a.example/top인 최상위
브라우징 컨텍스트 문서를 살펴보자.
<!doctype html>
< title > top</ title >
< iframe referrerpolicy = "no-referrer" src = "https://a.example/child" ></ iframe >
자식 문서는 다음과 같다.
<!doctype html>
< title > child</ title >
< iframe src = "https://b.example/grandchild" ></ iframe >
< script >
console. log([... location. ancestorOrigins]);
</ script >
손자 문서는 다음과 같다.
<!doctype html>
< title > grandchild</ title >
< script >
console. log([... location. ancestorOrigins]);
</ script >
자식의 Document 객체가
생성될 때 부모의 출처는
iframe
요소의 referrerpolicy
속성 값이 "no-referrer"이므로 마스킹된다. 문서들이 동일
출처임에도 그렇다. 기록되는 값은
« "null" »이다.
손자의 Document 객체가
생성될 때 자식의
Document 객체의 내부 조상 출처 객체
리스트(하나의 불투명 출처를 포함함)가
시작점으로 사용되고 자식의 출처가
리스트에 추가된다. 따라서 기록되는 값은 « "https://a.example",
"null" »이다.
이전 예에서 최상위 문서의 iframe
요소에는
referrerpolicy
속성이 없고, 대신 자식 문서의
iframe 요소에
referrerpolicy="no-referrer"가 있다고 하자.
이 경우 최상위 문서의 출처가
자식의 Document 객체의 내부 조상 출처 객체
리스트에 추가된다. 기록되는 값은 « "https://a.example" »이다.
손자의 경우 자식의 출처가
불투명 출처로 마스킹된다.
최상위 문서의 출처가 자식
문서의 동일 출처인
출처이므로
이 역시 마스킹된다. 따라서 기록되는 값은
« "null", "null" »이다.
이 예에서는 중간에 교차 출처 문서가 있으므로 출처가 마스킹된 동일 출처 자손 문서가 있더라도 최상위 문서의 출처는 마스킹되지 않음을 보여 준다.
URL이 https://a.example/top인 최상위 문서
< iframe src = "https://b.example/child" ></ iframe >
조상 출처 리스트의 연관 리스트는 « »이다.
URL이 https://b.example/child인 자식 문서
< iframe src = "https://a.example/grandchild" ></ iframe >
조상 출처 리스트의
연관 리스트는 « "https://a.example" »이다.
URL이 https://a.example/grandchild인 손자 문서
< iframe src = "https://c.example/great-grandchild"
referrerpolicy = "no-referrer" ></ iframe >
조상 출처 리스트의
연관 리스트는 « "https://b.example", "https://a.example" »이다.
URL이 https://c.example/great-grandchild인 증손자 문서
조상 출처 리스트의
연관 리스트는 « "null", "https://b.example",
"https://a.example" »이다. 최상위 출처는 마스킹되지 않는다.
이전 예에서 최상위 문서의 iframe에도
referrerpolicy="no-referrer"가 있다면, 각 문서에 대한 결과 조상 출처 리스트의 연관 리스트는
다음과 같다.
최상위: « »
자식: « "null" »
손자: « "https://b.example", "null"
»
증손자: « "null", "https://b.example", "null" ». 최상위
출처는
자식 문서가 내부 조상 출처 객체 리스트 생성
단계를 실행할 때 마스킹되었고, 그 결과가 손자 문서의
내부 조상 출처 객체 리스트 생성
단계로 전달되는 식으로 계속되므로 마스킹된다.
document.referrer
현재 모든 엔진에서 지원된다.
차단되었거나 그러한 문서가 없지 않은 한, 사용자가 현재 문서로 탐색해 온 Document의 URL을
반환한다. 차단되었거나 그러한 문서가 없으면 빈 문자열을 반환한다.
noreferrer
링크 유형을 사용하여 리퍼러를
차단할 수 있다.
referrer
속성은 문서의 리퍼러를 반환해야
한다.
document.cookie [ = value ]
Document에 적용되는 HTTP 쿠키를
반환한다. 쿠키가 없거나 이 리소스에
쿠키를 적용할 수 없으면 빈 문자열을 반환한다.
설정하여 요소의 HTTP 쿠키 집합에 새 쿠키를 추가할 수 있다.
콘텐츠가 불투명 출처로
샌드박스 처리된 경우(예: iframe에
sandbox
속성이 있는 경우), 가져오기 및
설정 시 "SecurityError" DOMException이
발생한다.
현재 모든 엔진에서 지원된다.
cookie
속성은 문서의 URL로
식별되는 리소스의 쿠키를 나타낸다.
동기식 document.cookie
API를 사용하면 성능 문제가 발생할 수 있다. 대신 비동기 방식으로 쿠키를 처리하여 성능 문제를
피할 수 있는 Cookie Store API를 사용할 수 있다. 자세한 내용은 Cookie
Store API 소개를 참조한다. [COOKIESTORE]
다음 조건 중 하나에 해당하는 Document 객체는
쿠키 비수용 Document 객체이다.
가져올 때 문서가 쿠키 비수용
Document 객체이면
사용자 에이전트는 빈 문자열을 반환해야 한다. 그렇지 않고 Document의 출처가
불투명
출처이면 사용자 에이전트는 "SecurityError"
DOMException을
던져야 한다.
그렇지 않으면 사용자 에이전트는 문서의 URL에
대한 "비 HTTP" API용 쿠키 문자열을
BOM
없이 UTF-8 디코딩하여 반환해야 한다. [COOKIES]
설정할 때 문서가 쿠키 비수용 Document
객체이면 사용자 에이전트는 아무 작업도 하지 않아야 한다. 그렇지 않고 Document의 출처가
불투명
출처이면 사용자 에이전트는 "SecurityError"
DOMException을
던져야 한다.
그렇지 않으면 사용자 에이전트는 새 값을
UTF-8로 인코딩한 것으로 구성된 "비 HTTP" API를 통해 문서의
URL에
대한 set-cookie-string을 수신했을 때와 같이 동작해야 한다.
[COOKIES] [ENCODING]
cookie 속성은
프레임 간에 접근할 수 있으므로 쿠키의 경로 제한은 어떤 쿠키가 사이트의 어느 부분으로
전송되는지를 관리하는 데 도움을 주는 도구일 뿐이며, 어떠한 방식으로도 보안 기능이 아니다.
cookie
속성의 getter와
setter는 공유 상태에 동기적으로 접근한다. 잠금 메커니즘이 없으므로 다중 프로세스 사용자
에이전트의 다른 브라우징 컨텍스트가 스크립트 실행 중에 쿠키를 수정할 수 있다. 예를 들어
사이트가 쿠키를 읽고 값을 증가시킨 다음 다시 기록하여 쿠키의 새 값을 세션의 고유 식별자로
사용하려 할 수 있다. 사이트가 서로 다른 두 브라우저 창에서 이 작업을 동시에 두 번 수행하면,
두 세션 모두에 동일한 "고유" 식별자를 사용하게 되어 잠재적으로 심각한 결과가 발생할 수 있다.
document.lastModified
현재 모든 엔진에서 지원된다.
서버가 보고한 문서의 마지막 수정 날짜를 사용자의 현지 시간대로
"MM/DD/YYYY hh:mm:ss" 형식으로 반환한다.
마지막 수정 날짜를 알 수 없으면 대신 현재 시간을 반환한다.
lastModified 속성은 가져올 때
Document의 소스 파일이 마지막으로
수정된 날짜와 시간을 사용자의
현지 시간대에 따라 다음 형식으로 반환해야 한다.
날짜의 월 구성 요소.
U+002F SOLIDUS 문자(/).
날짜의 일 구성 요소.
U+002F SOLIDUS 문자(/).
날짜의 연도 구성 요소.
U+0020 SPACE 문자.
시간의 시 구성 요소.
U+003A COLON 문자(:).
시간의 분 구성 요소.
U+003A COLON 문자(:).
시간의 초 구성 요소.
연도를 제외한 위의 모든 숫자 구성 요소는 10진수 숫자를 나타내는 두 개의 ASCII 숫자로 제공해야 하며, 필요한 경우 0으로 채워야 한다. 연도는 10진수 숫자를 나타내는 네 자리 이상의 ASCII 숫자로 이루어진 가능한 한 가장 짧은 문자열로 제공해야 하며, 필요한 경우 0으로 채워야 한다.
Document의 소스 파일의 마지막
수정 날짜와 시간은 사용된 네트워크 프로토콜의
관련 기능에서 파생해야 한다. 예를 들어 문서의 HTTP `Last-Modified`
헤더 값이나 로컬 파일의 파일 시스템
메타데이터에서 파생해야 한다. 마지막 수정 날짜와 시간을 알 수 없으면 속성은 위 형식으로
현재 날짜와 시간을 반환해야 한다.
document.readyState
Document가 로딩 중인 동안
"loading"을 반환하고, 파싱은 끝났지만 하위 리소스를 계속 로딩 중이면
"interactive"를 반환하며, 로딩이 완료되면 "complete"를 반환한다.
이 값이 변경되면 Document 객체에서
readystatechange
이벤트가 발생한다.
DOMContentLoaded
이벤트는 "interactive"로 전환된 후 "complete"로 전환되기 전에,
async
script
요소를 제외한 모든 하위 리소스가 로딩된 시점에 발생한다.
현재 모든 엔진에서 지원된다.
각 Document에는 문자열인
현재 문서 준비 상태가 있으며, 처음에는
"complete"이다.
Document 객체 생성 및 초기화
알고리즘을 통해 생성된 Document
객체의 경우, 어떤 스크립트도 document.readyState
값을 관찰하기 전에 이 값이 즉시 "loading"으로 재설정된다.
이 기본값은 초기
about:blank Document나
브라우징 컨텍스트가 없는
Document와 같은 다른 경우에도
적용된다.
readyState
getter 단계는
this의 현재 문서 준비 상태를 반환하는 것이다.
Document
document의 현재 문서 준비 상태를 갱신하여
readinessValue로 만들려면:
document의 현재 문서 준비 상태가 readinessValue와 같으면 반환한다.
document의 현재 문서 준비 상태를 readinessValue로 설정한다.
document가 HTML 파서와 연결되어 있으면:
now를 document의 관련 전역 객체에 대해 주어진 현재 고해상도 시간으로 둔다.
readinessValue가 "complete"이고
document의 로드 타이밍 정보의 DOM 완료 시간이
0이면,
document의 로드 타이밍 정보의 DOM 완료
시간을
now로 설정한다.
그렇지 않고 readinessValue가 "interactive"이며
document의 로드 타이밍 정보의 DOM 대화 가능
시간이 0이면,
document의 로드 타이밍 정보의 DOM
대화 가능
시간을 now로 설정한다.
document에서 readystatechange라는
이름의 이벤트를
발생시킨다.
Document에는
문서 로드
타이밍 정보인 로드 타이밍 정보가 있다.
Document에는
문서
언로드 타이밍 정보인 이전
문서 언로드 타이밍이 있다.
Document에는 처음에
false인 불리언
교차 출처 리디렉션을 통해 생성되었음이
있다.
DOMHighResTimeStamp
값문서 언로드 타이밍 정보 구조체에는 다음 항목이 있다.
DOMHighResTimeStamp
값각 Document에는 처음에 빈 집합인
요소의 집합인
렌더링 차단 요소 집합이 있다.
다음 두 조건이 모두 참이면 Document
document는
렌더링이 차단된 상태이다.
document의 렌더링 차단 요소 집합이 비어 있지 않거나 document가 렌더링 차단 요소 추가를 허용한다.
document의 관련 전역 객체에 대해 주어진 현재 고해상도 시간이 구현 정의 제한 시간 값을 초과하지 않았다.
요소 el의 노드 문서 document가 렌더링이 차단된 상태이고, el이 document의 렌더링 차단 요소 집합에 있으면 el은 렌더링 차단 요소이다.
요소 el에서 렌더링을 차단하려면:
document를 el의 노드 문서로 둔다.
document가 렌더링 차단 요소 추가를 허용하면 el을 document의 렌더링 차단 요소 집합에 추가한다.
요소 el에서 렌더링 차단을 해제하려면:
document를 el의 노드 문서로 둔다.
el을 document의 렌더링 차단 요소 집합에서 제거한다.
렌더링 차단 요소 el이 브라우징 컨텍스트와 연결 해제되거나, el의 차단 속성 값이 변경되어 el이 더 이상 잠재적인 렌더링 차단 요소가 아니게 될 때마다 el에서 렌더링 차단을 해제한다.
document.head
현재 모든 엔진에서 지원된다.
head
요소를 반환한다.
document.title [ = value ]
HTML의 경우 title 요소가
제공하는 문서 제목을,
SVG의 경우 SVG
title 요소가 제공하는 문서 제목을 반환한다.
설정하여 문서 제목을 갱신할 수 있다. 갱신할 적절한 요소가 없으면 새 값은 무시된다.
현재 모든 엔진에서 지원된다.
title 속성은
가져올 때 다음
알고리즘을 실행해야 한다.
문서 요소가 SVG
svg 요소이면,
value를 문서
요소의 자식인 첫 번째 SVG
title 요소의 자식
텍스트 콘텐츠로 둔다.
그렇지 않으면 value를 title 요소의
자식
텍스트 콘텐츠로 두고, title
요소가 null이면 빈 문자열로 둔다.
value에서 ASCII 공백을 제거하고 축소한다.
value를 반환한다.
설정할 때는 다음 목록에서 처음으로 일치하는 조건에 해당하는 단계를 실행해야 한다.
svg 요소인 경우그렇지 않은 경우:
element 내부에서 주어진 값으로 모든 문자열을 치환한다.
아무 작업도 하지 않는다.
document.body [ = value ]
현재 모든 엔진에서 지원된다.
body 요소를 반환한다.
설정하여 body 요소를 교체할 수 있다.
새 값이 body 또는 frameset 요소가 아니면
"HierarchyRequestError" DOMException이
발생한다.
body
속성은 가져올 때 문서의 body 요소(body
요소, frameset 요소 또는 null)를
반환해야 한다. 설정할 때는 다음 알고리즘을
실행해야 한다.
body 또는 frameset 요소가 아니면
"HierarchyRequestError" DOMException을
던진다.
HierarchyRequestError" DOMException을
던진다.
body getter가
반환하는 값은
setter에 전달된 값과 항상 같지는 않다.
이 예에서 setter는 body 요소를
성공적으로 삽입한다
(SVG는 SVG
svg의 자식으로 body를 허용하지 않으므로 이는
부적합하다). 그러나 문서 요소가
html이 아니므로 getter는
null을 반환한다.
< svg xmlns = "http://www.w3.org/2000/svg" >
< script >
document. body = document. createElementNS( "http://www.w3.org/1999/xhtml" , "body" );
console. assert( document. body === null );
</ script >
</ svg >
document.images
현재 모든 엔진에서 지원된다.
Document에 있는 img 요소의 HTMLCollection을
반환한다.
document.embeds
현재 모든 엔진에서 지원된다.
document.plugins
현재 모든 엔진에서 지원된다.
Document에 있는 embed 요소의
HTMLCollection을
반환한다.
document.links
현재 모든 엔진에서 지원된다.
Document에서 href
속성이 있는 a 및 area 요소의
HTMLCollection을
반환한다.
document.forms
현재 모든 엔진에서 지원된다.
Document에 있는 form 요소의
HTMLCollection을
반환한다.
document.scripts
현재 모든 엔진에서 지원된다.
Document에 있는 script 요소의
HTMLCollection을
반환한다.
images
속성은 Document 노드를 루트로 하고,
필터가 img 요소에만 일치하는 HTMLCollection을
반환해야 한다.
embeds
속성은 Document 노드를 루트로 하고,
필터가 embed 요소에만 일치하는
HTMLCollection을
반환해야 한다.
plugins
속성은 embeds 속성이 반환하는 것과
동일한 객체를 반환해야 한다.
links
속성은 Document 노드를 루트로 하고,
필터가 href
속성이 있는 a
요소와 href
속성이 있는 area
요소에만 일치하는 HTMLCollection을
반환해야 한다.
forms
속성은 Document 노드를 루트로 하고,
필터가 form 요소에만 일치하는 HTMLCollection을
반환해야 한다.
scripts
속성은 Document 노드를 루트로 하고,
필터가 script 요소에만 일치하는
HTMLCollection을
반환해야 한다.
collection = document.getElementsByName(name)
현재 모든 엔진에서 지원된다.
getElementsByName(elementName) 메서드
단계는 해당 문서에서 값이 elementName 인수와
동일한 name 속성을 가진 모든 HTML
요소를 트리 순서로 포함하는 라이브 NodeList를
반환하는 것이다. 같은 인수로 Document
객체에서 메서드가 다시 호출되면 사용자 에이전트는 이전 호출이 반환한 것과 같은 객체를
반환할 수 있다. 그 밖의 경우에는 새로운 NodeList
객체를 반환해야 한다.
document.currentScript
현재 모든 엔진에서 지원된다.
요소가 클래식 스크립트를 나타내는 한, 현재 실행 중인
script
요소 또는 SVG
script 요소를 반환한다.
재진입 스크립트 실행의 경우 아직 실행을 끝내지 않은 요소 중 가장 최근에 실행을 시작한 요소를
반환한다.
Document가 현재
script 또는
SVG
script 요소를 실행하고 있지 않으면(예: 실행 중인 스크립트가 이벤트
핸들러 또는 타임아웃인 경우), 또는 현재 실행 중인 script나 SVG
script 요소가 모듈 스크립트를 나타내면
null을 반환한다.
currentScript 속성은 가져올 때 가장 최근에 설정된 값을
반환해야 한다. Document가 생성될 때 currentScript는
null로 초기화되어야 한다.
이 API는 script 또는 SVG script 요소를 전역으로 노출하기 때문에 구현자와 표준
커뮤니티에서 선호되지 않게 되었다. 따라서 모듈
스크립트를 실행하거나 섀도 트리에서
스크립트를 실행하는 것과 같은 최신 컨텍스트에서는 사용할 수 없다. 이러한 컨텍스트에서 실행 중인
스크립트를 전역으로 노출하지 않고 식별하는 새로운 해결책을 검토하고 있다.
이슈 #1013을 참조한다.
Document 인터페이스는 이름 있는
프로퍼티를 지원한다. 어느 순간이든 Document 객체
document의 지원되는 프로퍼티 이름은 다음 항목으로 구성되며,
기여한 요소에 따른 트리 순서를 따르고 이후 중복은 무시한다. 동일한 요소가 두 값을 모두
기여하면 id
속성의 값이 name 속성의 값보다 먼저 온다.
비어 있지 않은 name 콘텐츠 속성을 가지며 document를
루트로 하는
문서
트리 안에 있는 모든 노출된 embed, form, iframe,
img 및 노출된 object 요소의
name 콘텐츠 속성 값.
비어 있지 않은 id
콘텐츠 속성을 가지며 document를
루트로 하는
문서 트리 안에 있는 모든
노출된 object 요소의
id
콘텐츠 속성 값. 그리고
비어 있지 않은 id
콘텐츠 속성과 비어 있지 않은 name 콘텐츠 속성을 모두 가지며
document를 루트로 하는
문서
트리 안에 있는 모든 img
요소의 id
콘텐츠 속성 값.
Document에
대해 이름 있는 프로퍼티 name의 값을 결정하려면 사용자 에이전트는 다음
단계로 얻은 값을 반환해야 한다.
elements를 이름이 name이고 Document를
루트로 하는 문서
트리 안에 있는 이름 있는
요소의 리스트로 둔다.
그러한 요소가 하나 이상 존재한다. 그렇지 않으면 이 알고리즘은 Web IDL에 의해 호출되지 않았을 것이기 때문이다.
elements에 요소가 하나만 있고 그 요소가 iframe
요소이며, 해당 iframe
요소의
콘텐츠 탐색 가능 항목이 null이
아니면, 그 요소의
콘텐츠 탐색 가능 항목의
활성 WindowProxy를 반환한다.
그렇지 않고 elements에 요소가 하나만 있으면 그 요소를 반환한다.
그렇지 않으면 Document 노드를
루트로 하고 필터가 이름이 name인 이름 있는 요소에만 일치하는 HTMLCollection을
반환한다.
위 알고리즘의 목적상 이름이 name인 이름 있는 요소는 다음 중 하나에 해당하는 요소이다.
embed 또는 object 요소에
노출된 object 조상이 없고,
object 요소의 경우
추가로 대체
콘텐츠를 표시하고 있지 않거나 object 또는
embed 자손이 없으면
노출된 것으로 간주한다.
Document 인터페이스의
dir
속성은 dir
콘텐츠 속성과 함께 정의된다.
HTML의 요소, 속성 및 속성 값은 이 명세에서 특정한 의미, 즉 의미 체계를 갖도록 정의된다.
예를 들어 ol 요소는 순서 있는 리스트를 나타내고,
lang 속성은 콘텐츠의 언어를 나타낸다.
이러한 정의를 통해 웹 브라우저나 검색 엔진과 같은 HTML 처리기는 작성자가 고려하지 않았을 수도 있는 매우 다양한 컨텍스트에서 문서와 애플리케이션을 표시하고 사용할 수 있다.
간단한 예로, 데스크톱 컴퓨터 웹 브라우저만 고려한 작성자가 작성한 다음 웹 페이지를 살펴보자.
<!DOCTYPE HTML>
< html lang = "en" >
< head >
< title > My Page</ title >
</ head >
< body >
< h1 > Welcome to my page</ h1 >
< p > I like cars and lorries and have a big Jeep!</ p >
< h2 > Where I live</ h2 >
< p > I live in a small hut on a mountain!</ p >
</ body >
</ html >
HTML은 표현이 아니라 의미를 전달하므로 같은 페이지를 변경하지 않고도 휴대전화의 작은 브라우저에서 사용할 수 있다. 예를 들어 데스크톱에서처럼 제목을 큰 글자로 표시하는 대신 휴대전화의 브라우저는 페이지 전체에 같은 크기의 텍스트를 사용하되 제목을 굵게 표시할 수 있다.
그러나 이는 화면 크기의 차이를 넘어선다. 같은 페이지를 화면에 표시하는 대신 음성 합성을 기반으로 하는 브라우저를 사용하여, 예를 들어 헤드폰을 통해 페이지를 읽어 주는 시각 장애 사용자가 똑같이 사용할 수도 있다. 음성 브라우저는 제목에 큰 텍스트를 사용하는 대신 다른 음량이나 더 느린 음성을 사용할 수 있다.
그뿐만이 아니다. 브라우저는 페이지의 어느 부분이 제목인지 알기 때문에 사용자가 "다음 제목으로 이동" 또는 "이전 제목으로 이동" 키를 사용하여 문서를 빠르게 탐색할 수 있는 문서 개요를 만들 수 있다. 이러한 기능은 그렇지 않으면 페이지를 빠르게 탐색하기 어려운 음성 브라우저에서 특히 흔하다.
브라우저 외의 소프트웨어도 이 정보를 활용할 수 있다. 검색 엔진은 제목을 사용하여 페이지를 더 효과적으로 색인하거나 결과에서 페이지의 하위 섹션으로 연결되는 빠른 링크를 제공할 수 있다. 도구는 제목을 사용하여 목차를 만들 수 있다. 실제로 이 명세의 목차도 이러한 방식으로 생성된다.
이 예에서는 제목에 초점을 맞추었지만 같은 원칙은 HTML의 모든 의미 체계에 적용된다.
작성자는 요소, 속성 또는 속성 값을 적절한 의도상의 의미 목적 이외의 용도로 사용해서는 안 된다. 그렇게 하면 소프트웨어가 페이지를 올바르게 처리하지 못하기 때문이다.
예를 들어 기업 사이트의 제목을 나타내려는 다음 조각은 두 번째 줄이 하위 섹션의 제목이 아니라 같은 섹션의 종속 제목인 부제목 또는 소제목이기 때문에 부적합하다.
< body >
< h1 > ACME Corporation</ h1 >
< h2 > The leaders in arbitrary fast delivery since 1920</ h2 >
...
이러한 상황에는 hgroup
요소를 사용할 수 있다.
< body >
< hgroup >
< h1 > ACME Corporation</ h1 >
< p > The leaders in arbitrary fast delivery since 1920</ p >
</ hgroup >
...
다음 예의 문서는 구문상 올바르지만 셀에 배치된 데이터가 명백히 표 형식 데이터가 아니고
cite
요소가 잘못 사용되었으므로 마찬가지로 부적합하다.
<!DOCTYPE HTML>
< html lang = "en-GB" >
< head > < title > Demonstration </ title > </ head >
< body >
< table >
< tr > < td > My favourite animal is the cat. </ td > </ tr >
< tr >
< td >
—< a href = "https://example.org/~ernest/" >< cite > Ernest</ cite ></ a > ,
in an essay from 1992
</ td >
</ tr >
</ table >
</ body >
</ html >
이렇게 하면 이러한 의미 체계에 의존하는 소프트웨어가 실패한다. 예를 들어 시각 장애 사용자가 문서의 표를 탐색할 수 있게 하는 음성 브라우저는 위 인용문을 표로 보고하여 사용자를 혼란스럽게 할 수 있다. 마찬가지로 페이지에서 작품 제목을 추출하는 도구는 실제로는 작품 제목이 아니라 사람 이름인 "Ernest"를 작품 제목으로 추출한다.
이 문서의 수정된 버전은 다음과 같을 수 있다.
<!DOCTYPE HTML>
< html lang = "en-GB" >
< head > < title > Demonstration </ title > </ head >
< body >
< blockquote >
< p > My favourite animal is the cat. </ p >
</ blockquote >
< p >
—< a href = "https://example.org/~ernest/" > Ernest</ a > ,
in an essay from 1992
</ p >
</ body >
</ html >
작성자는 이 명세 또는 그 밖의 적용 가능한 명세에서 허용하지 않는 요소, 속성 또는 속성 값을 사용해서는 안 된다. 그렇게 하면 이후 언어를 확장하기가 상당히 어려워지기 때문이다.
다음 예에는 이 명세에서 허용하지 않는 부적합한 속성 값("carpet")과 부적합한 속성("texture")이 있다.
< label > Carpet: < input type = "carpet" name = "c" texture = "deep pile" ></ label >
다음은 이를 마크업하는 대안적이고 올바른 방법이다.
< label > Carpet: < input type = "text" class = "carpet" name = "c" data-texture = "deep pile" ></ label >
노드 문서의 브라우징 컨텍스트가 null인 DOM 노드는 HTML 구문 요구사항과 XML 구문 요구사항을 제외한 모든 문서 적합성 요구사항에서 면제된다.
특히 template 요소의
템플릿 콘텐츠의 노드
문서의 브라우징 컨텍스트는
null이다. 예를 들어 콘텐츠
모델 요구사항과 속성 값 마이크로구문 요구사항은 template 요소의
템플릿 콘텐츠에는 적용되지 않는다.
이 예에서 img 요소에는 template 요소 밖에서는
유효하지 않을 자리표시자인 속성 값이 있다.
< template >
< article >
< img src = "{{src}}" alt = "{{alt}}" >
< h1 ></ h1 >
</ article >
</ template >
그러나 위 마크업에서 </h1> 종료 태그를 생략하면
HTML 구문을 위반하게 되므로 적합성 검사기가 오류로 표시한다.
스크립팅 및 그 밖의 메커니즘을 통해 사용자 에이전트가 문서를 처리하는 동안 속성 값, 텍스트, 나아가 문서의 전체 구조가 동적으로 변경될 수 있다. 특정 시점에서 문서의 의미 체계는 그 시점의 문서 상태가 나타내는 것이므로 문서의 의미 체계는 시간에 따라 변경될 수 있다. 사용자 에이전트는 이러한 변경이 발생할 때 문서 표시를 갱신해야 한다.
HTML에는 진행률 표시줄을 설명하는 progress 요소가 있다.
그 "value" 속성이 스크립트에 의해 동적으로 갱신되면 UA는 진행률의 변화를 표시하도록 렌더링을
갱신한다.
DOM에서 HTML 요소를 나타내는 노드는 이 명세의 관련 섹션에 나열된 인터페이스를 구현하고 스크립트에 노출해야 한다. 여기에는 다른 컨텍스트, 예를 들어 XSLT 변환 내부에 있는 XML 문서의 HTML 요소도 포함된다.
DOM의 요소는 사물을 나타낸다. 즉, 의미 체계라고도 하는 고유한 의미를 가진다.
예를 들어 ol 요소는 순서
있는
리스트를 나타낸다.
요소는 명시적 또는 암시적으로 어떤 방식으로든 참조될 수 있다.
DOM의 요소를 명시적으로 참조하는 한 가지 방법은 요소에 id 속성을 부여한 다음,
그 id 속성 값을
하이퍼링크의 href 속성 값에 대한
프래그먼트로 사용하는
하이퍼링크를 만드는 것이다.
그러나 참조에 하이퍼링크가 반드시 필요한 것은 아니다. 해당 요소를 가리키는 어떤 방식이라도
충분하다.
id 속성이 부여된
다음 figure 요소를
살펴보자.
< figure id = "module-script-graph" >
< img src = "module-script-graph.svg"
alt = "Module A depends on module B, which depends
on modules C and D." >
< figcaption > Figure 27: a simple module graph</ figcaption >
</ figure >
a 요소를 사용하여 다음과
같이 하이퍼링크 기반
참조를 만들 수 있다.
As we can see in < a href = "#module-script-graph" > figure 27</ a > , ...
그러나 figure 요소를
참조하는 방법은 다음과 같이 매우 다양하다.
"모듈 A, B, C, D의 그림에 묘사된 것처럼..."
"그림 27에서..."(하이퍼링크 없이)
"'간단한 모듈 그래프' 그림의 콘텐츠에서..."
"아래 그림에서..."(그러나 이는 권장되지 않는다)
모든 HTML
요소의 인터페이스가 상속하고 추가 요구사항이 없는 요소가 사용해야 하는 기본 인터페이스는
HTMLElement 인터페이스이다.
현재 모든 엔진에서 지원된다.
현재 모든 엔진에서 지원된다.
현재 모든 엔진에서 지원된다.
현재 모든 엔진에서 지원된다.
현재 모든 엔진에서 지원된다.
현재 모든 엔진에서 지원된다.
[Exposed =Window ]
interface HTMLElement : Element {
[HTMLConstructor ] constructor ();
// metadata attributes
[CEReactions , Reflect ] attribute DOMString title ;
[CEReactions , Reflect ] attribute DOMString lang ;
[CEReactions ] attribute boolean translate ;
[CEReactions ] attribute DOMString dir ;
// user interaction
[CEReactions ] attribute (boolean or unrestricted double or DOMString )? hidden ;
[CEReactions , Reflect ] attribute boolean inert ;
undefined click ();
[CEReactions , Reflect ] attribute DOMString accessKey ;
readonly attribute DOMString accessKeyLabel ;
[CEReactions ] attribute boolean draggable ;
[CEReactions ] attribute boolean spellcheck ;
[CEReactions , ReflectSetter ] attribute DOMString writingSuggestions ;
[CEReactions , ReflectSetter ] attribute DOMString autocapitalize ;
[CEReactions ] attribute boolean autocorrect ;
[CEReactions ] attribute [LegacyNullToEmptyString ] DOMString innerText ;
[CEReactions ] attribute [LegacyNullToEmptyString ] DOMString outerText ;
ElementInternals attachInternals ();
// The popover API
undefined showPopover (optional ShowPopoverOptions options = {});
undefined hidePopover ();
boolean togglePopover (optional (TogglePopoverOptions or boolean ) options = {});
[CEReactions ] attribute DOMString ? popover ;
[CEReactions , Reflect , ReflectRange=(0, 8)] attribute unsigned long headingOffset ;
[CEReactions , Reflect ] attribute boolean headingReset ;
};
dictionary ShowPopoverOptions {
HTMLElement source ;
};
dictionary TogglePopoverOptions : ShowPopoverOptions {
boolean force ;
};
HTMLElement includes GlobalEventHandlers ;
HTMLElement includes ElementContentEditable ;
HTMLElement includes HTMLOrSVGOrMathMLElement ;
[Exposed =Window ]
interface HTMLUnknownElement : HTMLElement {
// Note: intentionally no [HTMLConstructor]
};
HTMLElement 인터페이스에는
서로 관련이 적은 여러 기능과 관련된 메서드 및 속성이 포함되므로 이 인터페이스의 구성원은
이 명세의 여러 다른 섹션에서 설명된다.
HTML 네임스페이스에서 이름이 name인 요소의 요소 인터페이스는 다음과 같이 결정된다.
name이 applet, bgsound, blink,
isindex, keygen, multicol, nextid 또는
spacer이면 HTMLUnknownElement를
반환한다.
name이 acronym, basefont, big,
center, nobr, noembed, noframes,
plaintext, rb, rtc, strike 또는
tt이면 HTMLElement를 반환한다.
name이 listing 또는 xmp이면
HTMLPreElement를
반환한다.
그렇지 않고 이 명세가 로컬 이름 name에 대응하는 요소 유형에 적합한 인터페이스를 정의하면 해당 인터페이스를 반환한다.
그 밖의 적용 가능한 명세가 name에 적합한 인터페이스를 정의하면 그 명세가 정의한 인터페이스를 반환한다.
name이 유효한
사용자 정의 요소 이름이면
HTMLElement를 반환한다.
HTMLUnknownElement를
반환한다.
유효한 사용자 정의
요소 이름의 경우 HTMLUnknownElement 대신
HTMLElement를 사용하는 것은
향후 발생할 수 있는 업그레이드가 요소의 프로토타입
체인을 HTMLUnknownElement에서
관련 없는 하위 클래스으로 수평 전환시키는 대신, HTMLElement에서 하위 클래스로
선형 전환시키도록 보장하기 위한 것이다.
HTML, SVG 및 MathML 요소가 공유하는 기능은
HTMLOrSVGOrMathMLElement
인터페이스 믹스인을 사용한다. [SVG] [MATHML]
한 엔진에서만 지원된다.
interface mixin HTMLOrSVGOrMathMLElement {
[SameObject ] readonly attribute DOMStringMap dataset ;
attribute DOMString nonce ; // intentionally no [CEReactions]
[CEReactions , Reflect ] attribute boolean autofocus ;
[CEReactions , ReflectSetter ] attribute long tabIndex ;
undefined focus (optional FocusOptions options = {});
undefined blur ();
};
HTML 요소도 SVG 요소도 MathML 요소도 아닌 요소의 예는 다음과 같이 생성한 요소이다.
const el = document.createElementNS("some namespace", "example");
console.assert(el.constructor === Element);
사용자 정의 요소 기능을 지원하기 위해 모든 HTML 요소에는
특별한 생성자 동작이 있다. 이는 [HTMLConstructor] IDL
확장 속성을 통해 표시된다. 이는 해당 인터페이스의 인터페이스 객체가
호출될 때 아래에 자세히 정의된 특정 동작을 하게 됨을 나타낸다.
[HTMLConstructor]
확장 속성은 인수를 취해서는 안 되며, 생성자
연산에만 나타나야 한다. 생성자 연산에는 한 번만 나타나야 하며, 인터페이스에는 주석이 지정된
단일 생성자 연산만 포함되어야 하고 다른 생성자 연산은 포함되어서는 안 된다. 주석이 지정된
생성자 연산은 인수를 취하지 않도록 선언되어야 한다.
[HTMLConstructor]
확장 속성이 주석으로 지정된 생성자 연산과 함께 선언된 인터페이스에는 다음과 같은
재정의된 생성자 단계가 있다:
NewTarget이 활성 함수
객체와 같으면, TypeError를
던진다.
사용자 정의 요소가 요소 인터페이스를 생성자로 사용하여 정의되면 이런 일이 발생할 수 있다:
customElements. define( "bad-1" , HTMLButtonElement);
new HTMLButtonElement(); // (1)
document. createElement( "bad-1" ); // (2)
이 경우 (1)과 같이 명시적으로 또는 (2)와 같이 암묵적으로 HTMLButtonElement를
실행하는 동안, 활성
함수 객체와
NewTarget은 모두 HTMLButtonElement이다.
이 검사가 없으면 지역 이름이
bad-1인 HTMLButtonElement
인스턴스를 생성할 수 있게 된다.
registry를 null로 둔다.
주변 에이전트의 활성 사용자 정의 요소 생성자 맵[NewTarget]이 존재하면, registry를 주변 에이전트의 활성 사용자 정의 요소 생성자 맵[NewTarget]으로 설정합니다.
그렇지 않으면 registry를 현재 전역 객체의 연결된
Document의 사용자 정의 요소 레지스트리로 설정합니다.
definition을 registry의 사용자 정의 요소
정의 집합에서 생성자가
NewTarget과 같은 항목으로 설정합니다. 그러한 항목이 없으면 TypeError를
발생시킵니다.
registry의 사용자 정의 요소 정의 집합에는 생성자가 undefined인 항목이 있을 수 없으므로, 이 단계는 HTML 요소 생성자가 함수로 호출되는 것도 방지합니다(그 경우 NewTarget이 undefined가 되기 때문입니다).
isValue를 null로 둔다.
definition의 지역 이름이 definition의 이름과 같으면(즉, definition이 자율 사용자 정의 요소에 관한 것이면):
활성
함수 객체가 HTMLElement가 아니면,
TypeError를
던진다.
사용자 정의 요소가 어떠한 지역 이름도 확장하지 않도록 정의되었지만
HTMLElement가 아닌
클래스에서 상속받으면 이런 일이 발생할 수 있다:
customElements. define( "bad-2" , class Bad2 extends HTMLParagraphElement {});
이 경우 Bad2의 인스턴스를 구성할 때 발생하는 (암묵적)
super() 호출 중에 활성
함수
객체는 HTMLParagraphElement이며,
HTMLElement가 아니다.
그렇지 않으면(즉, definition이 사용자 정의된 내장 요소에 관한 것이면):
valid local names를 이 명세 또는 적용 가능한 다른 명세에 정의된 요소 중 활성 함수 객체를 자신의 요소 인터페이스로 사용하는 요소의 지역 이름 목록으로 둔다.
valid local names에 definition의 지역 이름이 포함되어
있지 않으면
TypeError를
던진다.
사용자 정의 요소가 주어진 지역 이름을 확장하도록 정의되었지만 잘못된 클래스에서 상속받으면 이런 일이 발생할 수 있다:
customElements. define( "bad-3" , class Bad3 extends HTMLQuoteElement {}, { extends : "p" });
이 경우 Bad3의 인스턴스를 구성할 때 발생하는 (암묵적)
super() 호출 중에 valid local names는
q와
blockquote를
포함하는 목록이지만, definition의 지역 이름은 p이며,
이는 해당 목록에 없다.
isValue를 definition의 이름으로 설정한다.
definition의 구성 스택이 비어 있으면:
element를 인터페이스를 구현하는 새 객체를 내부적으로 생성한 결과로 둔다. 해당 인터페이스는 활성 함수 객체가 대응하는 인터페이스이며, 현재 영역과 NewTarget이 주어진다.
element의 노드
문서를 현재 전역
객체의 연결된
Document로 설정한다.
element의 네임스페이스를 HTML 네임스페이스로 설정한다.
element의 네임스페이스 접두사를 null로 설정한다.
element의 사용자 정의 요소 레지스트리를 registry로 설정한다.
element의 사용자 정의 요소 상태를 "custom"으로 설정한다.
element의 사용자 정의 요소 정의를 definition으로 설정한다.
element의 is 값을 isValue로 설정한다.
element를 반환한다.
이는 작성자 스크립트가 예를 들어
new MyCustomElement()를 통해 새 사용자 정의 요소를 직접 구성할 때 발생한다.
prototype이 객체가 아니면:
realm을 ? GetFunctionRealm(NewTarget)으로 둔다.
prototype을 realm에 속하며 그 인터페이스가 활성 함수 객체의 인터페이스와 동일한 인터페이스 프로토타입 객체로 설정한다.
활성 함수 객체의 영역은 realm이 아닐 수 있으므로, 여기서는 영역 간에 "동일한 인터페이스"라는 더 일반적인 개념을 사용한다. 인터페이스 객체의 동일성을 찾는 것이 아니다. NewTarget의 영역을 사용하고 그곳에서 적절한 프로토타입을 조회하는 것을 포함한 이 대체 동작은 JavaScript 내장 객체 및 Web IDL의 인터페이스를 구현하는 새 객체를 내부적으로 생성하는 알고리즘의 유사한 동작과 일치하도록 설계되었다.
element를 definition의 구성 스택의 마지막 항목으로 둔다.
element가 이미
구성됨 마커이면, TypeError를
던진다.
사용자 정의 요소
생성자 내부의 작성자 코드가 super()를 호출하기 전에 구성 중인 클래스의 다른
인스턴스를 비준수 방식으로 생성하면 이런 일이 발생할 수 있다:
let doSillyThing = true ;
class DontDoThis extends HTMLElement {
constructor() {
if ( doSillyThing) {
doSillyThing = false ;
new DontDoThis();
// Now the construction stack will contain an already constructed marker.
}
// This will then fail with a TypeError:
super ();
}
}
사용자 정의 요소
생성자 내부의 작성자 코드가
super()를 비준수 방식으로
두 번 호출해도 이런 일이 발생할 수 있다. JavaScript 명세에 따르면 이는 실제로 오류를 던지기 전에
상위 클래스 생성자(즉, 이 알고리즘)를 두 번 실행하기 때문이다:
class DontDoThisEither extends HTMLElement {
constructor() {
super ();
// This will throw, but not until it has already called into the HTMLElement constructor
super ();
}
}
? element.[[SetPrototypeOf]](prototype)을 수행한다.
element를 반환한다.
이 단계는 일반적으로 사용자 정의 요소를 업그레이드할 때
도달한다. 기존 요소가
반환되므로 사용자 정의
요소
생성자 내부의 super() 호출이 해당 기존 요소를 this에 할당한다.
[HTMLConstructor]가
암시하는 생성자 동작 외에도 일부 요소에는 명명된 생성자도 있다
(실제로는 수정된 prototype 속성을 가진 팩토리 함수이다).
HTML 요소의 명명된 생성자는 사용자 정의
요소 생성자를 정의할 때 extends
절에서도 사용할 수 있다:
class AutoEmbiggenedImage extends Image {
constructor( width, height) {
super ( width * 10 , height * 10 );
}
}
customElements. define( "auto-embiggened" , AutoEmbiggenedImage, { extends : "img" });
const image = new AutoEmbiggenedImage( 15 , 20 );
console. assert( image. width === 150 );
console. assert( image. height === 200 );
이 명세의 각 요소에는 다음 정보를 포함하는 정의가 있다:
요소를 사용할 수 있는 위치에 대한 비규범적 설명. 이 정보는 이 요소를 자식으로 허용하는 요소의 콘텐츠 모델과 중복되며 편의를 위해서만 제공된다.
요소의 자식과 자손으로 어떤 콘텐츠가 포함되어야 하는지에 대한 규범적 설명.
text/html 구문에서
시작 태그와 종료 태그를
생략할 수 있는지에 대한 비규범적 설명. 이 정보는 선택적 태그 절에 제시된
규범적 요구 사항과 중복되며 요소 정의에서는 편의를 위해서만 제공된다.
요소에 지정할 수 있는 속성의 규범적 목록(달리 허용되지 않는 경우 제외)과 해당 속성에 대한 비규범적 설명. (대시 왼쪽의 콘텐츠는 규범적이고 오른쪽의 콘텐츠는 비규범적이다.)
작성자용: ARIA role
및 aria-* 속성 사용에 관한
적합성 요구 사항은 HTML의 ARIA에 정의되어 있다. [ARIA] [ARIAHTML]
구현자용: 접근성 API 의미 체계를 구현하기 위한 사용자 에이전트 요구 사항은 HTML 접근성 API 매핑에 정의되어 있다. [HTMLAAM]
각 요소의 정제 정보는 요소의 정제 범주를 정의하며, 이는 정제 중 요소가 처리되는 방식에 영향을 준다. 요소의 하나 이상의 속성을 탐색 URL 속성으로 정의할 수도 있다.
해당 요소가 구현해야 하는 DOM 인터페이스의 규범적 정의.
그 다음에는 요소가 무엇을 나타내는지에 대한 설명과 작성자 및 구현에 적용될 수 있는 추가 규범적 적합성 기준이 이어진다. 때로는 예도 포함된다.
속성 값은 문자열이다. 달리 명시되지 않는 한 HTML 요소의 속성 값은 빈 문자열을 포함한 어떤 문자열 값이라도 될 수 있으며, 그러한 속성 값에 지정할 수 있는 텍스트에는 제한이 없다.
이 명세에 정의된 각 요소에는 콘텐츠 모델, 즉 요소에 기대되는 콘텐츠에 대한 설명이 있다. HTML 요소에는 해당 요소의 콘텐츠 모델에 설명된 요구 사항과 일치하는 콘텐츠가 있어야 한다. 요소의 콘텐츠는 DOM에서 그 요소의 자식이다.
ASCII 공백은 요소 사이에서 항상 허용된다. 사용자 에이전트는 소스
마크업에서 요소 사이에 있는 이러한 문자를 DOM의 Text
노드로 나타낸다. 빈 Text
노드와 이러한 문자만으로 이루어진 시퀀스로 구성된
Text
노드는 요소 간 공백으로 간주된다.
요소의 콘텐츠가 해당 요소의 콘텐츠 모델과 일치하는지 판단할 때와 문서 및 요소 의미 체계를 정의하는 알고리즘을 따를 때는 요소 간 공백, 주석 노드 및 처리 명령 노드를 무시해야 한다.
따라서 요소 A와 B가
같은 부모 노드를 가지고 그 사이에 다른 요소 노드나 Text
노드(요소 간 공백 제외)가 없으면, 요소
A는
두 번째 요소 B의 앞 또는 뒤에 있다고 한다. 마찬가지로 어떤 요소에
요소 간
공백, 주석 노드 및 처리 명령 노드 외에 다른 노드가 없으면, 그 노드는 해당 요소의
유일한 자식이다.
작성자는 각 요소에 대해 정의된 대로 명시적으로 허용되거나 다른 명세에서 명시적으로 요구되는 경우를 제외하고는 어디에서도 HTML 요소를 사용해서는 안 된다. XML 복합 문서에서 다른 네임스페이스의 요소가 관련 맥락을 제공하도록 정의되어 있다면 이러한 맥락은 그 요소 내부일 수 있다.
Atom 배급 형식은 content 요소를 정의한다.
그 type 속성 값이
xhtml이면 Atom 배급 형식은 단일 HTML div 요소를 포함하도록 요구한다. 따라서
이 명세에 명시적으로 규범화되어 있지는 않지만 해당 맥락에서는 div 요소가 허용된다.
[ATOM]
또한 HTML 요소는 고아 노드 (즉, 부모 노드가 없는 노드)일 수 있다.
예를 들어 td 요소를
생성하고 스크립트의 전역 변수에 저장하는 것은 적합하다. 그 밖의 경우에는 td 요소가
tr 요소 내부에서만
사용되어야 하지만 그렇다.
var data = {
name: "Banana" ,
cell: document. createElement( 'td' ),
};
요소의 콘텐츠 모델이 없음이면 해당
요소에는 요소 간 공백 이외의
Text
노드와 요소 노드가 없어야 한다.
콘텐츠 모델이 "없음"인 대부분의 HTML 요소는 편의를 위해 빈 요소 (HTML 구문에서 종료 태그가 없는 요소)이기도 하다. 하지만 이 둘은 완전히 별개의 개념이다.
HTML의 각 요소는 비슷한 특성을 가진 요소를 함께 묶는 0개 이상의 범주에 속한다. 이 명세에서는 다음과 같은 광범위한 범주를 사용한다:
일부 요소는 이 명세의 다른 부분에서 정의되는 다른 범주에도 속한다.
이러한 범주의 관계는 다음과 같다:
섹셔닝 콘텐츠, 제목 콘텐츠, 구문 콘텐츠, 임베디드 콘텐츠 및 대화형 콘텐츠는 모두 플로 콘텐츠의 유형이다. 메타데이터는 때때로 플로 콘텐츠이다. 메타데이터와 대화형 콘텐츠는 때때로 구문 콘텐츠이다. 임베디드 콘텐츠도 구문 콘텐츠의 한 유형이며 때로는 대화형 콘텐츠이다.
다른 범주도 특정 목적을 위해 사용된다. 예를 들어 폼 컨트롤은 공통 요구 사항을 정의하기 위해 여러 범주를 사용하여 지정된다. 일부 요소에는 고유한 요구 사항이 있으며 특정 범주에 속하지 않는다.
메타데이터 콘텐츠는 나머지 콘텐츠의 표시나 동작을 설정하거나, 문서와 다른 문서 사이의 관계를 설정하거나, 다른 "대역 외" 정보를 전달하는 콘텐츠이다.
의미 체계가 주로 메타데이터와 관련된 다른 네임스페이스의 요소(예: RDF)도 메타데이터 콘텐츠이다.
따라서 XML 직렬화에서는 다음과 같이 RDF를 사용할 수 있다:
< html xmlns = "http://www.w3.org/1999/xhtml"
xmlns:r = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" xml:lang = "en" >
< head >
< title > Hedral's Home Page</ title >
< r:RDF >
< Person xmlns = "http://www.w3.org/2000/10/swap/pim/contact#"
r:about = "https://hedral.example.com/#" >
< fullName > Cat Hedral</ fullName >
< mailbox r:resource = "mailto:hedral@damowmow.com" />
< personalTitle > Sir</ personalTitle >
</ Person >
</ r:RDF >
</ head >
< body >
< h1 > My home page</ h1 >
< p > I like playing with string, I guess. Sister says squirrels are fun
too so sometimes I follow her to play with them.</ p >
</ body >
</ html >
하지만 HTML 직렬화에서는 이것이 가능하지 않다.
문서와 애플리케이션의 본문에서 사용되는 대부분의 요소는 플로 콘텐츠로 분류된다.
aabbraddressarea (map 요소의 자손인 경우)
articleasideaudiobbdibdoblockquotebrbuttoncanvascitecodedatadatalistdeldetailsdfndialogdivdlemembedfieldsetfigurefooterformh1
h2
h3
h4
h5
h6
headerhgrouphriiframeimginputinskbdlabellink (본문에서 허용되는 경우)main (계층적으로
올바른 main 요소인 경우)mapmarkmathmenumeta (itemprop
속성이 있는 경우)meternavnoscriptobjectoloutputppicturepreprogressqrubyssampscriptsearchsectionselectslotsmallspanstrongsubsupsvgtabletemplatetextareatimeuulvarvideowbr섹셔닝 콘텐츠는 header
및 footer 요소의
범위를 정의하는 콘텐츠이다.
제목 콘텐츠는 섹션의 제목을 정의한다 (섹셔닝 콘텐츠 요소를 사용하여 명시적으로 마크업한 경우와 제목 콘텐츠 자체에 의해 암시된 경우 모두).
구문 콘텐츠는 문서의 텍스트와 그 텍스트를 문단 내부 수준에서 마크업하는 요소이다. 연속된 구문 콘텐츠는 문단을 형성한다.
aabbrarea (map 요소의 자손인 경우)audiobbdibdobrbuttoncanvascitecodedatadatalistdeldfnemembediiframeimginputinskbdlabellink (본문에서 허용되는 경우)mapmarkmathmeta (itemprop
속성이 있는 경우)meternoscriptobjectoutputpictureprogressqrubyssampscriptselectselectedcontent
(select 내부의
button의 자손인 경우)
slotsmallspanstrongsubsupsvgtemplatetextareatimeuvarvideowbr구문 콘텐츠로 분류되는 대부분의 요소는 플로 콘텐츠가 아니라 그 자체가 구문 콘텐츠로 분류되는 요소만 포함할 수 있다.
콘텐츠 모델의 맥락에서 텍스트는 아무것도 없거나
Text
노드를 의미한다. 텍스트는 때때로 독립적인
콘텐츠 모델로 사용되지만 구문 콘텐츠이기도 하며,
Text
노드가 비어 있거나 ASCII
공백만 포함하는 경우 요소 간
공백일 수 있다.
Text
노드와 속성 값은 스칼라
값으로 구성되어야 하며, 비문자와 제어 문자 중 ASCII 공백이 아닌 것은
제외된다.
이 명세는 정확한 맥락에 따라 Text
노드와 속성 값의 정확한 값에 추가 제약을 포함한다.
임베디드 콘텐츠는 다른 리소스를 문서로 가져오는 콘텐츠 또는 다른 어휘의 콘텐츠를 문서에 삽입한 것이다.
HTML 네임스페이스가 아닌 다른 네임스페이스에 속하고 메타데이터가 아닌 콘텐츠를 전달하는 요소는 이 명세에 정의된 콘텐츠 모델의 목적상 임베디드 콘텐츠이다. (예: MathML 또는 SVG.)
일부 임베디드 콘텐츠 요소에는 대체 콘텐츠가 있을 수 있다. 이는 외부 리소스를 사용할 수 없을 때(예: 지원되지 않는 형식이기 때문에) 사용되는 콘텐츠이다. 대체 콘텐츠가 있다면 요소 정의에 그 내용이 명시된다.
대화형 콘텐츠는 사용자 상호작용을 특별히 의도한 콘텐츠이다.
a (href 속성이
있는 경우)audio (controls 속성이
있는 경우)buttondetailsembediframeimg (usemap 또는 controls 속성이
있는 경우)input (type 속성이
상태가
아닌 경우)
labelselecttextareavideo (controls 속성이
있는 경우)일반적으로 콘텐츠 모델이 임의의 플로 콘텐츠 또는 구문 콘텐츠를 허용하는 요소는 자신의 콘텐츠 안에 감지 가능한 콘텐츠이며 속성이 지정되지 않은 노드를 하나 이상 포함해야 한다.
감지 가능한 콘텐츠는 비어 있지 않은 자손
텍스트나 사용자가 들을 수 있는 것
(audio 요소),
볼 수 있는 것(video,
img 또는
canvas 요소),
그 밖에 상호작용할 수 있는 것(예: 대화형 폼 컨트롤)을 제공하여 요소가 비어 있지 않게 한다.
하지만 이는 엄격한 요구 사항은 아니다. 나중에 스크립트로 채워질 자리 표시자로 사용되거나, 템플릿의 일부로서 대부분의 페이지에서는 채워지지만 일부 페이지에서는 관련이 없는 경우처럼 요소가 적법하게 비어 있을 수 있는 경우가 많기 때문이다.
적합성 검사기는 작성 지원을 위해 이 요구 사항을 충족하지 못한 요소를 작성자가 찾을 수 있도록 하는 메커니즘을 제공하는 것이 권장된다.
다음 요소는 감지 가능한 콘텐츠이다:
aabbraddressarticleasideaudio (controls 속성이
있는 경우)bbdibdoblockquotebuttoncanvascitecodedatadeldetailsdfndivdl (요소의 자식에
이름-값 그룹이 하나 이상 포함된 경우)emembedfieldsetfigurefooterformh1
h2
h3
h4
h5
h6
headerhgroupiiframeimginput (type 속성이
상태가
아닌 경우)
inskbdlabelmainmapmarkmathmenu (요소의
자식에 li 요소가
하나 이상 포함된 경우)meternavobjectol (요소의 자식에
li 요소가 하나 이상 포함된 경우)
outputppicturepreprogressqrubyssampsearchsectionselectsmallspanstrongsubsupsvgtabletextareatimeuul (요소의 자식에
li 요소가 하나 이상 포함된 경우)
varvideo스크립트 지원 요소는 그 자체로 아무것도 나타내지 않지만(즉, 렌더링되지 않지만) 사용자에게 기능을 제공하는 등 스크립트를 지원하는 데 사용되는 요소이다.
다음 요소는 스크립트 지원 요소이다:
일부 요소는 투명하다고 설명되며, 해당 콘텐츠 모델의 설명에 "투명"이 포함된다. 투명 요소의 콘텐츠 모델은 부모 요소의 콘텐츠 모델에서 파생된다. 콘텐츠 모델에서 "투명"한 부분에 요구되는 요소는 투명 요소가 위치한 부모 요소 콘텐츠 모델의 해당 부분에서 요구되는 요소와 동일하다.
예를 들어 ruby 요소 내부의 ins
요소는 rt 요소를
포함할 수 없다. 이는 ruby
요소의 콘텐츠 모델에서 ins 요소를
허용하는 부분이 구문
콘텐츠를 허용하는 부분이고, rt 요소는 구문 콘텐츠가 아니기
때문이다.
경우에 따라 투명 요소가 서로 중첩되면 이 과정을 반복적으로 적용해야 한다.
다음 마크업 조각을 살펴보자:
< p >< object >< ins >< map >< a href = "/" > Apples</ a ></ map ></ ins ></ object ></ p >
"Apples"가 a 요소 내부에서 허용되는지
확인하기 위해 콘텐츠 모델을 조사한다. a
요소의 콘텐츠 모델은 투명하고, map
요소의 콘텐츠 모델도 투명하며, ins 요소의 콘텐츠
모델도 투명하고, object
요소의 콘텐츠 모델도 투명하다. object 요소는
콘텐츠 모델이 구문 콘텐츠인 p 요소 내부에 있다.
따라서 텍스트는 구문 콘텐츠이므로 "Apples"가 허용된다.
투명 요소에 부모가 없으면 콘텐츠 모델에서 "투명"한 부분은 대신 모든 플로 콘텐츠를 허용하는 것으로 취급해야 한다.
이 절에서 정의하는 문단이라는 용어는
단지 p 요소를 정의하는 데에만
사용되는 것이 아니다. 여기서 정의된 문단 개념은 문서를 해석하는 방법을 설명하는 데 사용된다.
p 요소는
문단을 마크업하는 여러 방법 중 하나일 뿐이다.
문단은 일반적으로 타이포그래피에서처럼 특정 주제를 논의하는 하나 이상의 문장으로 이루어진 텍스트 블록을 형성하는 일련의 구문 콘텐츠이지만, 더 일반적인 주제별 그룹화에도 사용할 수 있다. 예를 들어 주소, 폼의 일부, 작성자 표시 또는 시의 연도 모두 문단이다.
다음 예에서는 한 섹션 안에 두 개의 문단이 있다. 문단이 아닌 구문 콘텐츠를 포함하는 제목도 있다. 주석과 요소 간 공백은 문단을 형성하지 않는다는 점에 유의한다.
< section >
< h2 > Example of paragraphs</ h2 >
This is the < em > first</ em > paragraph in this example.
< p > This is the second.</ p >
<!-- This is not a paragraph. -->
</ section >
플로 콘텐츠의 문단은 a, ins, del 및 map 요소가 없는 상태에서
문서가 어떻게 보이는지를 기준으로 정의된다. 이러한 요소는 혼합 콘텐츠 모델을 가지므로 아래의 첫 두 예처럼
문단 경계를 가로지를 수 있어 문제를 복잡하게 만들기 때문이다.
일반적으로 요소가 문단 경계를 가로지르도록 하는 것은 피하는 것이 좋다. 이러한 마크업은 유지 관리하기 어려울 수 있다.
다음 예는 앞의 예에 있는 마크업을 가져와 일부 마크업 주위에 ins 및
del 요소를 배치하여
텍스트가 변경되었음을 보여준다(이 경우 변경 내용은 인정하건대 별로 의미가 없다). ins 및 del 요소가 있음에도
이 예에는 앞의 예와 정확히 동일한 문단이 있다는 점에 유의한다. ins 요소는 제목과 첫 번째 문단을
가로지르고, del 요소는 두 문단 사이의
경계를 가로지른다.
< section >
< ins >< h2 > Example of paragraphs</ h2 >
This is the < em > first</ em > paragraph in</ ins > this example< del > .
< p > This is the second.</ p ></ del >
<!-- This is not a paragraph. -->
</ section >
view를 문서의 모든 a,
ins, del 및 map 요소를 해당 요소의
콘텐츠로 대체한 DOM의 뷰로 둔다.
그런 다음 view에서 구문 콘텐츠뿐 아니라 그 밖의
콘텐츠도 허용하는 요소 안에 있는,
다른 유형의 콘텐츠에 의해 중단되지 않는 각각의 연속된 형제 구문 콘텐츠
노드에 대해, first를 그 연속된 노드의
첫 번째 노드로 두고 last를 마지막 노드로 둔다. 그러한 연속된 노드 중 임베디드
콘텐츠도 아니고 요소 간
공백도 아닌 노드를 하나 이상 포함하는 각각에 대해, 원래 DOM에서 first 바로 앞부터
last 바로 뒤까지 문단이 존재한다. (따라서 문단은 a,
ins, del 및 map 요소를 가로질러 확장될 수 있다.)
적합성 검사기는 작성자에게 문단이 서로 겹치는 경우를 경고할 수 있다. 이는 object, video, audio 및
canvas 요소에서 발생할 수
있으며, SVG
svg 또는 MathML
math처럼 HTML을 그 안에 추가로 임베드할 수 있도록 허용하는 다른 네임스페이스의 요소를
통해 간접적으로 발생할 수도 있다.
p 요소는
문단을 서로 구분할 구문 콘텐츠 이외의 콘텐츠가 없을 경우 개별 문단을 감싸는 데 사용할 수 있다.
다음 예에서 링크는 첫 번째 문단의 절반, 두 문단을 구분하는 제목 전체 및 두 번째 문단의 절반에 걸쳐 있다. 이 링크는 문단과 제목을 가로지른다.
< header >
Welcome!
< a href = "about.html" >
This is home of...
< h1 > The Falcons!</ h1 >
The Lockheed Martin multirole jet fighter aircraft!
</ a >
This page discusses the F-16 Fighting Falcon's innermost secrets.
</ header >
다음은 이를 마크업하는 또 다른 방법이다. 이번에는 문단을 명시적으로 표시하고 하나의 링크 요소를 세 개로 분할한다:
< header >
< p > Welcome! < a href = "about.html" > This is home of...</ a ></ p >
< h1 >< a href = "about.html" > The Falcons!</ a ></ h1 >
< p >< a href = "about.html" > The Lockheed Martin multirole jet
fighter aircraft!</ a > This page discusses the F-16 Fighting
Falcon's innermost secrets.</ p >
</ header >
대체 콘텐츠를 정의하는 특정 요소를 사용할 때 문단이 서로 겹칠 수 있다. 예를 들어 다음 섹션에서는:
< section >
< h2 > My Cats</ h2 >
You can play with my cat simulator.
< object data = "cats.sim" >
To see the cat simulator, use one of the following links:
< ul >
< li >< a href = "cats.sim" > Download simulator file</ a >
< li >< a href = "https://sims.example.com/watch?v=LYds5xY4INU" > Use online simulator</ a >
</ ul >
Alternatively, upgrade to the Mellblom Browser.
</ object >
I'm quite proud of it.
</ section >
다섯 개의 문단이 있다:
object 요소이다.첫 번째 문단은 나머지 네 문단과 겹친다. "cats.sim" 리소스를 지원하는 사용자 에이전트는 첫 번째 문단만 표시하지만, 대체 콘텐츠를 표시하는 사용자 에이전트는 혼란스럽게도 첫 번째 문단의 첫 문장을 두 번째 문단과 같은 문단에 있는 것처럼 표시하고, 마지막 문단을 첫 번째 문단의 두 번째 문장 시작 부분에 있는 것처럼 표시한다.
이러한 혼란을 피하려면 명시적인 p 요소를 사용할 수 있다. 예:
< section >
< h2 > My Cats</ h2 >
< p > You can play with my cat simulator.</ p >
< object data = "cats.sim" >
< p > To see the cat simulator, use one of the following links:</ p >
< ul >
< li >< a href = "cats.sim" > Download simulator file</ a >
< li >< a href = "https://sims.example.com/watch?v=LYds5xY4INU" > Use online simulator</ a >
</ ul >
< p > Alternatively, upgrade to the Mellblom Browser.</ p >
</ object >
< p > I'm quite proud of it.</ p >
</ section >
다음 속성은 이 명세에 정의되지 않은 요소를 포함하여 모든 HTML 요소에 공통되며 지정할 수 있다:
accesskey
autocapitalizeautocorrectautofocuscontenteditable
dirdraggableenterkeyhintheadingoffsetheadingresetinertinputmodeisitemiditemprop
itemrefitemscopeitemtypelangnoncepopoverspellcheckstyletabindextitletranslatewritingsuggestions
이러한 속성은 이 명세에서 HTML 요소의 속성으로만 정의된다. 이 명세에서 이러한 속성을 가진 요소를 언급할 때, 해당 속성을 가지는 것으로 정의되지 않은 네임스페이스의 요소는 이러한 속성을 가진 요소로 간주해서는 안 된다.
예를 들어 다음 XML 조각에서 "bogus" 요소는 문자 그대로 "dir"라는 이름의
속성을 가지고 있음에도 이 명세에서 정의한 dir 속성을 가지지 않는다.
따라서 가장 안쪽의 span 요소의 방향성은
"bogus" 요소를 통해 간접적으로 div 요소에서 상속된
'rtl'이다.
< div xmlns = "http://www.w3.org/1999/xhtml" dir = "rtl" >
< bogus xmlns = "https://example.net/ns" dir = "ltr" >
< span xmlns = "http://www.w3.org/1999/xhtml" >
</ span >
</ bogus >
</ div >
현재의 모든 엔진에서 지원된다.
DOM은 모든 네임스페이스의 모든 요소에 대한 class, id 및 slot 속성의 사용자 에이전트 요구 사항을 정의한다.
[DOM]
class, id 및 slot 속성은 모든 HTML 요소에 지정할 수 있다.
HTML 요소에 지정할 때 class
속성은 요소가 속한 여러 클래스를 나타내는 공백으로 구분된 토큰 집합인 값을 가져야 한다.
요소에 클래스를 할당하면 CSS 선택자의 클래스 일치, DOM의 getElementsByClassName()
메서드 및 그 밖의 유사한 기능에 영향을 준다.
작성자가 class 속성에서 사용할 수 있는 토큰에는
추가 제한이 없지만, 작성자는 콘텐츠의 원하는 표현을 설명하는 값보다는 콘텐츠의 성격을 설명하는 값을
사용하는 것이 권장된다.
HTML 요소에 지정할 때 id 속성 값은
요소의 트리에
있는 모든 ID 중에서 고유해야 하며
하나 이상의 문자를 포함해야 한다. 값에는 ASCII 공백이 포함되어서는 안
된다.
id 속성은
해당 요소의 고유 식별자(ID)를 지정한다.
ID가 취할 수 있는 형식에는 그 밖의 제한이 없다. 특히 ID는 숫자로만 구성되거나, 숫자로 시작하거나, 밑줄로 시작하거나, 문장 부호로만 구성될 수도 있다.
요소의 고유 식별자는 다양한 목적으로 사용할 수 있다. 특히 프래그먼트를 사용하여 문서의 특정 부분에 연결하는 방법, 스크립팅 시 요소를 대상으로 지정하는 방법 및 CSS에서 특정 요소에 스타일을 지정하는 방법으로 사용할 수 있다.
식별자는 불투명한 문자열이다. id 속성 값에서
특정 의미를
도출해서는 안 된다.
slot 속성에는
HTML 요소에만 적용되는 별도의
적합성 요구 사항이 없다.
slot 속성은
요소에 슬롯을
할당하는 데 사용된다. slot 속성을 가진 요소는
할당되는데, 그 대상은 슬롯이며,
해당 슬롯은 name
속성 값이 그 slot
속성 값과 일치하는 slot 요소에 의해 생성된다.
단, 이는 해당 slot 요소가
루트의
호스트가
대응하는 slot 속성 값을 가진
섀도 트리 안에 있는 경우에만 해당한다.
보조 기술 제품이 HTML 요소와 속성만으로 가능한 것보다 더 세밀한 인터페이스를 노출할 수 있도록
보조 기술 제품을 위한 주석 집합을 지정할 수 있다(ARIA role 및 aria-* 속성).
[ARIA]
다음 이벤트 핸들러 콘텐츠 속성은 모든 HTML 요소에 지정할 수 있다:
onauxclickonbeforeinput
onbeforematch
onbeforetoggle
onblur*oncanceloncanplayoncanplaythrough
onchangeonclickoncloseoncommandoncontextlost
oncontextmenu
oncontextrestored
oncopyoncuechangeoncutondblclickondragondragendondragenterondragleaveondragoverondragstartondropondurationchange
onemptiedonendedonerror*onfocus*onformdataoninputoninvalidonkeydownonkeypressonkeyuponload*onloadeddataonloadedmetadata
onloadstartonmousedownonmouseenteronmouseleaveonmousemoveonmouseoutonmouseoveronmouseuponpasteonpauseonplayonplayingonprogressonratechangeonresetonresize*onscroll*onscrollend*onsecuritypolicyviolation
onseekedonseekingonselectonslotchangeonstalledonsubmitonsuspendontimeupdateontoggleonvolumechange
onwaitingonwheel별표가 표시된 속성은 body
요소에 지정될 때 다른
의미를 가진다. 이 요소들이 동일한 이름을 가진 Window 객체의 이벤트 핸들러를 노출하기 때문이다.
이러한 속성은 모든 요소에 적용되지만 모든 요소에서 유용한 것은 아니다.
예를 들어 사용자 에이전트가 발생시킨 volumechange
이벤트를 수신하는 것은 미디어 요소뿐이다.
사용자 정의 데이터 속성
(예: data-foldername 또는 data-msgid)은 페이지에 특화된 사용자 정의 데이터,
상태, 주석 및 그와 유사한 정보를 저장하기 위해 모든
HTML 요소에 지정할 수 있다.
HTML 문서에서 HTML 네임스페이스의
요소에는 값이 정확히 "http://www.w3.org/1999/xhtml"인 경우에만
xmlns 속성을 지정할 수 있다. 이는 XML
문서에는 적용되지 않는다.
HTML에서 xmlns 속성은 아무런 효과도 없다.
이는 기본적으로 부적과 같다. XML로 또는 XML에서 마이그레이션하는 작업을 조금 더 쉽게 만들기 위해서만
허용된다. HTML 파서가 구문 분석하면
이 속성은 어떠한 네임스페이스에도 속하지 않게 된다. XML에서 이 속성은 네임스페이스 선언 메커니즘의 일부이며
항상 "http://www.w3.org/2000/xmlns/" 네임스페이스에 속한다.
XML은 또한 XML 문서의 모든 요소에서 XML 네임스페이스에 속하는 xml:space
속성을 사용할 수 있도록 허용한다. HTML의 기본 동작은 공백을 보존하는 것이므로 이 속성은 HTML 요소에 아무런 영향을 주지 않는다.
[XML]
text/html 구문에서 HTML 요소의 xml:space
속성을 직렬화할 방법은 없다.
title 속성현재의 모든 엔진에서 지원된다.
title 속성은
툴팁에 적합한 정보 등 요소에 대한 도움말 정보를 나타낸다. 링크에서는 대상 리소스의 제목이나
설명일 수 있고,
이미지에서는 이미지 출처나 이미지 설명일 수 있으며, 문단에서는 각주나 텍스트에 대한 해설일 수 있고,
인용에서는 출처에 대한 추가 정보일 수 있다. 대화형
콘텐츠에서는 요소를 사용하기 위한 레이블이나
지침일 수 있으며, 그 밖에도 이와 유사한 용도로 사용할 수 있다. 값은 텍스트이다.
현재는 title
속성에 의존하는 것이 권장되지 않는다. 많은 사용자 에이전트가 이 명세에서 요구하는 접근 가능한 방식으로
해당 속성을 노출하지 않기 때문이다(예를 들어 툴팁을 표시하려면 마우스와 같은 포인팅 장치를 요구하여,
키보드만 사용하는 사용자와 최신 휴대전화나 태블릿 사용자처럼 터치만 사용하는 사용자를 제외한다).
요소에서 이 속성이 생략되면, title 속성이 설정된 가장 가까운
조상 HTML 요소의 title 속성도 이 요소와 관련이
있음을 의미한다. 이 속성을 설정하면 이를 재정의하여 조상의 도움말 정보가 이 요소와 관련이 없음을
명시적으로 나타낸다. 속성을 빈 문자열로 설정하면 요소에 도움말 정보가 없음을 나타낸다.
title 속성 값에
U+000A LINE FEED(LF) 문자가 포함되어 있으면 콘텐츠가 여러 줄로 나뉜다. 각 U+000A LINE FEED(LF)
문자는 줄바꿈을 나타낸다.
title 속성에서
줄바꿈을 사용할 때는 주의하는 것이 좋다.
예를 들어 다음 코드 조각은 실제로 약어의 확장형을 내부에 줄바꿈이 포함된 상태로 정의한다:
< p > My logs show that there was some interest in < abbr title = "Hypertext
Transport Protocol" > HTTP</ abbr > today.</ p >
link,
abbr 및 input과 같은 일부 요소는
위에서 설명한 의미 외에 title 속성에 대한 추가 의미를
정의한다.
요소의 도움말 정보는 다음 알고리즘이 반환하는 값이며, 값이 반환되는 즉시 알고리즘을 중단한다. 알고리즘이 빈 문자열을 반환하면 도움말 정보가 없는 것이다.
사용자 에이전트는 요소에 도움말 정보가 있을 때 사용자에게 알려야 한다. 그렇지 않으면 해당 정보를 발견할 수 없게 된다.
lang 및 xml:lang
속성현재의 모든 엔진에서 지원된다.
어떠한 네임스페이스에도 속하지 않는 lang 속성은 요소의 콘텐츠와 텍스트를 포함하는 요소의
모든 속성에 대한 기본 언어를 지정한다. 그 값은 유효한 BCP 47 언어 태그 또는 빈 문자열이어야 한다.
속성을 빈 문자열로 설정하면 기본 언어를 알 수 없음을 나타낸다. [BCP47]
XML 네임스페이스의 lang 속성은 XML에 정의되어 있다.
[XML]
요소에서 이러한 속성이 생략되면 이 요소의 언어는 부모 요소가 있는 경우 그 부모 요소의 언어와 같다
(섀도 트리의 slot 요소는
제외한다).
어떠한 네임스페이스에도 속하지 않는 lang
속성은 모든
HTML 요소에서 사용할 수 있다.
XML 네임스페이스의 lang 속성은 XML 문서의 HTML 요소에서 사용할 수 있으며,
관련 명세가 허용하는 경우 다른 네임스페이스의 요소에서도 사용할 수 있다(특히 MathML과 SVG는 해당
요소에 XML 네임스페이스의 lang 속성을
지정하도록 허용한다).
어떠한 네임스페이스에도 속하지 않는 lang 속성과
XML 네임스페이스의 lang 속성을 같은
요소에 모두 지정하면,
ASCII 대소문자를
구분하지 않는 방식으로 비교했을 때
두 속성의 값이 정확히 같아야 한다.
작성자는 HTML 문서의 HTML 요소에서 XML 네임스페이스의
lang 속성을 사용해서는 안 된다. XML로 또는 XML에서
마이그레이션하는 작업을 쉽게 하기 위해 작성자는 HTML 문서의 HTML 요소에서 접두사가 없고 문자 그대로의
지역 이름이 "xml:lang"인 어떠한 네임스페이스에도 속하지 않는 속성을 지정할 수 있다.
하지만 이러한 속성은 어떠한 네임스페이스에도 속하지 않는 lang 속성도 함께
지정된 경우에만 지정해야 하며, ASCII 대소문자를
구분하지 않는 방식으로 비교했을 때
두 속성의 값이 같아야 한다.
접두사가 없고 문자 그대로의 지역 이름이 "xml:lang"인 어떠한
네임스페이스에도 속하지 않는 속성은 언어 처리에 아무런 영향을 주지 않는다.
노드의 언어를 결정하기 위해 사용자 에이전트는 다음 목록에서 처음으로 적용되는 단계를 사용해야 한다:
lang
속성이 설정된 요소인 경우해당 속성의 값을 사용한다.
lang
속성이 설정된 경우
해당 속성의 값을 사용한다.
프래그마로 설정된 기본 언어가 설정되어 있으면 그것이 노드의 언어이다. 프래그마로 설정된 기본 언어가 설정되어 있지 않으면 상위 수준 프로토콜(예: HTTP)의 언어 정보가 있는 경우 이를 최종 대체 언어로 사용해야 한다. 그러한 언어 정보가 없거나 상위 수준 프로토콜이 여러 언어를 보고하는 경우에는 노드의 언어를 알 수 없으며 대응하는 언어 태그는 빈 문자열이다.
결과 값이 인식되는 언어 태그가 아니면, 주어진 언어 태그를 가지며 다른 모든 언어와 구별되는 알 수 없는 언어로 취급해야 한다. 왕복 변환 또는 언어 태그를 기대하는 다른 서비스와 통신하기 위해 사용자 에이전트는 알 수 없는 언어 태그를 수정하지 않고 BCP 47 언어 태그임을 표시하여 전달해야 한다. 그래야 후속 서비스가 데이터를 다른 유형의 언어 설명으로 해석하지 않는다. [BCP47]
따라서 예를 들어 lang="xyzzy"가 지정된 요소는
:lang(xyzzy) 선택자(예: CSS)와 일치하지만, 두 값이 모두 똑같이 유효하지 않더라도
:lang(abcde)와는 일치하지 않는다. 마찬가지로 함께 작동하는 웹 브라우저와 스크린 리더가
요소의 언어에 관해 통신한다면, 브라우저는 "xyzzy"가 유효하지 않다는 것을 알고 있더라도 스크린 리더가
실제로 그 태그를 사용하는 언어를 지원할 가능성에 대비해 언어가 "xyzzy"라고 알려준다. 스크린 리더가
BCP 47과 언어 이름을 인코딩하는 또 다른 구문을 모두 지원하고, 그 다른 구문에서 "xyzzy"라는 문자열이
벨라루스어를 나타내는 방법이라고 하더라도 스크린 리더가 해당 텍스트를 벨라루스어로 취급하기 시작하는 것은
올바르지 않다. "xyzzy"는 BCP 47 코드에서 벨라루스어를 나타내는 방식이 아니기 때문이다
(BCP 47은 벨라루스어에 "be" 코드를 사용한다).
결과 값이 빈 문자열이면 노드의 언어를 명시적으로 알 수 없음으로 해석해야 한다.
사용자 에이전트는 요소의 언어를 사용하여 적절한 처리 또는 렌더링을 결정할 수 있다 (예: 적절한 글꼴이나 발음 선택, 사전 선택 또는 날짜 선택기와 같은 폼 컨트롤의 사용자 인터페이스).
translate 속성현재의 모든 엔진에서 지원된다.
translate
속성은 페이지를 현지화할 때 요소의 속성 값과 그 Text
노드 자식의 값을 번역할지, 아니면 변경하지 않고 그대로 둘지를 지정하는 데 사용된다. 이는 다음 키워드와
상태를 가진 열거형 속성이다:
| 키워드 | 상태 | 간략한 설명 |
|---|---|---|
yes
|
예 | 번역 모드를 번역 활성화로 설정한다. |
no
|
아니요 | 번역 모드를 번역 안 함으로 설정한다. |
속성의 누락 값 기본값과 유효하지 않은 값 기본값은 모두 상속 상태이며, 빈 값 기본값은 예 상태이다.
각 요소(HTML이 아닌 요소 포함)에는 번역 모드가 있으며,
번역 활성화 상태 또는
번역 안 함 상태 중 하나이다.
HTML 요소의 translate
속성이 예 상태이면 요소의
번역 모드는
번역 활성화 상태이다.
그렇지 않고 요소의 translate
속성이 아니요 상태이면 요소의
번역 모드는
번역 안 함 상태이다.
그 밖의 경우에는 요소의 translate
속성이
상속 상태이거나,
요소가 HTML 요소가 아니어서
translate
속성이 없는 경우이다. 두 경우 모두 요소의 번역 모드는
부모 요소가 있으면 부모 요소와 같은 상태이고,
요소의 부모 요소가 null이면
번역 활성화 상태이다.
요소가 번역 활성화 상태이면 요소의 번역 가능
속성과 그 Text
노드 자식의 값은 페이지를 현지화할 때 번역해야 한다.
요소가 번역 안 함 상태이면 요소의 속성 값과 그 Text
노드 자식의 값은 페이지를 현지화할 때 그대로 두어야 한다. 예를 들어 요소에 사람의 이름이나
컴퓨터 프로그램의 이름이 포함된 경우가 이에 해당한다.
다음 속성은 번역 가능 속성이다:
abbr이 th 요소에 있는 경우alt가 area, img 및 input 요소에 있는 경우
content가
name 속성이
그 값이 번역 가능한 것으로 알려진 메타데이터 이름을 지정하는 meta 요소에 있는 경우
download가
a 및
area 요소에
있는 경우
label이 optgroup,
option 및
track 요소에
있는 경우
lang이 HTML 요소에 있는 경우;
번역에 사용된 언어와 일치하도록 "번역"해야 한다placeholder가 input 및
textarea
요소에 있는 경우
srcdoc가
iframe
요소에 있는 경우; 구문 분석하고 재귀적으로 처리해야 한다
style이 HTML 요소에 있는 경우;
구문 분석하고 재귀적으로 처리해야 한다(예: 'content' 속성의 값)
title이 모든 HTML 요소에 있는 경우value가
type 속성이
버튼 상태 또는
재설정
버튼 상태인 input
요소에 있는 경우
다른 명세에서는 역시 번역 가능
속성인 다른 속성을 정의할 수 있다. 예를 들어 ARIA는 aria-label 속성을 번역 가능한 것으로 정의한다.
translate IDL 속성은
가져올 때 요소의
번역 모드가
번역 활성화이면 true를 반환하고,
그렇지 않으면 false를 반환해야 한다. 설정할 때 새 값이 true이면 콘텐츠 속성의 값을
"yes"로 설정하고, 그렇지 않으면 콘텐츠 속성의 값을 "no"로 설정해야 한다.
이 예에서는 페이지를 현지화할 때 예시 키보드 입력과 예시 프로그램 출력을 제외한 문서의 모든 것을 번역해야 한다:
<!DOCTYPE HTML>
< html lang = en > <!-- default on the document element is translate=yes -->
< head >
< title > The Bee Game</ title > <!-- implied translate=yes inherited from ancestors -->
</ head >
< body >
< p > The Bee Game is a text adventure game in English.</ p >
< p > When the game launches, the first thing you should do is type
< kbd translate = no > eat honey</ kbd > . The game will respond with:</ p >
< pre >< samp translate = no > Yum yum! That was some good honey!</ samp ></ pre >
</ body >
</ html >
dir 속성현재의 모든 엔진에서 지원된다.
dir 속성은
다음 키워드와 상태를 가진 열거형 속성이다:
| 키워드 | 상태 | 간략한 설명 |
|---|---|---|
ltr
|
LTR | 요소의 콘텐츠는 왼쪽에서 오른쪽 방향의 텍스트로 명시적으로 방향 격리된다. |
rtl
|
RTL | 요소의 콘텐츠는 오른쪽에서 왼쪽 방향의 텍스트로 명시적으로 방향 격리된다. |
auto
|
자동 | 요소의 콘텐츠는 명시적으로 방향 격리된 텍스트이지만, 방향은 요소의 콘텐츠를 사용하여 프로그래밍 방식으로 결정해야 한다(아래 설명 참조). |
자동 상태에서 사용하는 휴리스틱은 매우 단순하다 (양방향 알고리즘의 문단 수준 결정과 유사한 방식으로 방향성이 강한 첫 번째 문자만 확인한다). 작성자는 텍스트의 방향을 실제로 알 수 없고 더 나은 서버 측 휴리스틱을 적용할 수 없는 경우에만 최후의 수단으로 이 값을 사용하는 것이 강력히 권장된다. [BIDI]
속성의 누락 값 기본값과 유효하지 않은 값 기본값은 모두 정의되지 않음 상태이다.
요소(단지 HTML 요소만이 아니라
모든 요소)의 방향성은 'ltr' 또는 'rtl'이다. 요소
element가 주어졌을 때 방향성을 계산하려면
element의 dir 속성
상태에 따라 분기한다:
dir 속성은
HTML 요소에만 정의되므로 다른
네임스페이스의 요소에는 존재할 수 없다. 따라서 다른 네임스페이스의 요소는 항상
부모 방향성을 사용하게 된다.
자동 방향성 폼 연관 요소는 다음과 같다:
요소 element가 주어졌을 때 자동 방향성을 계산하려면:
element가 자동 방향성 폼 연관 요소이면:
element가 루트가 섀도 루트이고,
element의
할당된 노드가 비어 있지 않은 slot 요소이면:
element의 할당된 노드에 속하는 각 노드 child에 대해 반복한다:
childDirection을 null로 둔다.
child가 Text 노드이면,
childDirection을 child의 텍스트 노드 방향성으로 설정한다.
그렇지 않으면:
childDirection을 child의 포함된 텍스트 자동 방향성으로 설정하되, canExcludeRoot를 true로 설정한다.
childDirection이 null이 아니면 childDirection을 반환한다.
null을 반환한다.
element의 포함된 텍스트 자동 방향성을 반환하되, canExcludeRoot를 false로 설정한다.
불리언 canExcludeRoot와 함께 요소 element의 포함된 텍스트 자동 방향성을 계산하려면:
element의 자손인 각 노드 descendant에 대해 트리 순서로 반복한다:
다음 중 하나가
다음 중 하나이면
계속한다.
result를 descendant의 텍스트 노드 방향성으로 둔다.
result가 null이 아니면 result를 반환한다.
null을 반환한다.
Text 노드
text가 주어졌을 때 텍스트 노드 방향성을 계산하려면:
요소 element가 주어졌을 때 부모 방향성을 계산하려면:
이 속성에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.
어떤 방식으로든 속성의 텍스트를 렌더링에 포함할 때 사용되는 HTML 요소의 속성 방향성은 다음 목록에서 처음으로 적용되는 단계 집합에 따라 결정된다:
다음 속성은 방향성을 가질 수 있는 속성이다:
document.dir [ = value ]"ltr", "rtl" 또는 "auto" 중 하나로 설정하여
html 요소의
dir 속성 값을 대체할 수 있다.
html 요소가 없으면 빈 문자열을
반환하고
새 값을 무시한다.
현재의 모든 엔진에서 지원된다.
요소의 dir IDL 속성은 해당 요소의
dir 콘텐츠 속성을
알려진 값으로만 제한하여
반영해야 한다.
현재의 모든 엔진에서 지원된다.
Document 객체의
dir IDL 속성은
html 요소가 있는 경우 해당 요소의
dir 콘텐츠 속성을
알려진 값으로만 제한하여
반영해야 한다. 그러한 요소가 없으면 속성은
빈 문자열을 반환해야 하며 설정할 때 아무 작업도 하지 않아야 한다.
작성자는 텍스트 방향을 나타낼 때 CSS보다 dir
속성을 사용하는 것이 강력히
권장된다. 이렇게 하면 CSS가 없는 경우에도(예: 검색 엔진이 문서를 해석하는 경우) 문서가 계속 올바르게
렌더링되기 때문이다.
이 마크업 조각은 IM 대화이다.
< p dir = auto class = "u1" >< b >< bdi > Student</ bdi > :</ b > How do you write "What's your name?" in Arabic?</ p >
< p dir = auto class = "u2" >< b >< bdi > Teacher</ bdi > :</ b > ما اسمك؟</ p >
< p dir = auto class = "u1" >< b >< bdi > Student</ bdi > :</ b > Thanks.</ p >
< p dir = auto class = "u2" >< b >< bdi > Teacher</ bdi > :</ b > That's written "شكرًا".</ p >
< p dir = auto class = "u2" >< b >< bdi > Teacher</ bdi > :</ b > Do you know how to write "Please"?</ p >
< p dir = auto class = "u1" >< b >< bdi > Student</ bdi > :</ b > "من فضلك", right?</ p >
적절한 스타일시트와 p 요소의 기본 정렬 스타일,
즉 텍스트를 문단의 시작 가장자리에 정렬하는 스타일이 주어지면 결과 렌더링은 다음과 같을 수 있다:
앞에서 언급했듯이 auto 값이 만능 해결책은 아니다.
이 예의 마지막 문단은 아랍어 문자로 시작하기 때문에 오른쪽에서 왼쪽 방향의 텍스트로 잘못 해석되며,
그 결과 "right?"가 아랍어 텍스트의 왼쪽에 배치된다.
style 속성현재의 모든 엔진에서 지원된다.
모든 HTML 요소에는 style 콘텐츠 속성을
설정할 수 있다. 이는 CSS 스타일 속성에서 정의한 스타일 속성이다.
[CSSATTR]
CSS를 지원하는 사용자 에이전트에서는 속성이 추가되거나 그 값이 변경될 때 스타일 속성에 지정된 규칙에 따라 속성 값을 구문 분석해야 한다. [CSSATTR]
하지만 속성의 요소, "style attribute" 및 속성 값에 대해
요소의 인라인 동작을
콘텐츠 보안 정책으로 차단해야 하는가? 알고리즘을 실행한 결과가 "Blocked"이면,
속성 값에 정의된 스타일 규칙을 요소에 적용해서는 안 된다. [CSP]
요소 중 하나라도 style
속성을 사용하는 문서는 해당 속성을 제거하더라도 여전히 이해하고 사용할 수 있어야 한다.
특히 style 속성을 사용하여 콘텐츠를
숨기거나 표시하는 것 또는 문서의 다른 부분에는 포함되지 않은 의미를 전달하는 것은 부적합하다.
(콘텐츠를 숨기거나 표시하려면
속성을 사용한다.)
element.style
요소의 style
속성에 대한 CSSStyleDeclaration
객체를 반환한다.
style
IDL 속성은 CSS 객체 모델에 정의되어 있다. [CSSOM]
다음 예에서는 색상을 지칭하는 단어를 span
요소와 style 속성을 사용하여 마크업함으로써,
시각 매체에서 해당 단어가 관련 색상으로 표시되도록 한다.
< p > My sweat suit is < span style = "color: green; background:
transparent" > green</ span > and my eyes are < span style = "color: blue;
background: transparent" > blue</ span > .</ p >
data-*
속성을 사용하여 사용자 정의 비표시 데이터 임베딩
현재의 모든 엔진에서 지원된다.
사용자 정의 데이터 속성은 어떠한 네임스페이스에도 속하지 않고,
이름이 문자열 "data-"로 시작하며, 하이픈 뒤에 하나 이상의
문자가 있고, 유효한
속성 지역 이름이며, ASCII 대문자를 포함하지 않는 속성이다.
HTML 문서의 HTML 요소에 있는 모든 속성 이름은 자동으로 ASCII 소문자로 변환되므로, ASCII 대문자에 대한 제한은 이러한 문서에 영향을 주지 않는다.
사용자 정의 데이터 속성은 더 적절한 속성이나 요소가 없는 페이지 또는 애플리케이션 전용 사용자 정의 데이터, 상태, 주석 및 그와 유사한 정보를 저장하기 위한 것이다.
이러한 속성은 해당 속성을 사용하는 사이트의 관리자가 알지 못하는 소프트웨어에서 사용하도록 의도된 것이 아니다. 여러 독립적인 도구에서 사용할 일반적인 확장의 경우에는 이 명세를 확장하여 기능을 명시적으로 제공하거나, 표준화된 어휘와 함께 마이크로데이터와 같은 기술을 사용해야 한다.
예를 들어 음악 관련 사이트에서는 앨범의 트랙을 나타내는 목록 항목에 각 트랙의 길이가 포함된 사용자 정의 데이터 속성을 주석으로 지정할 수 있다. 그런 다음 사이트 자체에서 이 정보를 사용하여 사용자가 트랙 길이를 기준으로 목록을 정렬하거나 특정 길이의 트랙만 표시하도록 목록을 필터링할 수 있다.
< ol >
< li data-length = "2m11s" > Beyond The Sea</ li >
...
</ ol >
하지만 사용자가 해당 음악 사이트와 관련이 없는 범용 소프트웨어에서 이 데이터를 살펴보아 특정 길이의 트랙을 검색하는 것은 부적절하다.
이러한 속성은 사이트 자체의 스크립트에서 사용하기 위한 것이며, 공개적으로 사용할 수 있는 메타데이터를 위한 일반적인 확장 메커니즘이 아니기 때문이다.
마찬가지로 페이지 작성자는 자신이 사용하려는 번역 도구에 정보를 제공하는 마크업을 작성할 수 있다:
< p > The third < span data-mytrans-de = "Anspruch" > claim</ span > covers the case of < span
translate = "no" > HTML</ span > markup.</ p >
이 예에서 "data-mytrans-de" 속성은 MyTrans 제품이 "claim"이라는 구문을 독일어로
번역할 때 사용할 특정 텍스트를 제공한다. 하지만 표준 translate
속성을 사용하여 모든 언어에서 "HTML"을 변경하지 않고 그대로 두도록 지정한다. 표준 속성을 사용할 수
있으면 사용자 정의 데이터
속성을 사용할 필요가 없다.
이 예에서는 PaymentRequest에
대한 기능 감지 결과를 저장하기 위해 사용자 정의 데이터 속성을 사용한다. 이 결과는 CSS에서 결제 페이지의
스타일을 다르게 지정하는 데 사용할 수 있다.
< script >
if ( 'PaymentRequest' in window) {
document. documentElement. dataset. hasPaymentRequest = '' ;
}
</ script >
여기서는 data-has-payment-request 속성을 사실상 불리언 속성으로
사용하며, 속성이 존재하는지만 확인하면 충분하다. 하지만 작성자가 원한다면 나중에 어떤 값으로 채워서
기능의 제한된 작동을 나타내는 데 사용할 수도 있다.
모든 HTML 요소에는 임의의 값을 가진 사용자 정의 데이터 속성을 원하는 수만큼 지정할 수 있다.
작성자는 속성이 무시되고 관련 CSS가 제거되더라도 페이지를 계속 사용할 수 있도록 이러한 확장을 신중하게 설계해야 한다.
사용자 에이전트는 이러한 속성이나 값에서 어떠한 구현 동작도 도출해서는 안 된다. 사용자 에이전트를 대상으로 하는 명세에서는 이러한 속성에 의미 있는 값을 정의해서는 안 된다.
JavaScript 라이브러리는 사용자 정의 데이터 속성을 사용할 수 있다. 이러한 속성은 사용되는 페이지의 일부로 간주되기 때문이다. 많은 작성자가 재사용하는 라이브러리의 작성자는 충돌 위험을 줄이기 위해 속성 이름에 자신의 이름을 포함하는 것이 권장된다. 적절한 경우 라이브러리 작성자는 속성 이름에 사용되는 정확한 이름을 사용자가 지정할 수 있도록 하는 것도 권장된다. 그러면 서로 같은 이름을 선택했다는 사실을 알지 못했던 작성자들의 라이브러리를 같은 페이지에서 사용할 수 있고, 특정 라이브러리의 여러 버전이 서로 호환되지 않더라도 같은 페이지에서 사용할 수 있다.
예를 들어 "DoQuery"라는 라이브러리는 data-doquery-range와 같은 속성 이름을 사용할 수 있고,
"jJo"라는 라이브러리는 data-jjo-range와 같은 속성 이름을 사용할 수 있다.
jJo 라이브러리는 사용할 접두사를 설정하는 API도 제공할 수 있다
(예: J.setDataPrefix('j2')를 사용하면 속성 이름이
data-j2-range와 같이 된다).
element.dataset
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
요소의 data-*
속성에 대한 DOMStringMap
객체를 반환한다.
하이픈이 포함된 이름은 카멜 표기법으로 변환된다. 예를 들어 data-foo-bar=""는
element.dataset.fooBar가 된다.
dataset IDL 속성은 요소의 모든 data-*
속성에 편리하게 접근할 수 있는 접근자를 제공한다. 가져올 때 dataset
IDL 속성은 연관 요소가 이 요소인 DOMStringMap을
반환해야 한다.
DOMStringMap
인터페이스는 dataset
속성에 사용된다. 각 DOMStringMap에는
연관 요소가 있다.
[Exposed =Window ,
LegacyOverrideBuiltIns ]
interface DOMStringMap {
getter DOMString (DOMString name );
[CEReactions ] setter undefined (DOMString name , DOMString value );
[CEReactions ] deleter undefined (DOMString name );
};
DOMStringMap의 이름-값 쌍을 가져오려면,
다음 알고리즘을 실행한다:
list를 빈 이름-값 쌍 목록으로 둔다.
DOMStringMap의
연관
요소에 있는 각 콘텐츠 속성 중 처음 다섯 문자가 문자열 "data-"이고,
나머지 문자에 ASCII 대문자가 포함되어 있지 않은 속성에 대해,
요소의 속성 목록에
나열된 순서대로 이름에서 처음 다섯 문자를 제거한
값을 이름으로 하고 속성 값을 값으로 하는 이름-값 쌍을 list에 추가한다.
list의 각 이름에 대해, 이름에서 ASCII 소문자가 뒤따르는 각 U+002D HYPHEN-MINUS 문자(-)를 제거하고, 그 뒤에 있던 문자를 같은 문자의 ASCII 대문자 변환 결과로 교체한다.
list를 반환한다.
임의의 시점에서 DOMStringMap
객체의 지원되는 속성 이름은 그 시점에
DOMStringMap의
이름-값 쌍을 가져온 결과로 반환되는 각 쌍의 이름이며, 반환된 순서를 따른다.
DOMStringMap에서
명명된 속성 name의 값을 결정하려면,
DOMStringMap의
이름-값 쌍을 가져온 결과 목록에서 이름 구성 요소가 name인 이름-값 쌍의
값 구성 요소를 반환한다.
DOMStringMap에서
새 명명된 속성의 값을 설정하거나
기존 명명된 속성의 값을 설정하기 위해,
속성 이름 name과 새 값 value가 주어지면 다음 단계를 실행한다:
name에 ASCII
소문자가 뒤따르는 U+002D HYPHEN-MINUS
문자(-)가 포함되어 있으면 "SyntaxError" DOMException을
던진다.
name의 각 ASCII 대문자 앞에 U+002D HYPHEN-MINUS 문자(-)를 삽입하고, 해당 문자를 같은 문자의 ASCII 소문자 변환 결과로 교체한다.
name 앞에 문자열 data-를 삽입한다.
name이 유효한 속성 지역 이름이 아니면
"InvalidCharacterError" DOMException을
던진다.
DOMStringMap의
연관
요소에 대해 name과 value를 사용하여
속성 값을 설정한다.
DOMStringMap에서
기존 명명된 속성 name을 삭제하려면 다음 단계를 실행한다:
name의 각 ASCII 대문자 앞에 U+002D HYPHEN-MINUS 문자(-)를 삽입하고, 해당 문자를 같은 문자의 ASCII 소문자 변환 결과로 교체한다.
name 앞에 문자열 data-를 삽입한다.
name과 DOMStringMap의
연관
요소가 주어지면 이름으로 속성을 제거한다.
이 알고리즘은 앞의 DOMStringMap의
이름-값 쌍을 가져오는 알고리즘에서 제공된 이름에 대해서만 Web IDL에 의해 호출된다.
[WEBIDL]
웹페이지에서 요소가 게임의 일부로 우주선을 나타내도록 하려면 class
속성과 함께 data-*
속성을 사용해야 한다:
< div class = "spaceship" data-ship-id = "92432"
data-weapons = "laser 2" data-shields = "50%"
data- x = "30" data-y = "10" data-z = "90" >
< button class = "fire"
onclick = "spaceships[this.parentNode.dataset.shipId].fire()" >
Fire
</ button >
</ div >
하이픈이 포함된 속성 이름이 API에서 카멜 표기법으로 변환된다는 점에 유의한다.
다음 코드 조각과 유사한 구조를 가진 요소가 주어졌다고 하자:
< img class = "tower" id = "tower5" data- x = "12" data-y = "5"
data-ai = "robotarget" data-hp = "46" data-ability = "flames"
src = "towers/rocket.png" alt = "Rocket Tower" >
...몇 가지 인수를 받고 그중 첫 번째 인수가 처리할 요소인 splashDamage() 함수를
생각할 수 있다:
function splashDamage( node, x, y, damage) {
if ( node. classList. contains( 'tower' ) && // checking the 'class' attribute
node. dataset. x == x && // reading the 'data-x' attribute
node. dataset. y == y) { // reading the 'data-y' attribute
var hp = parseInt( node. dataset. hp); // reading the 'data-hp' attribute
hp = hp - damage;
if ( hp < 0 ) {
hp = 0 ;
node. dataset. ai = 'dead' ; // setting the 'data-ai' attribute
delete node. dataset. ability; // removing the 'data-ability' attribute
}
node. dataset. hp = hp; // setting the 'data-hp' attribute
}
}
innerText 및 outerText 속성현재의 모든 엔진에서 지원된다.
element.innerText [ = value ]
요소의 텍스트 콘텐츠를 "렌더링된 대로" 반환한다.
설정하여 요소의 자식을 주어진 값으로 교체할 수 있지만, 줄바꿈은 br 요소로
변환한다.
element.outerText [ = value ]
요소의 텍스트 콘텐츠를 "렌더링된 대로" 반환한다.
설정하여 요소를 주어진 값으로 교체할 수 있지만, 줄바꿈은 br 요소로
변환한다.
HTMLElement element가 주어졌을 때, 텍스트 가져오기 단계는 다음과 같다:
element가 렌더링 중이 아니거나 사용자 에이전트가 CSS를 사용하지 않는 사용자 에이전트이면 element의 자손 텍스트 콘텐츠를 반환한다.
이 단계에서는 예상치 못한 결과가 발생할 수 있다. innerText
getter를 렌더링 중이 아닌 요소에서 호출하면
텍스트 콘텐츠가 반환되지만, 렌더링 중인 요소에서
접근하면
렌더링 중이 아닌 모든 자식의 텍스트
콘텐츠가 무시되기 때문이다.
results를 새로운 빈 목록으로 둔다.
element의 각 자식 노드 node에 대해:
current를 node로 렌더링된 텍스트 수집 단계를 실행한 결과인 목록으로 둔다. results의 각 항목은 문자열 또는 양의 정수(필수 줄바꿈 수)이다.
직관적으로 필수 줄바꿈 수 항목은 해당 지점에 특정 수의 줄바꿈이 나타남을 의미하지만, 인접한 필수 줄바꿈 수 항목으로 인해 발생한 줄바꿈과 병합될 수 있다. 이는 CSS 여백 상쇄와 유사하다.
current의 각 항목 item을 results에 추가한다.
results에서 빈 문자열인 모든 항목을 제거한다.
results의 시작이나 끝에 있는 연속된 필수 줄바꿈 수 항목을 모두 제거한다.
남아 있는 각각의 연속된 필수 줄바꿈 수 항목을 해당 항목 값의 최댓값만큼 U+000A LF 코드 포인트가 포함된 문자열로 교체한다.
results의 문자열 항목을 연결한 결과를 반환한다.
현재의 모든 엔진에서 지원된다.
innerText 및
outerText getter
단계는 this로 텍스트 가져오기 단계를 실행한 결과를
반환하는 것이다.
노드 node가 주어졌을 때, 렌더링된 텍스트 수집 단계는 다음과 같다:
items를 node의 각 자식 노드에 대해 렌더링된 텍스트 수집 단계를 트리 순서로 실행한 다음 그 결과를 하나의 목록으로 연결한 결과로 둔다.
node의 'visibility' 계산 값이 'visible'이 아니면 items를 반환한다.
node가 렌더링 중이 아니면 items를 반환한다. 이 단계의 목적상 다음 요소는 'display' 속성의 계산 값이 'none'이 아니면 설명된 대로 동작해야 한다:
select
요소에는 연관된 비대체 인라인 CSS 박스가 있으며, 그 자식
박스에는 optgroup
및 option
요소 자손 노드의 박스만 포함된다.
optgroup
요소에는 연관된 비대체 블록 수준 CSS 박스가 있으며, 그 자식
박스에는 option
요소 자손 노드의 박스만 포함된다. 그리고
option
요소에는 연관된 비대체 블록 수준 CSS 박스가 있으며, 그 자식 박스는
비대체 블록 수준
CSS 박스에서와 같이 정상적으로 구성된다.
'display:contents'로 인해 items가 비어 있지 않을 수 있다.
node가 Text
노드이면 node가 생성한 각 CSS 텍스트 박스에 대해 콘텐츠 순서대로 CSS 'white-space' 처리 규칙과 'text-transform' 규칙을 적용한 뒤 박스의 텍스트를 계산하고,
items를 결과 문자열의 목록으로 설정한 다음
items를 반환한다. CSS 'white-space' 처리 규칙은 약간 수정된다. 줄 끝의 축소 가능한
공백은 항상 축소되지만, 그 줄이 블록의 마지막 줄이거나 br 요소로 끝나는
경우에만 제거된다. 소프트 하이픈은 보존해야 한다.
[CSSTEXT]
node의 'display' 계산 값이 'table-cell'이고, node의 CSS 박스가 이를 둘러싼 'table-row' 박스의 마지막 'table-cell' 박스가 아니면 단일 U+0009 TAB 코드 포인트를 포함하는 문자열을 items에 추가한다.
node의 'display' 계산 값이 'table-row'이고, node의 CSS 박스가 가장 가까운 조상 'table' 박스의 마지막 'table-row' 박스가 아니면 단일 U+000A LF 코드 포인트를 포함하는 문자열을 items에 추가한다.
node의 'display' 사용 값이 블록 수준 또는 'table-caption'이면 items의 시작과 끝에 1(필수 줄바꿈 수)을 추가한다. [CSSDISPLAY]
플로트와 절대 위치 지정 요소가 이 범주에 속한다.
items를 반환한다.
대부분의 대체 요소(예: textarea,
input 및 video — 단,
button은
제외)의 자손 노드는 엄밀히 말해 CSS에 의해 렌더링되지 않으므로, 이 알고리즘의 목적상
CSS 박스가 없다는 점에 유의한다.
이 알고리즘은 범위에서 작동하도록 일반화할 수 있다. 그러면 이를
Selection의
문자열 변환기의 기반으로 사용하고, 범위에 직접 노출할 수도 있다. Bugzilla 버그 10583을 참조한다.
HTMLElement element와 문자열 value가 주어졌을 때, 내부 텍스트 설정 단계는 다음과 같다:
fragment를 element의 노드 문서가 주어졌을 때 value에 대한 렌더링된 텍스트 조각으로 둔다.
element 내부의 모든 항목을 fragment로 교체한다.
innerText setter
단계는 this와 주어진 값으로 내부 텍스트 설정 단계를 실행하는 것이다.
outerText setter
단계는 다음과 같다:
this의 부모가 null이면 "NoModificationAllowedError" DOMException을
던진다.
fragment를 this의 노드 문서가 주어졌을 때 주어진 값에 대한 렌더링된 텍스트 조각으로 둔다.
fragment에 자식이 없으면, this의 노드 문서를 노드 문서로 가지며 데이터가 빈 문자열인 새로운 Text
노드를 fragment에 추가한다.
next가 null이 아니고 next의 이전
형제가 Text
노드이면, next의 이전
형제가 주어졌을 때
다음 텍스트
노드와 병합한다.
previous가 Text
노드이면 previous가 주어졌을 때 다음 텍스트 노드와 병합한다.
Document
document가 주어졌을 때 문자열 input에 대한
렌더링된 텍스트 조각은 다음 단계를 실행한 결과이다:
fragment를 document가 주어졌을 때 문서 프래그먼트를 생성한 결과로 설정합니다.
position을 input의 위치 변수로 설정하고, 처음에는 input의 시작을 가리키도록 합니다.
text를 빈 문자열로 설정합니다.
position이 input의 끝을 지나지 않는 동안:
position이 주어졌을 때 input에서 U+000A LF 또는 U+000D CR이 아닌 코드 포인트 시퀀스를 수집하고, text를 그 결과로 설정합니다.
text가 빈 문자열이 아니면, 추가합니다.
데이터가
text이고 노드
문서가
document인 새로운 Text
노드를 fragment에 추가합니다.
position이 input의 끝을 지나지 않고, position의 코드 포인트가 U+000A LF 또는 U+000D CR인 동안:
position의 코드 포인트가 U+000D CR이고 다음 코드 포인트가 U+000A LF이면, position을 input의 다음 코드 포인트로 전진시킵니다.
position을 input의 다음 코드 포인트로 전진시킵니다.
document, "br",
그리고 HTML
네임스페이스가 주어졌을 때 요소를
생성한 결과를 fragment에 추가합니다.
fragment를 반환합니다.
Text
노드 node가 주어졌을 때 다음 텍스트 노드와
병합하려면:
텍스트
콘텐츠는 HTML
요소의 Text
노드를 포함하는
콘텐츠와,
자유 형식 텍스트를 허용하는 HTML
요소의 속성에 있는 텍스트에서 U+202A부터 U+202E까지 및 U+2066부터 U+2069까지의 문자
(양방향 알고리즘 서식 문자)를 포함할 수 있다. [BIDI]
작성자는 양방향 알고리즘 서식 문자를 수동으로 관리하는 대신 dir
속성, bdo
요소 및 bdi
요소를 사용하는 것이 권장된다. 양방향 알고리즘 서식 문자는 CSS와 제대로 상호 작용하지 않는다.
사용자 에이전트는 문서와 문서 일부를 렌더링할 때 문자의 올바른 순서를 결정하기 위해 유니코드 양방향 알고리즘을 구현해야 한다. [BIDI]
HTML을 유니코드 양방향 알고리즘에 매핑하는 작업은 세 가지 방법 중 하나로 수행해야 한다. 사용자 에이전트는 특히 CSS 'unicode-bidi', 'direction' 및 'content' 속성을 포함하는 CSS를 구현하고, 사용자 에이전트 스타일시트에 이 명세의 렌더링 절에서 지정한 해당 속성을 사용하는 규칙을 포함해야 한다. 또는 사용자 에이전트가 앞에서 언급한 속성만 구현하고 앞에서 언급한 모든 규칙을 포함하는 사용자 에이전트 스타일시트를 가진 것처럼 동작하되, 문서에 지정된 스타일시트가 해당 규칙을 재정의하지 못하게 해야 한다. 또는 이와 동등한 의미 체계를 가진 다른 스타일링 언어를 구현해야 한다. [CSSGC]
다음 요소와 속성에는 렌더링 절에서 정의한 요구 사항이 있으며, 이 절의 요구 사항으로 인해 이러한 요구 사항은 모든 사용자 에이전트에 적용된다 (제안된 기본 렌더링을 지원하는 사용자 에이전트에만 적용되는 것이 아니다):
HTML 요소에서 접근성 API 의미 체계를 구현하기 위한 사용자 에이전트 요구 사항은 HTML 접근성 API 매핑에 정의되어 있다. 해당 규칙 외에도 사용자 정의 요소 element의 기본 ARIA 역할 의미 체계는 다음과 같이 결정된다. [HTMLAAM]
map을 element의 내부 콘텐츠 속성 맵으로 둔다.
map["role"]이 존재하면 이를 반환한다.
역할 없음을 반환한다.
마찬가지로 사용자 정의 요소 element에서 stateOrProperty라는 이름의 상태 또는 속성에 대한 기본 ARIA 상태 및 속성 의미 체계는 다음과 같이 결정된다:
element의 연결된 내부 구조가 null이 아니면:
element의 연결된 내부 구조에 stateOrProperty 연관 요소 가져오기가 존재하면 이를 실행한 결과를 반환한다.
element의 연결된 내부 구조에 stateOrProperty 연관 요소들 가져오기가 존재하면 이를 실행한 결과를 반환한다.
element의 내부 콘텐츠 속성 맵[stateOrProperty]이 존재하면 이를 반환한다.
stateOrProperty의 기본값을 반환한다.
여기에서 언급하는 "기본 의미 체계"는 ARIA에서 때때로 "네이티브", "암시적" 또는 "호스트 언어" 의미 체계라고도 한다. [ARIA]
이러한 정의가 의미하는 바 중 하나는 기본 의미 체계가 시간에 따라 변경될 수 있다는 것이다.
이를 통해 사용자 정의 요소는 내장 요소와 동일한 표현력을 가질 수 있다. 예를 들어 a 요소에서 href 속성을 추가하거나 제거할 때
기본 ARIA 역할 의미 체계가 어떻게 변경되는지 비교할 수 있다.
실제로 적용되는 예는 사용자 정의 요소 절을 참조한다.
HTML 요소에서 ARIA role 및 aria-* 속성 사용을 검사하기 위한
적합성 검사기 요구 사항은 HTML의 ARIA에 정의되어 있다.
[ARIAHTML]
html
요소현재의 모든 엔진에서 지원된다.
Support in all current engines.
head 요소 뒤에
body 요소가 온다.
html 요소 내부의 첫
번째 항목이 주석이 아니면
html 요소의 시작 태그를 생략할 수 있다.
html 요소 바로
뒤에 주석이 오지 않으면
html 요소의 종료 태그를 생략할 수 있다.
[Exposed =Window ]
interface HTMLHtmlElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
작성자는 루트 html 요소에 문서의 언어를
제공하는 lang 속성을 지정하는 것이
권장된다. 이는 음성 합성 도구가 사용할 발음을 결정하고, 번역 도구가 사용할 규칙을 결정하는 등의 작업에
도움이 된다.
다음 예의 html
요소는 문서의 언어가 영어임을 선언한다.
<!DOCTYPE html>
< html lang = "en" >
< head >
< title > Swapping Songs</ title >
</ head >
< body >
< h1 > Swapping Songs</ h1 >
< p > Tonight I swapped some of the songs I wrote with some friends, who
gave me some of the songs they wrote. I love sharing my music.</ p >
</ body >
</ html >
head
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
html 요소의
첫 번째 요소로.iframe
srcdoc 문서이거나 상위 수준 프로토콜에서 제목 정보를 사용할 수 있는 경우:
0개 이상의 메타데이터 콘텐츠
요소. 이 중 title
요소는 최대 하나이고 base
요소도 최대 하나이다.title 요소이고,
base 요소는
최대 하나이다.
head 요소 내부의
첫 번째 항목이 요소이면 head 요소의
시작 태그를 생략할 수 있다.
head 요소 바로 뒤에
ASCII 공백이나
주석이 오지 않으면
head 요소의
종료 태그를 생략할 수 있다.
[Exposed =Window ]
interface HTMLHeadElement : HTMLElement {
[HTMLConstructor ] constructor ();
};
head 요소는
Document의 메타데이터 모음을
나타낸다.
head 요소의
메타데이터 모음은 크거나 작을 수 있다. 다음은 매우 짧은 예이다:
<!doctype html>
< html lang = en >
< head >
< title > A document with a short head</ title >
</ head >
< body >
...
다음은 더 긴 예이다:
<!DOCTYPE HTML>
< HTML LANG = "EN" >
< HEAD >
< META CHARSET = "UTF-8" >
< BASE HREF = "https://www.example.com/" >
< TITLE > An application with a long head</ TITLE >
< LINK REL = "STYLESHEET" HREF = "default.css" >
< LINK REL = "STYLESHEET ALTERNATE" HREF = "big.css" TITLE = "Big Text" >
< SCRIPT SRC = "support.js" ></ SCRIPT >
< META NAME = "APPLICATION-NAME" CONTENT = "Long headed application" >
</ HEAD >
< BODY >
...
title
요소는 대부분의 상황에서 필수 자식이지만, 상위 수준 프로토콜이 제목 정보를 제공하는 경우에는 생략할 수 있다.
예를 들어 HTML을 이메일 작성 형식으로 사용할 때 이메일 제목 줄에서 제목 정보를 제공하면 title 요소를 생략할 수 있다.
title
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
title
요소를 포함하지 않는 head 요소 내부.[Exposed =Window ]
interface HTMLTitleElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions ] attribute DOMString text ;
};
title 요소는
문서의 제목이나 이름을 나타낸다.
작성자는 문서가 사용자의 기록이나 북마크 또는 검색 결과 등 맥락에서 벗어나 사용되더라도 문서를 식별할 수 있는
제목을 사용해야 한다. 문서의 첫 번째 제목은 맥락에서 벗어나 단독으로 사용될 필요가 없으므로 문서의 제목은
첫 번째 제목과 다른 경우가 많다.
문서당 title 요소는 하나를
초과해서는 안 된다.
Document에 제목이 없어도 합당하다면
title 요소는
필수가 아닐 가능성이 높다. 요소가 필요한 경우에 대한 설명은 head 요소의 콘텐츠
모델을 참조한다.
title.text [ = value ]
요소의 자식 텍스트 콘텐츠를 반환한다.
설정하여 요소의 자식을 주어진 값으로 교체할 수 있다.
text 속성의
getter는 이 title 요소의
자식 텍스트
콘텐츠를 반환해야 한다.
다음은 적절한 제목의 몇 가지 예이며, 동일한 페이지에서 사용할 수 있는 최상위 제목과 대조한다.
< title > Introduction to The Mating Rituals of Bees</ title >
...
< h1 > Introduction</ h1 >
< p > This companion guide to the highly successful
< cite > Introduction to Medieval Bee-Keeping</ cite > book is...
다음 페이지는 같은 사이트의 일부일 수 있다. 제목은 주제를 명확하게 설명하지만 첫 번째 제목은 독자가 맥락을 알고 있다고 가정하므로 춤이 살사인지 왈츠인지 혼동하지 않는다는 점에 유의한다:
< title > Dances used during bee mating rituals</ title >
...
< h1 > The Dances</ h1 >
문서 제목으로 사용할 문자열은 document.title
IDL 속성으로
제공된다.
사용자 에이전트는 사용자 인터페이스에서 문서를 지칭할 때 문서의 제목을 사용해야 한다.
title 요소의
콘텐츠를 이러한 방식으로 사용할 때는 해당 title 요소의
방향성을 사용하여
사용자 인터페이스에서 문서 제목의 방향성을 설정해야 한다.
base
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
base 요소를
포함하지 않는 head
요소 내부.href — 문서 기준 URL
target —
하이퍼링크 내비게이션 및 폼 제출을 위한 기본 내비게이블
[Exposed =Window ]
interface HTMLBaseElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , ReflectSetter ] attribute USVString href ;
[CEReactions , Reflect ] attribute DOMString target ;
};
base 요소를 사용하면
작성자는 URL을 구문
분석하기 위한 문서 기준 URL과 하이퍼링크를 따라가기 위한
기본 내비게이블의 이름을 지정할 수 있다.
이 요소는 이 정보 외의 어떠한 콘텐츠도 나타내지 않는다.
문서당 base 요소는 하나를
초과해서는 안 된다.
base 요소에는
href 속성이나
target 속성 또는
둘 다 있어야 한다.
href 콘텐츠 속성을 지정한 경우 그
값에는
공백으로 둘러싸일 수 있는 유효한 URL이
포함되어야 한다.
base 요소에
href 속성이 있으면,
트리에서 URL을
받도록 정의된 속성을 가진 다른 모든 요소보다 앞에 있어야 한다.
href 속성이 있는
base 요소가 여러 개이면
첫 번째 요소를 제외한 나머지는 모두 무시된다.
target 속성을 지정한 경우 그
값에는
유효한
내비게이블 대상 이름 또는 키워드가
포함되어야 한다. 이는 Document의
하이퍼링크와 폼이 내비게이션을 일으킬
때 기본으로 사용할
내비게이블을 지정한다.
base 요소에
target 속성이 있으면,
트리에서 하이퍼링크를 나타내는 모든 요소보다
앞에 있어야 한다.
target 속성이 있는
base 요소가 여러 개이면
첫 번째 요소를 제외한 나머지는 모두 무시된다.
문서 트리 안에서 href 콘텐츠 속성을 가진
첫 번째 base 요소인
base 요소에는
고정된 기준 URL이 있다. 다음 상황 중 하나가 발생할 때마다 요소의
고정된 기준 URL을
즉시
설정해야 한다:
base 요소가 해당
Document에서 href 콘텐츠 속성을 가진
트리
순서상 첫 번째 base 요소가
되는 경우.
base 요소가 해당
Document에서 href 콘텐츠 속성을 가진
트리
순서상 첫 번째 base 요소이고,
해당 요소의 href 콘텐츠 속성이
변경되는 경우.
요소 element의 고정된 기준 URL을 설정하려면:
document를 element의 노드 문서로 둔다.
urlRecord를 document의 대체 기준 URL과 document의
문자
인코딩을 사용하여
element의 href 콘텐츠
속성 값을
구문 분석한 결과로 둔다.
(따라서 base
요소는 자기 자신의 영향을 받지 않는다.)
다음 중 하나라도 참이면:
urlRecord가 실패인 경우;
urlRecord의 스킴이
"data" 또는 "javascript"인 경우; 또는
urlRecord와 document에 대해 Document에 기준을 허용하는가?를 실행한 결과가
"Blocked"인 경우,
element의 고정된 기준 URL을 document의 대체 기준 URL로 설정하고 반환한다.
element의 고정된 기준 URL을 urlRecord로 설정한다.
document가 주어졌을 때 기준 URL 변경에 응답한다.
href IDL 속성은
가져올 때 다음 알고리즘을 실행한
결과를 반환해야 한다:
이 예에서는 base
요소를 사용하여 문서 기준 URL을 설정한다:
<!DOCTYPE html>
< html lang = "en" >
< head >
< title > This is an example for the < base> element</ title >
< base href = "https://www.example.com/news/index.html" >
</ head >
< body >
< p > Visit the < a href = "archives.html" > archives</ a > .</ p >
</ body >
</ html >
위 예의 링크는 "https://www.example.com/news/archives.html"로 연결된다.
link
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
head 요소의 자식인
noscript
요소 내부.
href —
하이퍼링크의 주소
crossorigin —
요소가 교차 출처 요청을 처리하는 방식
rel —
하이퍼링크를 포함하는 문서와 대상 리소스 간의 관계
media — 적용 대상 미디어
integrity —
하위 리소스 무결성 검사에 사용되는 무결성 메타데이터 [SRI]
hreflang —
링크된 리소스의 언어
type —
참조된 리소스 유형에 대한 힌트
referrerpolicy —
요소가 시작한 가져오기의 리퍼러
정책
sizes — 아이콘 크기
(rel="icon"인 경우)
imagesrcset —
고해상도 디스플레이, 소형 모니터 등 다양한 상황에서 사용할 이미지(rel="preload"인 경우)
imagesizes —
다양한 페이지 레이아웃에 대한 이미지 크기(rel="preload"인 경우)
as — 미리 로드 요청의 대상
(rel="preload" 및 rel="modulepreload"인 경우)
blocking —
요소가 잠재적으로 렌더링을 차단하는지
여부
color —
사이트 아이콘을 사용자 정의할 때 사용할 색상(rel="mask-icon"인 경우)
disabled —
링크가 비활성화되어 있는지 여부
fetchpriority
— 요소가 시작한 가져오기의 우선순위 설정
title 속성은
이 요소에서 특별한 의미 체계를
가진다: 링크의 제목; CSS
스타일시트 집합 이름
[Exposed =Window ]
interface HTMLLinkElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , ReflectURL ] attribute USVString href ;
[CEReactions ] attribute DOMString ? crossOrigin ;
[CEReactions , Reflect ] attribute DOMString rel ;
[CEReactions ] attribute DOMString as ;
[SameObject , PutForwards =value , Reflect="rel"] readonly attribute DOMTokenList relList ;
[CEReactions , Reflect ] attribute DOMString media ;
[CEReactions , Reflect ] attribute DOMString integrity ;
[CEReactions , Reflect ] attribute DOMString hreflang ;
[CEReactions , Reflect ] attribute DOMString type ;
[SameObject , PutForwards =value , Reflect ] readonly attribute DOMTokenList sizes ;
[CEReactions , Reflect ] attribute USVString imageSrcset ;
[CEReactions , Reflect ] attribute DOMString imageSizes ;
[CEReactions ] attribute DOMString referrerPolicy ;
[SameObject , PutForwards =value , Reflect ] readonly attribute DOMTokenList blocking ;
[CEReactions , Reflect ] attribute boolean disabled ;
[CEReactions ] attribute DOMString fetchPriority ;
// also has obsolete members
};
HTMLLinkElement includes LinkStyle ;
link 요소를 사용하면
작성자는 문서를 다른 리소스에 연결할 수 있다.
링크의 주소는 href 속성으로
제공된다. href 속성이 있으면 그 값은
공백으로 둘러싸일 수 있는 유효한
비어 있지 않은 URL이어야 한다. href 또는
imagesrcset
속성 중 하나 이상이 있어야 한다.
href 및 imagesrcset 속성이
모두 없으면 요소는 링크를 정의하지 않는다.
표시되는 링크 유형(관계)은 rel 속성의
값으로 제공되며,
이 속성이 있으면 그 값은 고유한 공백 구분 토큰의 순서 없는
집합이어야 한다. 허용되는 키워드와 그 의미는 뒤의 절에서 정의한다.
rel 속성이 없거나,
키워드가 없거나, 사용한 키워드 중 이 명세의 정의에 따라 허용되는 것이 하나도 없으면 요소는 어떠한
링크도 생성하지 않는다.
rel의
지원되는 토큰은
link 요소에서 허용되고,
처리 모델에 영향을 주며, 사용자 에이전트가 지원하는 HTML 링크 유형에 정의된
키워드이다. 가능한 지원되는 토큰은
alternate,
dns-prefetch,
expect,
icon,
manifest,
modulepreload,
next,
pingback,
preconnect,
prefetch,
preload,
search 및
stylesheet이다.
rel의 지원되는 토큰에는 사용자 에이전트가 처리 모델을 구현한
이 목록의 토큰만 포함되어야 한다.
이론적으로 사용자 에이전트가 JavaScript를 실행하는 검색 엔진이라면 canonical 키워드의
처리 모델을 지원할 수 있다. 하지만 실제로는 가능성이 매우 낮다. 따라서 대부분의 경우 canonical은
rel의 지원되는 토큰에 포함하지 않는 것이 좋다.
link 요소에는
rel 속성 또는 itemprop
속성 중 하나가 있어야 하지만 둘 다 있어서는 안 된다.
link 요소에
itemprop
속성이 있거나, rel 속성에
body-ok인 키워드만 포함되어 있으면 요소를
본문에서 허용된다고 한다. 이는 구문 콘텐츠가 예상되는 곳에서 요소를 사용할 수 있음을
의미한다.
rel 속성을
사용하면 요소를 페이지의 body에서 사용할 수 있는
경우가 제한된다. itemprop
속성과 함께 사용하면 마이크로데이터 모델의 제약에 따라 요소를 head 요소와 페이지의
body 모두에서
사용할 수 있다.
link 요소를 사용하여
두 범주의 링크를 생성할 수 있다: 외부 리소스 링크와 하이퍼링크. 링크 유형 절에서는 특정 링크
유형이 외부 리소스인지 하이퍼링크인지 정의한다. 하나의 link 요소는 여러 링크를
생성할 수 있으며, 그중 일부는 외부 리소스 링크이고
일부는 하이퍼링크일 수 있다. 정확히 어떤 링크가 몇 개 생성되는지는
rel 속성에 지정된
키워드에 따라 달라진다. 사용자 에이전트는 요소별이 아니라 링크별로 링크를 처리해야 한다.
link 요소에 대해 생성된
각 링크는 별도로 처리된다. 예를 들어 rel="stylesheet"인 link 요소가 두 개 있으면
각각 별도의 외부 리소스로 간주되며, 각 요소는 자체 속성의 영향을 독립적으로 받는다. 마찬가지로 하나의
link 요소의 rel 속성 값이
next stylesheet이면 next 키워드에 대한
하이퍼링크와 stylesheet
키워드에 대한 외부 리소스 링크를 모두 생성하며, 이들은
media나 title과 같은 다른 속성의
영향을 서로 다르게 받는다.
예를 들어 다음 link 요소는 동일한
페이지로 연결되는 두 개의 하이퍼링크를 생성한다:
< link rel = "author license" href = "/about" >
이 요소가 생성하는 두 링크 중 하나는 대상 페이지에 현재 페이지 작성자에 대한 정보가 있다는 의미이고, 다른 하나는 대상 페이지에 현재 페이지가 제공되는 라이선스에 관한 정보가 있다는 의미이다.
link 요소와 그
rel 속성으로 생성한
하이퍼링크는 문서 전체에 적용된다.
이는 문서 내 링크 위치가 제공하는 맥락을 가진 링크의 유형을 나타내는 a 및 area 요소의 rel 속성과 대조된다.
a 및 area 요소로 생성한 링크와
달리, link 요소가
생성한 하이퍼링크는 제안된 기본 렌더링을 지원하는
사용자 에이전트에서 기본적으로 문서의 일부로
표시되지 않는다. CSS로 강제로 표시하더라도 활성화
동작이 없다. 대신 페이지 또는 페이지의 콘텐츠를
소비하는 다른 소프트웨어에서 사용할 수 있는 의미 정보를 주로 제공한다. 또한 사용자 에이전트는
이러한
하이퍼링크를 따라가기 위한 자체 UI를 제공할 수 있다.
외부 리소스 링크의 정확한 동작은 관련 링크 유형에 정의된 정확한 관계에 따라 달라진다.
crossorigin 속성은
CORS 설정 속성이다.
이는 외부 리소스 링크와 함께 사용하기 위한 것이다.
media 속성은 리소스가 적용되는
미디어를 나타낸다.
값은 유효한 미디어 쿼리 목록이어야 한다.
현재의 모든 엔진에서 지원된다.
integrity 속성은 이
요소가 담당하는 요청에 대한
무결성
메타데이터를 나타낸다. 값은 텍스트이다.
이 속성은 rel 속성에
stylesheet,
preload 또는
modulepreload
키워드를 포함하는 link 요소에만 지정해야 한다.
[SRI]
link 요소의
hreflang 속성은 a 요소의
hreflang 속성과 동일한 의미 체계를 가진다.
type 속성은 링크된 리소스의 MIME 유형을 제공한다. 이는 순전히 참고용이다. 값은 유효한 MIME 유형
문자열이어야 한다.
외부 리소스 링크의 경우
type 속성은 사용자
에이전트가 지원하지 않는 리소스를 가져오는 것을 피할 수 있도록 힌트로 사용된다.
referrerpolicy 속성은 리퍼러 정책 속성이다.
이는 외부 리소스 링크와 함께 사용하기 위한 것이며,
링크된
리소스를 가져오고 처리할 때 사용하는
리퍼러 정책을 설정하는 데 도움이 된다.
[REFERRERPOLICY]
title 속성은 링크의 제목을
제공한다. 한 가지 예외를
제외하면 순전히 참고용이다. 값은 텍스트이다. 예외는 문서 트리 안에 있는 스타일시트
링크이며, 이 경우 title 속성은 CSS 스타일시트 집합을 정의한다.
link
요소의 title 속성은
제목이 없는 링크가 부모 요소의 제목을 상속하지 않고 단순히 제목이 없다는 점에서 대부분의 다른 요소의
전역 title 속성과 다르다.
imagesrcset 속성을
지정할 수 있으며,
이는 srcset 속성이다.
imagesrcset 및
href 속성은
(너비 설명자를 사용하지 않는 경우)
함께 소스 집합에 이미지 소스를 제공한다.
imagesrcset
속성이 있고 너비 설명자를 사용하는 이미지 후보 문자열이
하나라도 있으면 imagesizes 속성도 있어야 하며, 이는 sizes 속성이다. imagesizes 속성은
소스 집합에 소스 크기를 제공한다.
imagesrcset 및
imagesizes
속성은 rel 속성이
preload 키워드를
지정하고, as 속성이
"image" 상태인 link
요소에만 지정해야 한다.
이러한 속성을 사용하면 나중에 srcset 및 sizes 속성에 대응하는 값을 가진
img 요소에서 사용할
적절한 리소스를 미리 로드할 수 있다:
< link rel = "preload" as = "image"
imagesrcset = "wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w"
imagesizes = "50vw" >
<!-- ... later, or perhaps inserted dynamically ... -->
< img src = "wolf.jpg" alt = "A rad wolf"
srcset = "wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w"
sizes = "50vw" >
href 속성은
imagesrcset을
지원하지 않는 브라우저에만 관련이 있고, 그러한 경우 잘못된 이미지가 미리 로드될 가능성이 높으므로
생략한 점에 유의한다.
imagesrcset
속성을 media 속성과
함께 사용하면 아트 디렉션을 위해
picture 요소의
소스에서 선택된 적절한 리소스를 미리 로드할 수 있다:
< link rel = "preload" as = "image"
imagesrcset = "dog-cropped-1x.jpg, dog-cropped-2x.jpg 2x"
media = "(max-width: 800px)" >
< link rel = "preload" as = "image"
imagesrcset = "dog-wide-1x.jpg, dog-wide-2x.jpg 2x"
media = "(min-width: 801px)" >
<!-- ... later, or perhaps inserted dynamically ... -->
< picture >
< source srcset = "dog-cropped-1x.jpg, dog-cropped-2x.jpg 2x"
media = "(max-width: 800px)" >
< img src = "dog-wide-1x.jpg" srcset = "dog-wide-2x.jpg 2x"
alt = "An awesome dog" >
</ picture >
sizes 속성은 시각 매체용 아이콘의
크기를 제공한다.
값이 있더라도 이는 참고용일 뿐이다. 여러 아이콘을 사용할 수 있는 경우 사용자 에이전트는 이 값을 사용하여
사용할 아이콘을 결정할 수 있다. 속성을 지정하면 값은 고유한 공백 구분 토큰의 순서 없는
집합이어야 하며, 토큰은 ASCII 대소문자를
구분하지 않는다. 각 값은 문자열
"any"와
ASCII 대소문자를 구분하지 않고 일치하거나,
선행 U+0030 DIGIT ZERO(0) 문자가 없고 단일 U+0078 LATIN SMALL LETTER X 또는 U+0058 LATIN CAPITAL
LETTER X 문자로 구분된 두 개의 유효한 음이
아닌 정수로 구성된 값이어야 한다.
이 속성은 rel 속성이
icon 키워드 또는
apple-touch-icon 키워드를 지정하는 link 요소에만 지정해야 한다.
apple-touch-icon 키워드는 미리 정의된 링크 유형 집합의 확장으로 등록되어 있지만,
사용자 에이전트가 어떠한 방식으로든 이를 지원해야 하는 것은 아니다.
as 속성은 href 속성이 제공하는 리소스의
미리 로드 요청에 대한 미리 로드 대상 또는 모듈 미리 로드 대상을
지정한다. 이는 열거형 속성이다. 미리 로드 대상과 모듈 미리 로드 대상의
합집합에 속하는 각 항목은 이 속성의 키워드이며, 같은 이름의 상태에 매핑된다.
이 속성은 rel 속성에
preload 키워드를
포함하는 link
요소에 지정해야 하며, 이 경우 값은 미리 로드 대상이어야 한다.
rel 속성에 modulepreload
키워드를 포함하는 link 요소에도 지정할 수
있으며, 이 경우 값은 모듈 미리 로드
대상이어야 한다. 그 밖의
link 요소에는
지정해서는 안 된다.
as 속성의 사용 방식에 대한
처리 모델은 개별 링크 유형의 링크된 리소스를 가져오고 처리
알고리즘에 제시되어 있다.
이 속성에는 누락 값
기본값 또는 유효하지 않은 값
기본값이 없다. 즉 유효하지 않거나 누락된 값은 어떠한 상태에도 매핑되지 않는다.
이는 처리 모델에서 고려한다. preload
링크에서는
두 조건 모두 오류이며, modulepreload
링크에서는 누락된 값을 "script"로 처리한다.
blocking 속성은 차단 속성이다.
이는 stylesheet 및
expect 링크 유형에서
사용되며, 해당 키워드를 포함하는 rel 속성이 있는 link
요소에만
지정해야 한다.
color 속성은
mask-icon 링크 유형과 함께
사용된다. 이 속성은 rel 속성에
mask-icon 키워드를 포함하는 link 요소에만 지정해야 한다.
값은 CSS <color> 생성 규칙과 일치하는 문자열이어야 하며, 사용자가 사이트를
고정할 때 표시되는 아이콘을 사용자 에이전트가 사용자 정의하는 데 사용할 수 있는 권장 색상을 정의한다.
이 명세에는 color 속성에
대한 사용자
에이전트 요구 사항이 없다.
mask-icon 키워드는 미리 정의된 링크 유형 집합의 확장으로 등록되어 있지만,
사용자 에이전트가 어떠한 방식으로든 이를 지원해야 하는 것은 아니다.
link 요소에는
연관된 명시적으로 활성화됨 불리언이 있다. 초기값은 false이다.
disabled 속성은 stylesheet 링크 유형과
함께 사용되는 불리언 속성이다. 이 속성은 rel 속성에 stylesheet 키워드를
포함하는 link
요소에만 지정해야 한다.
disabled 속성이
제거될 때마다 link 요소의
명시적으로 활성화됨을 true로
설정한다.
예를 들어 document.querySelector("link").removeAttribute("disabled")를 사용하여
disabled 속성을
동적으로 제거하면 스타일시트를 가져와 적용한다:
< link disabled rel = "alternate stylesheet" href = "css/pooh" >
fetchpriority
속성은 가져오기 우선순위 속성이며,
외부 리소스 링크와 함께 사용하기 위한 것이다.
이는 링크된 리소스를 가져오고 처리할 때
사용하는 우선순위를 설정하는 데 사용된다.
color 속성을 반영하는 IDL
속성은
없지만 나중에 추가될 수 있다.
현재의 모든 엔진에서 지원된다.
as IDL 속성은
as 콘텐츠 속성을
알려진 값으로만 제한하여
반영해야 한다.
crossOrigin IDL 속성은 crossorigin
콘텐츠 속성을 알려진 값으로만
제한하여
반영해야 한다.
HTMLLinkElement/referrerPolicy
현재의 모든 엔진에서 지원된다.
referrerPolicy IDL 속성은 referrerpolicy
콘텐츠 속성을 알려진 값으로만
제한하여
반영해야 한다.
fetchPriority IDL 속성은 fetchpriority
콘텐츠 속성을 알려진 값으로만
제한하여
반영해야 한다.
relList
속성의 supports()
메서드를 호출하여 어떤 링크 유형이 지원되는지 확인함으로써 기능 감지에 사용할 수 있다.
media 속성 처리링크가 하이퍼링크이면 media
속성은 순전히 참고용이며, 해당 문서가 어떤 미디어를 위해 설계되었는지를 설명한다.
하지만 링크가 외부 리소스
링크이면 media
속성은
규범적이다. 사용자 에이전트는 media 속성의
값이 환경과 일치하고 다른 관련
조건이 적용될 때
외부 리소스를 적용해야 하며, 그렇지 않으면 적용해서는 안 된다.
media 속성을
생략한 경우 기본값은 "all"이며, 이는 기본적으로 링크가 모든 미디어에 적용됨을 의미한다.
외부 리소스에는 적용 가능성을 제한하는 추가 제약이 내부에 정의되어 있을 수 있다.
예를 들어 CSS 스타일시트에는 일부 @media 블록이 있을 수 있다. 이 명세는 그러한 추가
제약이나 요구 사항을 재정의하지 않는다.
type 속성 처리type
속성이 있으면 사용자 에이전트는 리소스가 지정된 유형이라고 가정해야 한다
(지정된 값이 유효한 MIME 유형
문자열이 아니더라도 마찬가지이며,
예를 들어 빈 문자열일 수도 있다). 속성을 생략했지만 외부 리소스 링크 유형에 기본 유형이
정의되어 있으면 사용자 에이전트는 리소스가 해당 유형이라고 가정해야 한다. 사용자 에이전트가 주어진
링크 관계에 대해 지정된 MIME 유형을 지원하지 않으면 사용자 에이전트는
링크된 리소스를 가져오고
처리하지 않는 것이 좋다. 사용자 에이전트가 주어진 링크 관계에 대해 지정된 MIME 유형을 지원하면 해당 외부 리소스 링크의 특정 유형에
지정된 적절한 시점에 링크된 리소스를 가져오고
처리하는 것이 좋다. 속성을 생략했고 외부 리소스 링크 유형에 기본 유형이
정의되어 있지 않지만, 유형이 알려져 있고 지원된다면 사용자 에이전트가
링크된 리소스를 가져오고
처리할 경우, 사용자 에이전트는 해당 리소스가 지원될 것이라고 가정하여
링크된 리소스를 가져오고
처리하는 것이 좋다.
사용자 에이전트는 type 속성을
권위 있는 것으로 간주해서는 안 된다. 리소스를 가져온 뒤 사용자 에이전트는 실제 유형을 결정할 때
type
속성을 사용해서는 안 된다. 앞에서 언급한 가정된 유형이 아니라 실제 유형
(다음 문단에 정의됨)만 리소스를 적용할지 결정하는 데 사용된다.
외부 리소스 링크 유형이 리소스의 Content-Type 메타데이터 처리 규칙을 정의하면 해당 규칙을 적용한다. 그렇지 않고 리소스가 이미지일 것으로 예상되면 사용자 에이전트는 리소스의 Content-Type 메타데이터에서 결정된 유형을 공식 유형으로 하여 이미지 스니핑 규칙을 적용하고, 그 결과인 리소스의 계산된 유형을 실제 유형인 것처럼 사용할 수 있다. 그렇지 않고 이러한 조건 중 어느 것도 적용되지 않거나 사용자 에이전트가 이미지 스니핑 규칙을 적용하지 않기로 선택한 경우, 사용자 에이전트는 리소스의 Content-Type 메타데이터를 사용하여 리소스 유형을 결정해야 한다. 유형 메타데이터가 없지만 외부 리소스 링크 유형에 기본 유형이 정의되어 있으면 사용자 에이전트는 리소스가 해당 유형이라고 가정해야 한다.
stylesheet
링크 유형은 리소스의 Content-Type 메타데이터 처리 규칙을
정의한다.
사용자 에이전트가 리소스의 유형을 확정한 뒤에는 지원되는 유형이고 다른 관련 조건이 적용되면 리소스를 적용해야 하며, 그렇지 않으면 리소스를 무시해야 한다.
문서에 다음과 같이 표시된 스타일시트 링크가 포함되어 있다고 하자:
< link rel = "stylesheet" href = "A" type = "text/plain" >
< link rel = "stylesheet" href = "B" type = "text/css" >
< link rel = "stylesheet" href = "C" >
그러면 CSS 스타일시트만 지원하는 적합한 사용자 에이전트는 B와 C 파일을 가져오고 A 파일은
건너뛴다(text/plain은
CSS 스타일시트의 MIME 유형이 아니기 때문이다).
그런 다음 B와 C 파일에 대해서는 서버가 반환한 실제 유형을 확인한다. text/css로 전송된
파일에는 스타일을 적용하지만, text/plain
또는 다른 유형으로 표시된 파일에는 적용하지 않는다.
두 파일 중 하나가 Content-Type 메타데이터 없이
반환되거나
Content-Type: "null"처럼 구문적으로 잘못된 유형과 함께 반환되면 stylesheet
링크의 기본 유형이 적용된다. 해당 기본 유형은 text/css이므로
스타일시트는 그럼에도 적용된다.
link
요소에서 리소스 가져오기 및 처리모든 외부 리소스 링크에는
link
요소 el을 받는 링크된 리소스 가져오기 및
처리 알고리즘이 있다. 또한 link
요소 el과 요청 request를 받는
링크된 리소스 가져오기 설정 단계도 있다.
개별 링크 유형은 자체 링크된
리소스 가져오기 및 처리 알고리즘을 제공할 수 있지만, 명시적으로 달리 기술하지 않으면
기본
링크된 리소스 가져오기 및 처리 알고리즘을 사용한다. 마찬가지로 개별 링크 유형은 자체
링크된 리소스
가져오기 설정 단계를 제공할 수 있지만, 명시적으로 달리 기술하지 않으면 이 단계는 단순히 true를
반환한다.
link
요소 el이 주어졌을 때 기본 링크된 리소스 가져오기 및 처리는
다음과 같다:
options를 el에서 링크 옵션을 생성한 결과로 둔다.
request를 options가 주어졌을 때 링크 요청을 생성한 결과로 둔다.
request가 null이면 반환한다.
request의 동기 플래그를 설정한다.
el과 request가 주어졌을 때 링크된 리소스 가져오기 설정 단계를 실행한다. 결과가 false이면 반환한다.
el의 rel
속성에 stylesheet
키워드가 포함되어 있으면 request의 개시자 유형을 "css"로 설정하고,
그렇지 않으면 "link"로 설정한다.
응답 response와 null, 실패 또는 바이트 시퀀스 bodyBytes가 주어졌을 때 다음 단계로 processResponseConsumeBody를 설정하여 request를 가져온다:
success를 true로 둔다.
다음 중 하나라도 참이면:
success를 false로 설정한다.
CSS 구문 분석 오류나 PNG 디코딩 오류 같은 콘텐츠별 오류는 success에 영향을 주지 않는다는 점에 유의한다.
그렇지 않으면 링크 리소스의 중요 하위 리소스가 로드를 마칠 때까지 기다린다.
링크 유형의 중요 하위 리소스를 정의하는 명세(예: CSS)는 이러한 하위 리소스를 가져오고 처리하는 방법을 설명할 것으로 예상된다. 하지만 현재는 이것이 명시적이지 않으므로, 이 명세에서는 올바르게 수행될 것이라는 전제 아래 링크 리소스의 중요 하위 리소스를 가져오고 처리할 때까지 기다리는 것으로 설명한다.
el, success, response 및 bodyBytes가 주어졌을 때 링크된 리소스를 처리한다.
링크 처리 옵션 options가 주어졌을 때 링크 요청을 생성하려면:
url을 options의 기준 URL에 상대적인 options의 href가 주어졌을 때 URL을 인코딩 구문 분석한 결과로 둔다.
문서 또는 환경 대신 기준 URL을 전달하는 문제는 이슈 #9715에서 추적한다.
url이 실패이면 null을 반환한다.
request를 url, options의 대상 및 options의 crossorigin이 주어졌을 때 잠재적 CORS 요청을 생성한 결과로 둔다.
request의 암호학적 논스 메타데이터를 options의 암호학적 논스 메타데이터로 설정한다.
request를 반환한다.
사용자 에이전트는 적용되지 않은 모든 외부 리소스를 사전에 가져오는 대신 필요한 경우에만 그러한 리소스를 가져오고 처리하도록 선택할 수 있다.
링크된
리소스 가져오기 및 처리 알고리즘과 마찬가지로 모든 외부 리소스 링크에는
link
요소 el, 불리언 success, 응답 response 및 바이트 시퀀스
bodyBytes를 받는
링크된 리소스 처리 알고리즘이 있다. 개별 링크 유형은
자체 링크된 리소스
처리 알고리즘을 제공할 수 있지만, 명시적으로 달리 기술하지 않으면 해당 알고리즘은 아무 작업도
하지 않는다.
주어진 rel
키워드에 대해 달리 지정하지 않는 한, 요소는 링크된
리소스를 가져오고 처리하려는 모든 시도와 그 중요 하위 리소스의
처리가 완료될 때까지 요소의 노드 문서의 load
이벤트를
지연해야 한다. (예를 들어 리소스가 필요해질 때까지 기다리고 있어서 사용자 에이전트가 아직 가져오고
처리하려고 시도하지 않은 리소스는 load 이벤트를
지연하지 않는다.)
Link`
헤더 처리외부 리소스 링크가 될 수 있는 모든 링크
유형은
링크 처리 옵션을 받는
링크 헤더 처리 알고리즘을 정의한다. 이 알고리즘은 HTTP
`Link`
응답 헤더에 나타날 때 링크 유형이 반응하는지 여부와 그 방법을 정의한다.
대부분의 링크 유형에서 이 알고리즘은 아무 작업도 하지 않는다. 링크 유형에 링크 헤더 처리 단계가 정의되어 있는지 빠르게 확인하려면 요약 표가 유용하다.
link")DocumentDocument를 받는 알고리즘자동)
링크 처리 옵션이 구문 분석된 URL 대신 기준 URL과 href를 가지는 이유는 URL이 옵션의 소스 집합에서 나온 결과일 수 있기 때문이다.
link 요소
el이 주어졌을 때 요소에서 링크 옵션을
생성하려면:
document를 el의 노드 문서로 둔다.
options를 다음 항목을 가진 새로운 링크 처리 옵션으로 둔다.
crossorigin
콘텐츠 속성의 상태referrerpolicy
콘텐츠 속성의 상태fetchpriority
콘텐츠 속성의 상태el에 integrity
속성이 있으면 options의 integrity를 el의 integrity
콘텐츠 속성 값으로 설정한다.
단언: options의 href가 빈 문자열이 아니거나 options의 소스 집합이 null이 아니다.
link 요소에
href와
imagesrcset
속성이 모두 없으면 링크를 나타내지 않는다.
options를 반환한다.
헤더 목록 headers가 주어졌을 때 헤더에서 링크를 추출하려면:
Document
doc, 응답 response 및
"pre-media" 또는 "media" phase가 주어졌을 때
링크 헤더를 처리하려면:
links의 각 linkObject에 대해 반복한다:
rel을 linkObject["relation_type"]으로 둔다.
attribs를 linkObject["target_attributes"]로 둔다.
"srcset",
"imagesrcset"
또는 "media" 중 하나가
attribs에 존재하면
expectedPhase를
"media"로 두고, 그렇지 않으면 "pre-media"로 둔다.
expectedPhase가 phase가 아니면 계속한다.
options를 다음 항목을 가진 새로운 링크 처리 옵션으로 둔다.
attribs와 rel이 주어졌을 때 options에 구문 분석된 헤더 속성의 링크 옵션을 적용한다. 반환값이 false이면 반환한다.
attribs["imagesrcset"]가
존재하고 attribs["imagesizes"]가
존재하면 options의
소스 집합을
linkObject["target_uri"], attribs["imagesrcset"],
attribs["imagesizes"]
및 null이 주어졌을 때 소스 집합을
생성한 결과로 설정한다.
options가 주어졌을 때 rel에 대한 링크 헤더 처리 단계를 실행한다.
attribs와 문자열 rel이 주어졌을 때 링크 처리 옵션 options에 구문 분석된 헤더 속성의 링크 옵션을 적용하려면:
rel이 "preload"이면:
attribs["crossorigin"]가
존재하고 CORS 설정 속성
키워드 중 하나와 ASCII
대소문자를 구분하지 않고 일치하면
options의 crossorigin을 해당 키워드에 대응하는
CORS 설정 속성 상태로
설정한다.
attribs["integrity"]가
존재하면 options의
integrity를
attribs["integrity"]로
설정한다.
attribs["referrerpolicy"]가
존재하고 어떤 리퍼러 정책과 ASCII
대소문자를 구분하지 않고 일치하면
options의 리퍼러 정책을 해당
리퍼러 정책으로 설정한다.
attribs["nonce"]가
존재하면 options의
nonce를
attribs["nonce"]로
설정한다.
attribs["type"]이
존재하면 options의
type을
attribs["type"]으로 설정한다.
attribs["fetchpriority"]가
존재하고 가져오기 우선순위 속성 키워드와
ASCII
대소문자를 구분하지 않고 일치하면
options의 가져오기 우선순위를 해당
가져오기 우선순위 속성
키워드로 설정한다.
true를 반환한다.
조기 힌트를 사용하면 서버가 내비게이션 요청을 완전히 처리하여 응답 코드를 제공하기 전에 사용자 에이전트가 문서에서 사용될 가능성이 있는 리소스를 추측하여 로드하는 등의 작업을 수행할 수 있다. 서버는 최종 응답을 제공하기 전에 103 상태 코드의 응답을 제공하여 조기 힌트를 표시할 수 있다.[RFC8297]
호환성을 위해 조기 힌트는 일반적으로 HTTP/2 이상을 통해 전달되지만, 가독성을 위해 아래에서는 HTTP/1.1 스타일 표기법을 사용한다.
예를 들어 다음과 같은 응답 시퀀스가 주어지면:
103 Early Hint Link: </image.png>; rel=preload; as=image
200 OK Content-Type: text/html <!DOCTYPE html> ... <img src="/image.png">
HTML 콘텐츠가 도착하기 전에 이미지 로드가 시작된다.
내비게이션 중 제공되는 첫 번째 조기 힌트 응답만 처리하며, 그 뒤에 교차 출처 리디렉션이 이어지면 이를 폐기한다.
`Link`
헤더 외에도 103 응답에는 콘텐츠 보안 정책 헤더가 포함될 수 있으며,
조기 힌트를 처리할 때 이 정책을 적용한다.
예를 들어 다음과 같은 응답 시퀀스가 주어지면:
103 Early Hint Content-Security-Policy: style-src: self; Link: </style.css>; rel=preload; as=style
103 Early Hint Link: </image.png>; rel=preload; as=image
302 Redirect Location: /alternate.html
200 OK Content-Security-Policy: style-src: none; Link: </font.ttf>; rel=preload; as=font
최종 리디렉션 체인에서 첫 번째 조기 힌트 응답만 따르므로 글꼴과 스타일은 로드되고 이미지는 폐기된다. 뒤의 콘텐츠 보안 정책 헤더는 스타일을 가져오기 위한 요청이 이미 수행된 뒤에 오지만, 해당 스타일은 문서에서 접근할 수 없다.
응답 response와 환경 reservedEnvironment가 주어졌을 때 조기 힌트 헤더를 처리하려면:
조기 힌트의 `Link`
헤더는 항상 최종 응답의 `Link`
헤더보다 먼저 처리되며, 그 뒤에 link 요소를 처리한다.
이는 조기 힌트와 최종 응답의 `Link`
헤더 콘텐츠를 각각의 순서대로 Document의 head 요소 앞에 추가하는 것과
동등하다.
earlyPolicyContainer를 response와 reservedEnvironment가 주어졌을 때 가져오기 응답에서 정책 컨테이너를 생성한 결과로 둔다.
earlyHints를 빈 목록으로 둔다.
links의 각 linkObject에 대해 반복한다:
조기 힌트 링크 헤더를 받는 순간 earlyRequest를
가져오기 시작한다. Document가 생성되기 전에 결과가
반환되면 earlyResponse를 해당 가져오기의 응답으로 설정하고, Document가 생성되면 이를 커밋한다
(link 요소인 것처럼
미리 로드된 리소스의 맵에서 사용할 수 있게
한다).
Document가 먼저 생성되면
응답을 사용할 수 있게 되는 즉시 커밋한다.
rel을 linkObject["relation_type"]으로 둔다.
options를 다음 항목을 가진 새로운 링크 처리 옵션으로 둔다.
attribs를 linkObject["target_attributes"]로 둔다.
조기 힌트 처리의 일부로는 as,
crossorigin,
integrity 및
type 속성만 처리한다.
특히 blocking,
imagesrcset,
imagesizes 및
media 같은 다른 속성은
Document가 생성된 뒤에만
적용된다.
attribs와 rel이 주어졌을 때 options에 구문 분석된 헤더 속성의 링크 옵션을 적용한다. 반환값이 false이면 반환한다.
options가 주어졌을 때 rel에 대한 링크 헤더 처리 단계를 실행한다.
options를 earlyHints에 추가한다.
Document
doc가 주어졌을 때 다음 하위 단계를 반환한다: earlyHints의 각
options에 대해 반복한다:
options의 문서 준비 시 실행이 null이면 options의 문서를 doc로 설정한다.
그렇지 않으면 doc를 사용하여 options의 문서 준비 시 실행을 호출한다.
link
요소를 사용하여 생성된 하이퍼링크를 사용자가 따라갈 수 있는 수단 제공
대화형 사용자 에이전트는 사용자 인터페이스의 어딘가에서 사용자가 link
요소를 사용하여 생성된 하이퍼링크를
따라갈 수 있는 수단을 제공할 수 있다. 이러한 하이퍼링크
따라가기 알고리즘 호출은 userInvolvement 인수를 "browser UI"로
설정해야 한다. 정확한 인터페이스는 이 명세에서 정의하지 않지만, 문서의 각 link
요소로 생성된 각 하이퍼링크에
대해 다음 정보를 어떠한 형태로든(단순화될 수도 있음) 포함할 수 있다
(다시 말해 아래에 정의된 대로 요소의 속성에서 가져온다):
rel
속성으로 제공됨)title
속성으로 제공됨).href
속성으로 제공됨).hreflang
속성으로 제공됨).media
속성으로 제공됨).사용자 에이전트는 리소스의 유형(type
속성으로 제공됨)과 같은 다른 정보도 포함할 수 있다.
meta
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
itemprop
속성이 있는 경우: 플로 콘텐츠.itemprop
속성이 있는 경우: 구문 콘텐츠.
charset 속성이
있거나 요소의 http-equiv 속성이
인코딩 선언
상태인 경우: head 요소 내부.
http-equiv
속성이 있지만 인코딩
선언 상태가 아닌 경우: head 요소
내부.http-equiv
속성이 있지만 인코딩
선언 상태가 아닌 경우: head 요소의
자식인
noscript 요소
내부.
name 속성이 있는 경우:
메타데이터 콘텐츠가 예상되는 곳.
itemprop
속성이 있는 경우: 메타데이터
콘텐츠가 예상되는 곳.itemprop
속성이 있는 경우: 구문
콘텐츠가 예상되는 곳.name — 메타데이터 이름
http-equiv —
프래그마 지시문
content — 요소의 값
charset — 문자 인코딩
선언
media — 적용 대상 미디어
[Exposed =Window ]
interface HTMLMetaElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , Reflect ] attribute DOMString name ;
[CEReactions , Reflect="http-equiv"] attribute DOMString httpEquiv ;
[CEReactions , Reflect ] attribute DOMString content ;
[CEReactions , Reflect ] attribute DOMString media ;
// also has obsolete members
};
meta 요소는 title, base, link, style 및
script 요소를
사용하여 표현할 수 없는 다양한 종류의 메타데이터를 나타낸다.
meta 요소는
name 속성을 사용하여
문서 수준 메타데이터를, http-equiv
속성을 사용하여 프래그마 지시문을, HTML 문서를 문자열 형태로 직렬화할 때
(예: 네트워크를 통한 전송이나 디스크 저장) charset 속성을 사용하여
파일의 문자 인코딩 선언을
나타낼 수 있다.
name, http-equiv, charset 및 itemprop
속성 중 정확히 하나를 지정해야 한다.
name, http-equiv 또는 itemprop
중 하나를 지정하면 content 속성도
지정해야 한다. 그렇지 않으면 생략해야 한다.
charset
속성은 문서에서 사용하는 문자 인코딩을 지정한다.
이는 문자 인코딩 선언이다.
속성이 있으면 그 값은
문자열 "utf-8"과 ASCII 대소문자를
구분하지 않고 일치해야 한다.
meta 요소의
charset 속성은
XML 문서에서는 아무런 효과가 없지만, XML로의 마이그레이션과 XML에서의 마이그레이션을 쉽게 하기 위해
XML 문서에서도 허용된다.
문서당 charset 속성을 가진
meta 요소는 하나를
초과해서는 안 된다.
content 속성은 요소가 문서
메타데이터나 프래그마
지시문에 사용될 때 그 값을 제공한다. 허용되는 값은 이 명세의 뒤 절에서 설명하는 정확한 맥락에 따라
달라진다.
meta 요소에
name 속성이
있으면 문서 메타데이터를 설정한다. 문서 메타데이터는 이름-값 쌍으로 표현되며, meta 요소의 name 속성이 이름을 제공하고
같은 요소의 content 속성이 값을
제공한다. 이름은 설정하는 메타데이터의 측면을 지정하며, 유효한 이름과 그 값의 의미는 다음 절에서 설명한다.
meta 요소에 content 속성이 없으면
메타데이터 이름-값 쌍의 값 부분은 빈 문자열이다.
media 속성은 메타데이터가 적용되는
미디어를 나타낸다.
값은 유효한 미디어 쿼리 목록이어야 한다.
name이 theme-color가 아닌 한
media
속성은 처리 모델에 아무런 영향을 주지 않으며 작성자가 사용해서는 안 된다.
현재의 모든 엔진에서 지원된다.
이 명세는 meta
요소의 name
속성에 사용할 몇 가지 이름을 정의한다.
이름은 대소문자를 구분하지 않는다. 따라서 ASCII 대소문자를 구분하지 않는 방식으로 비교해야 한다.
application-name값은 페이지가 나타내는 웹 애플리케이션의 이름을 제공하는 짧은 자유 형식 문자열이어야 한다.
페이지가 웹 애플리케이션이 아니면 application-name
메타데이터 이름을 사용해서는 안 된다. 웹 애플리케이션 이름의 번역을 제공할 수 있으며, 각 이름의
언어는 lang 속성으로
지정한다.
문서당 주어진 언어를 가지며
name
속성 값이 application-name과
ASCII
대소문자를 구분하지 않고 일치하는 meta 요소는
하나를 초과해서는 안 된다.
페이지의 title에는
단순한 애플리케이션 이름 대신 특정 시점의 페이지 상태와 관련된 상태 메시지 등이 포함될 수 있으므로,
사용자 에이전트는 사용자 인터페이스에서 페이지의 제목보다 애플리케이션 이름을 우선하여 사용할 수 있다.
정렬된 언어 목록(예: 영국 영어, 미국 영어 및 영어)이 주어졌을 때 사용할 애플리케이션 이름을 찾으려면 사용자 에이전트는 다음 단계를 실행해야 한다:
languages를 언어 목록으로 둔다.
default language를 Document의
문서 요소가 존재하고 그 언어를 알 수 없는 상태가
아니라면 해당 요소의 언어로 둔다.
default language가 있고 languages의 어떤 언어와도 같은 언어가 아니면 이를 languages에 추가한다.
winning language를 languages의 언어 중 Document에
name
속성 값이 application-name과
ASCII 대소문자를 구분하지 않고 일치하며
언어가 해당 언어인 meta
요소가 존재하는 첫 번째 언어로 둔다.
어떤 언어에도 그러한 meta 요소가
없으면 반환한다. 제공된 애플리케이션 이름이 없는 것이다.
Document에서
name
속성 값이 application-name과
ASCII 대소문자를 구분하지 않고 일치하고
언어가
winning language인 트리 순서상 첫 번째
meta
요소의 content
속성 값을 반환한다.
이 알고리즘은 브라우저가 예를 들어 북마크에 레이블을 지정하기 위해 페이지의 이름이 필요할 때 사용한다. 알고리즘에 제공하는 언어는 사용자가 선호하는 언어이다.
author값은 페이지 작성자 중 한 명의 이름을 제공하는 자유 형식 문자열이어야 한다.
description
값은 페이지를 설명하는 자유 형식 문자열이어야 한다. 값은 검색 엔진과 같은 페이지 디렉터리에서
사용하기에 적합해야 한다. 문서당 name
속성 값이
description과
ASCII
대소문자를 구분하지 않고 일치하는 meta 요소는
하나를 초과해서는 안 된다.
generator값은 문서를 생성하는 데 사용된 소프트웨어 패키지 중 하나를 식별하는 자유 형식 문자열이어야 한다. 이 값은 마크업이 소프트웨어로 생성되지 않은 페이지, 예를 들어 사용자가 텍스트 편집기에서 직접 마크업을 작성한 페이지에는 사용해서는 안 된다.
"Frontweaver"라는 도구는 페이지를 생성하는 데 사용된 도구임을 식별하기 위해 출력의 페이지
head 요소에
다음을 포함할 수 있다:
< meta name = generator content = "Frontweaver 8.2" >
keywords값은 쉼표로 구분된 토큰 집합이어야 하며, 각 토큰은 페이지와 관련된 키워드이다.
영국 고속도로의 서체에 관한 이 페이지는 사용자가 페이지를 찾을 때 사용할 수 있는 몇 가지
키워드를 지정하기 위해 meta
요소를
사용한다:
<!DOCTYPE HTML>
< html lang = "en-GB" >
< head >
< title > Typefaces on UK motorways</ title >
< meta name = "keywords" content = "british,type face,font,fonts,highway,highways" >
</ head >
< body >
...
많은 검색 엔진은 이러한 키워드를 고려하지 않는다. 이 기능은 역사적으로 사용자에게 도움이 되지 않는 방식으로 검색 엔진 결과를 스팸 처리하기 위해 신뢰할 수 없거나 오해를 일으키는 방식으로 사용되어 왔기 때문이다.
작성자가 페이지에 적용된다고 지정한 키워드 목록을 얻으려면 사용자 에이전트는 다음 단계를 실행해야 한다:
값의 신뢰성이 충분히 확실하지 않으면 사용자 에이전트는 이 정보를 사용하지 않는 것이 좋다.
예를 들어 콘텐츠 관리 시스템이 시스템 내 페이지의 키워드 정보를 사용하여 사이트 전용 검색 엔진의 색인을 채우는 것은 합리적일 수 있지만, 이 정보를 사용하는 대규모 콘텐츠 집계자는 특정 사용자가 부적절한 키워드를 사용하여 순위 메커니즘을 조작하려고 한다는 사실을 발견할 가능성이 높다.
referrer값은 Document의 기본
리퍼러
정책을 정의하는 리퍼러
정책이어야 한다. [REFERRERPOLICY]
meta 요소
element가 문서에 삽입되거나 그 name 또는 content
속성이 변경될 때마다 사용자 에이전트는 다음 알고리즘을 실행해야 한다:
element가 문서 트리 안에 있지 않으면 반환한다.
element에 값이 "referrer"와
ASCII 대소문자를 구분하지 않고 일치하는 name
속성이 없으면 반환한다.
element에 content
속성이 없거나 해당 속성 값이 빈 문자열이면 반환한다.
value를 element의 content
속성 값을 ASCII 소문자로 변환한 결과로 둔다.
value가 다음 표의 첫 번째 열에 제시된 값 중 하나이면 value를 두 번째 열에 제시된 값으로 설정한다:
| 레거시 값 | 리퍼러 정책 |
|---|---|
never
|
no-referrer
|
default
|
기본 리퍼러 정책 |
always
|
unsafe-url
|
origin-when-crossorigin
|
origin-when-cross-origin
|
value가 리퍼러 정책이면 element의 노드 문서의 정책 컨테이너의 리퍼러 정책을 policy로 설정한다.
역사적인 이유로 다른 표준 메타데이터 이름과 달리 referrer의 처리 모델은
요소 제거에 반응하지 않으며 트리 순서도 사용하지 않는다. 이
상태에서 가장 최근에 삽입되거나
가장 최근에 수정된 meta
요소만
영향을 준다.
theme-color
값은 CSS <color> 생성 규칙과 일치하는 문자열이어야 하며, 사용자 에이전트가 페이지나 주변 사용자 인터페이스의 표시를 사용자 정의할 때 사용해야 하는 권장 색상을 정의한다. 예를 들어 브라우저는 페이지의 제목 표시줄을 지정된 값으로 칠하거나 탭 표시줄 또는 작업 전환기에서 강조 색상으로 사용할 수 있다.
HTML 문서 내에서 name 속성
값이
theme-color와
ASCII
대소문자를 구분하지 않고 일치하는 모든
meta
요소에서 media 속성 값은
고유해야 한다.
이 표준 자체는 "WHATWG green"을 테마 색상으로 사용한다:
<!DOCTYPE HTML>
< title > HTML Standard</ title >
< meta name = "theme-color" content = "#3c790a" >
...
media 속성을
사용하여 제공된 색상을 사용해야 하는 맥락을 설명할 수 있다.
어두운 모드에서만 "WHATWG green"을 이 표준의 테마 색상으로 사용하려면
prefers-color-scheme 미디어 기능을 사용할 수 있다:
<!DOCTYPE HTML>
< title > HTML Standard</ title >
< meta name = "theme-color" content = "#3c790a" media = "(prefers-color-scheme: dark)" >
...
페이지의 테마 색상을 얻으려면 사용자 에이전트는 다음 단계를 실행해야 한다:
candidate elements를 다음 기준을 충족하는 모든 meta
요소의 트리 순서 목록으로 둔다:
요소가 문서 트리 안에 있다;
요소에 값이 theme-color와
ASCII 대소문자를 구분하지 않고 일치하는
name 속성이
있다; 그리고
요소에 content
속성이 있다.
candidate elements의 각 element에 대해:
아무것도 반환하지 않는다(페이지에 테마 색상이 없다).
meta
요소가 문서에 삽입되거나
문서에서
제거되거나, 기존
meta
요소의 name, content 또는
media 속성이
변경되거나, 환경이 변경되어 어떤 meta 요소의
media
속성 값이 이제 환경과 일치하거나
더 이상 일치하지 않을 수
있게 되면 사용자 에이전트는 위 알고리즘을 다시 실행하고 그 결과를 영향을 받는 모든 사용자
인터페이스에 적용해야 한다.
사용자 인터페이스에서 테마 색상을 사용할 때 사용자 에이전트는 해당 사용자 인터페이스에 더 적합하도록 구현별 방식으로 색상을 조정할 수 있다. 예를 들어 사용자 에이전트가 테마 색상을 배경으로 사용하고 그 위에 흰색 텍스트를 표시하려는 경우, 충분한 대비를 보장하기 위해 사용자 인터페이스의 해당 부분에서 테마 색상의 더 어두운 변형을 사용할 수 있다.
color-scheme
페이지의 모든 CSS가 로드될 때까지 기다리지 않고 사용자 에이전트가 원하는 색상 스킴으로 페이지
배경을 즉시 렌더링할 수 있도록 meta 요소에
'color-scheme' 값을 제공할 수 있다.
값은 CSS 'color-scheme' 속성 값의 구문과 일치하는 문자열이어야 한다. 이는 페이지에서 지원하는 색상 스킴을 결정한다.
문서당 name
속성 값이 color-scheme과
ASCII
대소문자를 구분하지 않고 일치하는 meta 요소는
하나를 초과해서는 안 된다.
다음 선언은 페이지가 어두운 배경색과 밝은 전경색을 사용하는 색상 스킴을 인식하고 처리할 수 있음을 나타낸다:
< meta name = "color-scheme" content = "dark" >
페이지에서 지원하는 색상 스킴을 얻으려면 사용자 에이전트는 다음 단계를 실행해야 한다:
candidate elements를 다음 기준을 충족하는 모든 meta
요소의 트리 순서 목록으로 둔다:
요소가 문서 트리 안에 있다;
요소에 값이 color-scheme과
ASCII 대소문자를 구분하지 않고 일치하는
name 속성이
있다; 그리고
요소에 content
속성이 있다.
candidate elements의 각 element에 대해:
content
속성 값이 주어졌을 때 컴포넌트 값 목록을 구문 분석한 결과로 둔다.
null을 반환한다.
meta
요소가 문서에 삽입되거나
문서에서 제거되거나, 기존
meta
요소의 name 또는 content
속성이 변경되면 사용자 에이전트는 위 알고리즘을 다시 실행해야 한다.
이 규칙은 일치 항목을 찾을 때까지 연속된 요소를 검사하므로, 작성자는 레거시 사용자
에이전트를 위한 대체 값을 처리하도록 이러한 값을 여러 개 제공할 수 있다. CSS 속성의 대체가 작동하는
방식과 반대로 여러 meta 요소에서는 레거시 값을 새로운 값 뒤에 배치해야 한다.
누구나 자신만의 미리 정의된 메타데이터 이름 집합의 확장을 만들고 사용할 수 있다. 이러한 확장을 등록할 필요는 없다.
하지만 다음 중 어느 하나에 해당하는 경우에는 새 메타데이터 이름을 만들지 않는 것이 좋다:
이름이 URL이거나 함께 제공되는 content 속성 값이
URL인 경우. 이러한 경우 새 메타데이터 이름을 만드는 대신
미리 정의된 링크 유형 집합의 확장으로
등록하는
것이 권장된다.
이름이 사용자 에이전트에서 처리 요구 사항을 가질 것으로 예상되는 항목을 위한 것인 경우. 이 경우 표준화해야 한다.
또한 새 메타데이터 이름을 만들고 사용하기 전에 WHATWG Wiki MetaExtensions 페이지를 확인하는 것이 권장된다. 이미 사용 중인 메타데이터 이름을 선택하거나, 이미 사용 중인 메타데이터 이름의 목적을 중복하거나, 새로 표준화된 이름이 선택한 이름과 충돌하는 일을 피할 수 있기 때문이다. [WHATWGWIKI]
누구나 언제든지 WHATWG Wiki MetaExtensions 페이지를 편집하여 메타데이터 이름을 추가할 수 있다. 새 메타데이터 이름은 다음 정보와 함께 지정할 수 있다:
정의하려는 실제 이름. 이름은 정의된 다른 이름과 혼동될 정도로 유사해서는 안 된다 (예: 대소문자만 다른 경우).
값에 요구되는 형식을 포함하여 메타데이터 이름의 의미를 설명하는 짧은 비규범적 설명.
처리 요구 사항이 정확히 같은 다른 이름의 목록. 작성자는 동의어로 정의된 이름을 사용하지 않는 것이 좋다(이 이름은 사용자 에이전트가 레거시 콘텐츠를 지원할 수 있도록 하기 위한 것일 뿐이다). 실제로 사용되지 않는 동의어는 누구나 제거할 수 있다. 레거시 콘텐츠와의 호환성을 위해 동의어로 처리해야 하는 이름만 이러한 방식으로 등록해야 한다.
다음 중 하나:
메타데이터 이름이 기존 값과 중복되는 것으로 판명되면 제거하고 기존 값의 동의어로 나열하는 것이 좋다.
메타데이터 이름이 "제안됨" 상태로 추가된 뒤 한 달 이상 사용되거나 명시되지 않으면 WHATWG Wiki MetaExtensions 페이지에서 제거할 수 있다.
메타데이터 이름이 "제안됨" 상태로 추가되고 기존 값과 중복되는 것으로 판명되면 제거하고 기존 값의 동의어로 나열하는 것이 좋다. 메타데이터 이름이 "제안됨" 상태로 추가되고 유해한 것으로 판명되면 "중단됨" 상태로 변경하는 것이 좋다.
누구나 언제든지 상태를 변경할 수 있지만 위 정의에 따라서만 변경하는 것이 좋다.
http-equiv 속성이
meta 요소에 지정되면
해당 요소는 프래그마 지시문이다.
http-equiv
속성은 다음 키워드와 상태를 갖는 열거형 속성이다:
| 키워드 | 적합 | 상태 | 간략한 설명 |
|---|---|---|---|
content-language
|
아니요 | 콘텐츠 언어 | 프래그마로 설정된 기본 언어를 설정한다. |
content-type
|
인코딩 선언 | charset을 설정하는
대체 형식.
|
|
default-style
|
기본 스타일 | 기본 CSS 스타일시트 집합의 이름을 설정한다. | |
refresh
|
새로고침 | 시간이 지정된 리디렉션으로 동작한다. | |
set-cookie
|
아니요 | Set-Cookie | 아무런 효과가 없다. |
x-ua-compatible
|
X-UA-Compatible | 실제로는 Internet Explorer가 명세를 더 충실히 따르도록 유도한다. | |
content-security-policy
|
콘텐츠 보안 정책 | Document에 콘텐츠 보안 정책을 적용한다.
|
meta 요소가
문서에 삽입될
때, 해당 요소의 http-equiv
속성이 있고 위 상태 중 하나를 나타내면 사용자 에이전트는 다음 목록에서 설명하는 해당 상태에 적합한
알고리즘을 실행해야 한다:
http-equiv="content-language")
이 기능은 적합하지 않다. 작성자는 대신 lang 속성을 사용하는 것이 권장된다.
이 프래그마는 프래그마로 설정된 기본 언어를 설정한다. 이러한 프래그마가 성공적으로 처리되기 전까지는 프래그마로 설정된 기본 언어가 없다.
요소의 content 속성에
U+002C COMMA 문자(,)가 포함되어 있으면 반환한다.
input을 요소의 content 속성 값으로
둔다.
position이 input의 첫 번째 문자를 가리키도록 한다.
position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.
position이 주어졌을 때 input에서 ASCII 공백이 아닌 코드 포인트 시퀀스를 수집한다.
candidate를 이전 단계에서 얻은 문자열로 둔다.
candidate가 빈 문자열이면 반환한다.
프래그마로 설정된 기본 언어를 candidate로 설정한다.
값이 공백으로 구분된 여러 토큰으로 구성된 경우 첫 번째 토큰 뒤의 토큰은 무시된다.
이 프래그마는 같은 이름의 HTTP `Content-Language`
헤더와 거의 비슷해 보이지만 실제로는 전혀 다르다.
[HTTP]
http-equiv="content-type")
인코딩
선언 상태는 단지 charset 속성을
설정하는 대체 형식이다. 즉 문자 인코딩 선언이다. 이 상태의 사용자
에이전트 요구 사항은 모두 명세의 구문 분석 절에서 처리된다.
http-equiv
속성이 인코딩 선언 상태인 meta 요소에서
content 속성 값은
다음으로 구성된 문자열과 ASCII
대소문자를 구분하지 않고 일치해야 한다:
"text/html;", 선택적으로 임의 개수의 ASCII 공백, 그 뒤에
"charset=utf-8".
문서에는 http-equiv
속성이 인코딩 선언 상태인 meta 요소와
charset
속성이 있는 meta 요소를 모두
포함해서는 안 된다.
인코딩
선언 상태는
HTML 문서에서 사용할 수 있지만, 해당 상태의 http-equiv
속성이 있는 요소는 XML 문서에서 사용해서는 안 된다.
http-equiv="default-style")
하나의 엔진에서만 지원된다.
이 프래그마는 기본 CSS 스타일시트 집합의 이름을 설정한다.
요소의 content 속성
값을
이름으로 사용하여 선호하는 CSS 스타일시트 집합 이름을
변경한다.
[CSSOM]
http-equiv="refresh")
이 프래그마는 시간이 지정된 리디렉션으로 동작한다.
Document 객체에는 연관된
선언적으로 새로고침할 예정
(불리언)이 있다. 초기값은 false이다.
input을 요소의 content 속성 값으로
둔다.
meta
요소의 노드 문서, input 및 meta 요소를
사용하여 공유 선언적 새로고침 단계를 실행한다.
Document 객체
document, 문자열 input 및 선택적으로 meta 요소
meta가 주어졌을 때 공유 선언적 새로고침 단계는
다음과 같다:
document의 선언적으로 새로고침할 예정이 true이면 반환한다.
position이 input의 첫 번째 코드 포인트를 가리키도록 한다.
position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.
time을 0으로 둔다.
position이 주어졌을 때 input에서 ASCII 숫자인 코드 포인트 시퀀스를 수집하고, 그 결과를 timeString으로 둔다.
timeString이 빈 문자열이면:
position이 가리키는 input의 코드 포인트가 U+002E(.)가 아니면 반환한다.
그렇지 않으면 음이 아닌 정수 구문 분석 규칙을 사용하여 timeString을 구문 분석한 결과로 time을 설정한다.
position이 주어졌을 때 input에서 ASCII 숫자와 U+002E FULL STOP 문자(.)인 코드 포인트 시퀀스를 수집한다. 수집된 문자는 모두 무시한다.
urlRecord를 document의 URL로 둔다.
position이 input의 끝을 지나지 않았다면:
position이 가리키는 input의 코드 포인트가 U+003B(;), U+002C(,) 또는 ASCII 공백이 아니면 반환한다.
position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.
position이 가리키는 input의 코드 포인트가 U+003B(;) 또는 U+002C(,)이면 position을 다음 코드 포인트로 전진시킨다.
position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.
position이 input의 끝을 지나지 않았다면:
urlString을 position의 코드 포인트부터 문자열 끝까지의 input 부분 문자열로 둔다.
position이 가리키는 input의 코드 포인트가 U+0055(U) 또는 U+0075(u)이면 position을 다음 코드 포인트로 전진시킨다. 그렇지 않으면 따옴표 건너뛰기라고 표시된 단계로 이동한다.
position이 가리키는 input의 코드 포인트가 U+0052(R) 또는 U+0072(r)이면 position을 다음 코드 포인트로 전진시킨다. 그렇지 않으면 구문 분석이라고 표시된 단계로 이동한다.
position이 가리키는 input의 코드 포인트가 U+004C(L) 또는 U+006C(l)이면 position을 다음 코드 포인트로 전진시킨다. 그렇지 않으면 구문 분석이라고 표시된 단계로 이동한다.
position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.
position이 가리키는 input의 코드 포인트가 U+003D(=)이면 position을 다음 코드 포인트로 전진시킨다. 그렇지 않으면 구문 분석이라고 표시된 단계로 이동한다.
position이 주어졌을 때 input 내의 ASCII 공백을 건너뛴다.
따옴표 건너뛰기: position이 가리키는 input의 코드 포인트가 U+0027(') 또는 U+0022(")이면 quote를 해당 코드 포인트로 두고, position을 다음 코드 포인트로 전진시킨다. 그렇지 않으면 quote를 빈 문자열로 둔다.
urlString을 position의 코드 포인트부터 문자열 끝까지의 input 부분 문자열로 설정한다.
quote가 빈 문자열이 아니고 urlString에 quote와 같은 코드 포인트가 있으면, 해당 코드 포인트에서 urlString을 잘라 해당 코드 포인트와 그 뒤의 모든 코드 포인트를 제거한다.
구문 분석: urlString과 document를 기준으로 URL을 인코딩 구문 분석한 결과로 urlRecord를 설정한다.
urlRecord가 실패이면 반환한다.
urlRecord의 스킴이 "javascript"이면
반환한다.
document의 선언적으로 새로고침할 예정을 true로 설정한다.
다음 단계 중 하나 이상을 수행한다:
아래에서 정의하는 새로고침 시점이 도래한 후, 사용자가 리디렉션을 취소하지 않았고,
meta가 주어진 경우 document의 활성 샌드박싱 플래그 집합에
샌드박스된 자동 기능
브라우징 컨텍스트 플래그가 설정되어 있지 않으면, document를 사용하고
historyHandling을 "replace"로
설정하여 document의 노드
내비게이블을 urlRecord로
내비게이션한다.
앞 문단의 목적상 다음 두 조건 중 더 늦게 발생하는 조건이 발생하는 즉시 새로고침 시점이 도래한 것으로 간주한다:
여기서는 meta의 노드 문서가
아니라 document를 사용하는 것이
중요하다. 초기 단계 집합과 새로고침 시점 사이에 노드 문서가 변경되었을 수 있고,
meta는 항상 주어지는 것도 아니기 때문이다(HTTP `Refresh` 헤더의 경우).
선택할 경우 document를 사용하여 document의 노드 내비게이블을 urlRecord로 내비게이션하는 인터페이스를 사용자에게 제공한다.
아무 작업도 하지 않는다.
또한 사용자 에이전트는 다른 모든 경우와 마찬가지로 타이머 상태, 시간이 지정된 리디렉션의 목적지 등을 포함하여 동작의 모든 측면을 사용자에게 알릴 수 있다.
http-equiv
속성이 새로고침 상태인
meta 요소에서
content 속성 값은
다음 중 하나로 구성되어야 한다:
URL"과
ASCII 대소문자를 구분하지 않고 일치하는 부분 문자열,
그 뒤에 U+003D EQUALS SIGN 문자(=), 그 뒤에 리터럴 U+0027 APOSTROPHE(') 또는 U+0022
QUOTATION MARK(") 문자로 시작하지 않는 유효한 URL 문자열.
앞의 경우 정수는 페이지를 다시 로드하기 전의 초 수를 나타낸다. 뒤의 경우 정수는 주어진 URL의 페이지로 현재 페이지를 교체하기 전의 초 수를 나타낸다.
뉴스 기관의 첫 페이지는 5분마다 서버에서 페이지를 자동으로 다시 로드하기 위해 페이지의
head 요소에
다음 마크업을 포함할 수 있다:
< meta http-equiv = "Refresh" content = "300" >
각 페이지가 다음 페이지로 새로고침되도록 다음과 같은 마크업을 사용하면 일련의 페이지를 자동 슬라이드 쇼로 사용할 수 있다:
< meta http-equiv = "Refresh" content = "20; URL=page4.html" >
http-equiv="set-cookie")
이 프래그마는 적합하지 않으며 아무런 효과가 없다.
사용자 에이전트는 이 프래그마를 무시해야 한다.
http-equiv="x-ua-compatible")
실제로 이 프래그마는 Internet Explorer가 명세를 더 충실히 따르도록 유도한다.
http-equiv
속성이 X-UA-Compatible 상태인
meta 요소에서
content 속성 값은
문자열 "IE=edge"와 ASCII
대소문자를 구분하지 않고 일치해야 한다.
사용자 에이전트는 이 프래그마를 무시해야 한다.
http-equiv="content-security-policy")
이 프래그마는 Document에 콘텐츠 보안 정책을 적용한다. [CSP]
meta 요소의
content 속성
값에 대해, 소스를 "meta"로 하고 처리 방식을 "enforce"로 하여 콘텐츠 보안 정책의
직렬화된 콘텐츠 보안 정책 구문
분석 알고리즘을 실행한 결과로 policy를 둔다.
policy에서 report-uri,
frame-ancestors
및 sandbox
지시문의 모든 항목을 제거한다.
policy 정책을 적용한다.
http-equiv
속성이 콘텐츠 보안 정책 상태인
meta 요소에서
content 속성 값은
유효한
콘텐츠 보안 정책으로 구성되어야 하지만
report-uri,
frame-ancestors
또는 sandbox
지시문을 포함해서는 안 된다.
content 속성으로
주어진 콘텐츠 보안 정책은 현재 문서에 적용된다. [CSP]
meta 요소를
문서에
삽입하는 시점에는 일부 리소스가 이미 가져와졌을 수 있다. 예를 들어 http-equiv
속성이 콘텐츠 보안 정책 상태인
meta 요소를
동적으로 삽입하기 전에 이미지가 사용 가능한
이미지 목록에 저장되어 있을 수 있다.
이미 가져온 리소스는 늦게 적용된 콘텐츠 보안 정책에 의해 차단된다고 보장할 수 없다.
페이지는 다음과 같은 정책을 사용하여 인라인 JavaScript 실행을 방지하고 모든 플러그인 콘텐츠를 차단함으로써 교차 사이트 스크립팅 공격의 위험을 완화할 수 있다:
< meta http-equiv = "Content-Security-Policy" content = "script-src 'self'; object-src 'none'" >
문서에는 특정 상태를 가진 meta 요소가 동시에
하나를
초과해서는 안 된다.
문자 인코딩 선언은 문서를 저장하거나 전송하는 데 사용되는 문자 인코딩을 지정하는 메커니즘이다.
Encoding 표준은 UTF-8
문자 인코딩을
사용하도록 요구하며, 이를 식별하기
위해 "utf-8" 인코딩 레이블을 사용하도록 요구한다. 이러한 요구 사항으로 인해
문서에 문자 인코딩 선언이 있으면
"utf-8"과 ASCII 대소문자를
구분하지 않고 일치하는 인코딩 레이블을 지정해야 한다. 문자 인코딩 선언이 있는지 여부와 관계없이 문서를
인코딩하는 데 실제로 사용하는 문자 인코딩은 UTF-8이어야 한다. [ENCODING]
위 규칙을 강제하기 위해 작성 도구는 새로 생성한 문서에 기본적으로 UTF-8을 사용해야 한다.
다음 제한 사항도 적용된다:
또한 meta 요소에 대한 여러
제한으로 인해 문서당 meta 기반 문자 인코딩 선언은
하나만 있을 수 있다.
HTML 문서가 BOM으로 시작하지 않고, 그 인코딩이 Content-Type 메타데이터로 명시적으로 제공되지 않았으며,
문서가 iframe
srcdoc 문서가 아니면
인코딩은 charset 속성이
있는 meta 요소 또는
http-equiv 속성이
인코딩 선언 상태인 meta 요소를 사용하여 지정해야 한다.
모든 문자가 ASCII 범위에 있더라도 사용자에 의해 폼에 입력되는 비ASCII 문자, 스크립트로 생성된 URL 등을 처리하려면 문자 인코딩이 필요하므로 Content-Type 메타데이터 또는 파일 내 명시적 선언으로 문자 인코딩 선언을 제공해야 한다.
UTF-8이 아닌 인코딩을 사용하면 기본적으로 문서의 문자 인코딩을 사용하는 폼 제출 및 URL 인코딩에서 예상하지 못한 결과가 발생할 수 있다.
문서가 iframe
srcdoc 문서이면
문서에는 문자 인코딩 선언이 있어서는 안
된다.
(이 경우 소스는 iframe을 포함한 문서의 일부이므로
이미 디코딩되어 있다.)
XML에서는 필요하다면 인라인 문자 인코딩 정보에 XML 선언을 사용하는 것이 좋다.
HTML에서 문자 인코딩이 UTF-8임을 선언하려면 작성자는 문서 상단 근처의 head 요소에 다음 마크업을
포함할 수 있다:
< meta charset = "utf-8" >
XML에서는 대신 마크업의 맨 위에서 XML 선언을 사용한다:
<?xml version="1.0" encoding="utf-8"?>
style
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
head 요소의 자식인
noscript
요소 내부.
media — 적용 대상 미디어
blocking —
요소가 잠재적으로 렌더링을 차단하는지
여부
title 속성은
이 요소에서 특별한 의미 체계를 가진다:
CSS 스타일시트 집합 이름
[Exposed =Window ]
interface HTMLStyleElement : HTMLElement {
[HTMLConstructor ] constructor ();
attribute boolean disabled ;
[CEReactions , Reflect ] attribute DOMString media ;
[SameObject , PutForwards =value , Reflect ] readonly attribute DOMTokenList blocking ;
// also has obsolete members
};
HTMLStyleElement includes LinkStyle ;
style 요소를 사용하면
작성자는 문서에 CSS 스타일시트를 임베딩할 수 있다.
style 요소는
스타일링 처리 모델에 대한 여러 입력 중 하나이다. 이 요소는 사용자에게 제공되는 콘텐츠를
나타내지 않는다.
현재의 모든 엔진에서 지원된다.
disabled getter 단계는 다음과 같다:
this에 연관된 CSS 스타일시트가 없으면 false를 반환한다.
this의 연관된 CSS 스타일시트의 비활성화 플래그가 설정되어 있으면 true를 반환한다.
false를 반환한다.
disabled setter
단계는 다음과 같다:
this에 연관된 CSS 스타일시트가 없으면 반환한다.
주어진 값이 true이면 this의 연관된 CSS 스타일시트의 비활성화 플래그를 설정한다. 그렇지 않으면 this의 연관된 CSS 스타일시트의 비활성화 플래그 설정을 해제한다.
중요한 점은 style 요소에
연관된 CSS 스타일시트가 있을 때만 disabled 속성 할당이
효과를 가진다는 것이다:
const style = document. createElement( 'style' );
style. disabled = true ;
style. textContent = 'body { background-color: red; }' ;
document. body. append( style);
console. log( style. disabled); // false
media 속성은 스타일이 적용되는
미디어를 나타낸다.
값은 유효한 미디어 쿼리 목록이어야 한다.
사용자 에이전트는 media 속성 값이
환경과 일치하고 다른 관련 조건이 적용될 때 스타일을
적용해야 하며, 그렇지 않으면 적용해서는 안 된다.
스타일의 범위는 예를 들어 CSS의 @media 블록 사용으로 더 제한될 수 있다.
이 명세는 이러한 추가 제한이나 요구 사항을 재정의하지 않는다.
media 속성을 생략한 경우
기본값은 "all"이며, 이는 기본적으로 스타일이 모든 미디어에 적용됨을 의미한다.
blocking 속성은 차단 속성이다.
하나의 엔진에서만 지원된다.
style
요소의
title 속성은 CSS 스타일시트 집합을 정의한다. style 요소에
title 속성이 없으면
제목도 없다. 조상 요소의 title 속성은 style 요소에 적용되지
않는다. style 요소가
문서 트리 안에 있지 않으면 title 속성은 무시된다.
[CSSOM]
style 요소의
title 속성은 link 요소의 title 속성과 마찬가지로,
제목이 없는 style 블록이 부모
요소의 제목을 상속하지 않고 단순히 제목이 없다는 점에서 전역 title
속성과 다르다.
style 요소의
자식 텍스트 콘텐츠는 적합한
스타일시트의 콘텐츠여야 한다.
style 요소가
해당 요소의 노드 문서의 파서에 의해 생성되었으면 요소는
암시적으로 잠재적인 렌더링 차단 요소이다.
다음 조건 중 하나가 발생할 때마다 사용자 에이전트는 style 블록 업데이트 알고리즘을 실행해야 한다:
style 블록 업데이트 알고리즘은 다음과 같다:
element를 style 요소로 둔다.
element에 연관된 CSS 스타일시트가 있으면 해당 CSS 스타일시트를 제거한다.
element가 연결되어 있지 않으면 반환한다.
element의 type
속성이 있고
그 값이 빈 문자열도 아니며 "text/css"와
ASCII 대소문자를 구분하지 않고 일치하지도 않으면
반환한다.
특히 "text/css; charset=utf-8"과 같이 매개변수를 포함하는 type 값은 이
알고리즘이 조기에 반환하게 한다.
style 요소,
"style" 및 style 요소의
자식 텍스트 콘텐츠에 대해 실행했을 때
요소의 인라인
동작을 콘텐츠 보안 정책으로 차단해야 하는가? 알고리즘이 "Blocked"를 반환하면
반환한다. [CSP]
다음 속성을 사용하여 CSS 스타일시트를 생성한다:
element
element의 media 속성.
이는 속성의 현재 값 복사본이 아니라 현재 존재하지 않을 수도 있는 속성에 대한 참조이다. CSSOM은 속성을 동적으로 설정, 변경 또는 제거할 때 발생하는 일을 정의한다.
element가 문서 트리 안에
있으면 element의
title
속성이고, 그렇지 않으면 빈 문자열.
다시 말하지만 이는 속성에 대한 참조이다.
설정 해제.
설정.
null
기본값 그대로 둔다.
초기화하지 않은 상태로 둔다.
이는 올바르지 않아 보인다. 아마 요소의 자식 텍스트 콘텐츠를 사용해야 할 것이다. 이슈 #2997에서 추적한다.
element가 스크립트 차단 스타일시트에 기여하면 element를 해당 요소의 노드 문서의 스크립트 차단 스타일시트 집합에 추가한다.
element의 media 속성 값이
환경과 일치하고
element가
잠재적으로 렌더링을
차단하면
element에서 렌더링을 차단한다.
스타일시트의 중요 하위 리소스가 있다면 이를 얻으려는 시도가 완료되거나, 스타일시트에 중요 하위 리소스가 없다면 스타일시트의 구문 분석과 처리가 완료된 후 사용자 에이전트는 다음 단계를 실행해야 한다:
중요 하위 리소스 가져오기는
명확히 정의되어 있지 않다.
아마 이슈 #968이 가장 적합한 해결책일 것이다.
그동안에는 모든 중요 하위 리소스 요청의 렌더링
차단을 style 요소가 현재
렌더링 차단 중인지 여부로 설정하는
것이 좋다.
element를 해당 스타일시트와 연관된 style 요소로
둔다.
success를 true로 둔다.
스타일시트의 중요 하위 리소스를 얻으려는 시도가 어떤 이유로든 실패한 경우(예: DNS 오류, HTTP 404 응답, 조기에 종료된 연결, 지원되지 않는 Content-Type) success를 false로 설정한다.
CSS 구문 분석 오류나 PNG 디코딩 오류와 같은 콘텐츠별 오류는 success에 영향을 주지 않는다는 점에 유의한다.
element와 다음 단계가 주어졌을 때 네트워킹 태스크 소스에 요소 태스크를 큐에 추가한다:
element가 스크립트 차단 스타일시트에 기여하면:
단언: element의 노드 문서의 스크립트 차단 스타일시트 집합은 element를 포함한다.
element을 해당 요소의 노드 문서의 스크립트 차단 스타일시트 집합에서 제거한다.
element에서 렌더링 차단을 해제한다.
요소는 스타일시트의 중요 하위 리소스가 있다면 이를 얻으려는 모든 시도가 완료될 때까지 요소의 노드 문서의 load 이벤트를 지연해야 한다.
이 명세는 스타일 시스템을 지정하지 않지만 대부분의 웹 브라우저가 CSS를 지원할 것으로 예상된다. [CSS]
LinkStyle
인터페이스도 이 요소에 의해 구현된다. [CSSOM]
다음 문서는 작품 제목과 라틴어 단어는 기본 기울임꼴로 남겨 두면서 강조를 기울임꼴 대신 밝은 빨간색 텍스트로 스타일링한다. 적절한 요소를 사용하면 문서의 스타일을 더 쉽게 다시 지정할 수 있음을 보여 준다.
<!DOCTYPE html>
< html lang = "en-US" >
< head >
< title > My favorite book</ title >
< style >
body { color : black ; background : white ; }
em { font-style : normal ; color : red ; }
</ style >
</ head >
< body >
< p > My < em > favorite</ em > book of all time has < em > got</ em > to be
< cite > A Cat's Life</ cite > . It is a book by P. Rahmel that talks
about the < i lang = "la" > Felis catus</ i > in modern human society.</ p >
</ body >
</ html >
스타일시트가 다른 리소스를 참조하지 않은 경우(예: @import 규칙이 없는
style
요소로 제공된 내부 스타일시트인 경우), 스타일 규칙을 스크립트에서
즉시 사용할 수 있어야
한다. 그렇지 않으면 이벤트
루프가 렌더링
업데이트 단계에 도달한 뒤에만 스타일 규칙을 스크립트에서 사용할 수 있어야 한다.
HTML 파서 또는 XML 파서의
Document
맥락에 있는 요소 el은 다음 조건이 모두 참이면 스크립트 차단 스타일시트에
기여한다:
el은 해당 Document의
파서에 의해 생성되었다.
el은 style
요소이거나, 파서가 el을 생성했을 때 스타일링 처리 모델에 기여하는
외부 리소스 링크였던 link
요소이다.
el의 media 속성 값이
환경과
일치한다.
파서가 요소를 생성했을 때 el의 스타일시트가 활성화되어 있었다.
사용자 에이전트가 아직 해당 특정 스타일시트의 로드를 포기하지 않았다. 사용자 에이전트는 언제든지 스타일시트 로드를 포기할 수 있다.
스타일시트가 로드되기 전에 포기했는데도 결국 스타일시트가 로드되는 경우, 스크립트는 잘못된 정보를 바탕으로 동작하게 될 수 있다. 예를 들어 스타일시트가 요소의 색상을 녹색으로 설정하지만 스타일시트가 로드되기 전에 결과 스타일을 검사하는 스크립트가 실행되면, 스크립트는 요소가 검은색(또는 기본 색상이 무엇이든)이라고 판단하며 이에 따라 좋지 않은 선택을 할 수 있다(예: 페이지의 다른 곳에 녹색 대신 검은색을 사용하기로 결정할 수 있다). 구현자는 스크립트가 잘못된 정보를 사용할 가능성과 느린 네트워크 요청이 완료되기를 기다리는 동안 아무 작업도 하지 않을 때의 성능 영향을 균형 있게 고려해야 한다.
위 규칙에 대응하는 규칙이
<?xml-stylesheet?>
처리 명령에도 적용될 것으로 예상된다. 그러나 이는 아직 철저히 조사되지 않았다.
Document에는
초기에 비어 있는 순서 있는 집합인 스크립트 차단 스타일시트 집합이 있다.
Document
document는 다음 단계가 true를 반환하면 스크립트를 차단하는 스타일시트를
가진다:
document의 스크립트 차단 스타일시트 집합이 비어 있지 않으면 true를 반환한다.
document의 노드 내비게이블이 null이면 false를 반환한다.
containerDocument가 null이 아니고 containerDocument의 스크립트 차단 스타일시트 집합이 비어 있지 않으면 true를 반환한다.
false를 반환한다.
Document는
스크립트를 차단하는
스타일시트를 가지지 않으면 스크립트를 차단하는 스타일시트를 가지지 않는다.
Introduction_to_HTML/Document_and_website_structure#HTML_for_structuring_content
현재의 모든 엔진에서 지원된다.
body
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
html 요소의 두 번째 요소로.body 요소가 비어 있거나
body 요소 내부의
첫 번째 항목이 ASCII 공백 또는 주석이 아니면 시작 태그를 생략할 수 있다.
단, body
요소 내부의 첫 번째 항목이 meta, noscript,
link, script, style 또는 template 요소인
경우는 제외한다.
body 요소 바로 뒤에
주석이 오지 않으면 body 요소의 종료 태그를 생략할 수 있다.
onafterprint
onbeforeprint
onbeforeunload
onhashchange
onlanguagechange
onmessage
onmessageerror
onoffline
ononlineonpageswap
onpagehide
onpagereveal
onpageshow
onpopstate
onrejectionhandled
onstorage
onunhandledrejection
onunload[Exposed =Window ]
interface HTMLBodyElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
HTMLBodyElement includes WindowEventHandlers ;
적합한 문서에는 body 요소가 하나만 있다.
document.body IDL
속성은 스크립트가 문서의 body 요소에 쉽게 접근할
수 있도록 한다.
일부 DOM 작업(예: 드래그 앤 드롭 모델의
일부)은 "body 요소"를
기준으로 정의된다. 이는 용어 정의에 따른 DOM의 특정 요소를 가리키며, 임의의 body 요소를 가리키는
것이 아니다.
body 요소는
Window 객체의 여러 이벤트 핸들러를 이벤트 핸들러
콘텐츠 속성으로 노출한다. 또한 해당 이벤트 핸들러의
이벤트 핸들러 IDL
속성을 반영한다.
body 요소에 노출된
Window 반영 body 요소
이벤트 핸들러 집합이 이름을 지정하는 Window 객체의 이벤트 핸들러는 일반적으로 HTML 요소에서 지원되는 동일한 이름의
일반 이벤트 핸들러를 대체한다.
따라서 예를 들어 Document의 body 요소의 자식에서 디스패치된
버블링 error 이벤트는 먼저
해당 요소의 onerror
이벤트 핸들러 콘텐츠
속성을 트리거하고,
그다음 루트 html 요소의 해당 속성을
트리거한 뒤, 그 후에야 body
요소의 onerror 이벤트 핸들러 콘텐츠
속성을 트리거한다.
이는 이벤트가 대상에서 body로, html로, Document로, Window로 버블링하고, body의 이벤트 핸들러는 body가 아니라 Window를 감시하기 때문이다. 그러나
addEventListener()를 사용하여 body에 연결된 일반
이벤트 리스너는 이벤트가 body를 통해 버블링할 때
실행되며, Window 객체에 도달할 때
실행되는 것이 아니다.
이 페이지는 사용자의 온라인 여부를 표시하도록 표시기를 업데이트한다:
<!DOCTYPE HTML>
< html lang = "en" >
< head >
< title > Online or offline?</ title >
< script >
function update( online) {
document. getElementById( 'status' ). textContent =
online ? 'Online' : 'Offline' ;
}
</ script >
</ head >
< body ononline = "update(true)"
onoffline = "update(false)"
onload = "update(navigator.onLine)" >
< p > You are: < span id = "status" > (Unknown)</ span ></ p >
</ body >
</ html >
article
요소
현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.article 요소는
원칙적으로 독립적으로 배포하거나 재사용할 수 있는, 예를 들어 신디케이션에 사용할 수 있는 문서,
페이지, 애플리케이션 또는 사이트의 완전하거나 독립된 구성을 나타낸다. 이는 포럼 게시물, 잡지
또는
신문 기사, 블로그 게시물, 사용자가 제출한 댓글, 대화형 위젯이나 가젯 또는 기타 독립적인 콘텐츠
항목일 수 있다.
article
요소가 중첩된 경우 내부 article
요소는
원칙적으로 외부 기사 콘텐츠와 관련된 기사를 나타낸다. 예를 들어 사용자가 제출한 댓글을 받는 사이트의
블로그 게시물에서는 댓글을 블로그 게시물의 article 요소
내부에 중첩된 article 요소로
나타낼 수 있다.
article 요소와
연관된 작성자 정보(address 요소
참조)는 중첩된 article 요소에
적용되지 않는다.
신디케이션으로 재배포할 콘텐츠와 함께 특별히 사용할 때
article
요소는 목적상 Atom의 entry 요소와 유사하다. [ATOM]
schema.org 마이크로데이터 어휘의 CreativeWork 하위 유형 중 하나를 사용하여
article
요소의 게시일을 제공할 수 있다.
페이지의 주요 콘텐츠(즉, 푸터, 헤더, 내비게이션 블록 및 사이드바를 제외한 콘텐츠)가 하나의
독립된 구성이라면 해당 콘텐츠를 article로
표시할 수 있지만, 이 경우에는 기술적으로 중복이다(페이지가 하나의 문서이므로 단일 구성이라는 것이
자명하기 때문이다).
이 예제는 일부 schema.org 주석과 함께 article 요소를
사용하는 블로그 게시물을 보여 준다:
< article itemscope itemtype = "http://schema.org/BlogPosting" >
< header >
< h2 itemprop = "headline" > The Very First Rule of Life</ h2 >
< p >< time itemprop = "datePublished" datetime = "2009-10-09" > 3 days ago</ time ></ p >
< link itemprop = "url" href = "?comments=0" >
</ header >
< p > If there's a microphone anywhere near you, assume it's hot and
sending whatever you're saying to the world. Seriously.</ p >
< p > ...</ p >
< footer >
< a itemprop = "discussionUrl" href = "?comments=1" > Show comments...</ a >
</ footer >
</ article >
다음은 댓글 일부를 표시한 동일한 블로그 게시물이다:
< article itemscope itemtype = "http://schema.org/BlogPosting" >
< header >
< h2 itemprop = "headline" > The Very First Rule of Life</ h2 >
< p >< time itemprop = "datePublished" datetime = "2009-10-09" > 3 days ago</ time ></ p >
< link itemprop = "url" href = "?comments=0" >
</ header >
< p > If there's a microphone anywhere near you, assume it's hot and
sending whatever you're saying to the world. Seriously.</ p >
< p > ...</ p >
< section >
< h1 > Comments</ h1 >
< article itemprop = "comment" itemscope itemtype = "http://schema.org/Comment" id = "c1" >
< link itemprop = "url" href = "#c1" >
< footer >
< p > Posted by: < span itemprop = "creator" itemscope itemtype = "http://schema.org/Person" >
< span itemprop = "name" > George Washington</ span >
</ span ></ p >
< p >< time itemprop = "dateCreated" datetime = "2009-10-10" > 15 minutes ago</ time ></ p >
</ footer >
< p > Yeah! Especially when talking about your lobbyist friends!</ p >
</ article >
< article itemprop = "comment" itemscope itemtype = "http://schema.org/Comment" id = "c2" >
< link itemprop = "url" href = "#c2" >
< footer >
< p > Posted by: < span itemprop = "creator" itemscope itemtype = "http://schema.org/Person" >
< span itemprop = "name" > George Hammond</ span >
</ span ></ p >
< p >< time itemprop = "dateCreated" datetime = "2009-10-10" > 5 minutes ago</ time ></ p >
</ footer >
< p > Hey, you have the same first name as me.</ p >
</ article >
</ section >
</ article >
각 댓글의 정보(작성자와 작성 시점 등)를 제공하기 위해 footer를 사용한 점에
유의한다. 이 경우처럼 적절한 경우 footer 요소는
해당 섹션의 시작 부분에 나타날 수 있다. (이 경우 header를 사용해도
잘못된 것은 아니다. 주로 작성 선호의 문제이다.)
이 예제에서는 포털 페이지에 위젯을 호스팅하기 위해 article 요소를
사용한다. 위젯은 특정 스타일링과 스크립트 동작을 얻기 위해 사용자 정의 내장 요소로 구현된다.
<!DOCTYPE HTML>
< html lang = en >
< title > eHome Portal</ title >
< script src = "/scripts/widgets.js" ></ script >
< link rel = stylesheet href = "/styles/main.css" >
< article is = "stock-widget" >
< h2 > Stocks</ h2 >
< table >
< thead > < tr > < th > Stock < th > Value < th > Delta
< tbody > < template > < tr > < td > < td > < td > </ template >
</ table >
< p > < input type = button value = "Refresh" onclick = "this.parentElement.refresh()" >
</ article >
< article is = "news-widget" >
< h2 > News</ h2 >
< ul >
< template >
< li >
< p >< img > < strong ></ strong >
< p >
</ template >
</ ul >
< p > < input type = button value = "Refresh" onclick = "this.parentElement.refresh()" >
</ article >
section
요소
현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.section 요소는
문서 또는 애플리케이션의 일반적인 섹션을 나타낸다. 이 맥락에서 섹션은 일반적으로
제목을 포함하는 주제별 콘텐츠 그룹이다.
섹션의 예로는 장, 탭 대화 상자의 여러 탭 페이지 또는 논문의 번호가 매겨진 절이 있다. 웹사이트의 홈페이지는 소개, 뉴스 항목 및 연락처 정보 섹션으로 나눌 수 있다.
요소의 콘텐츠를 신디케이션하는 것이 적절한 경우 작성자는
section
요소 대신 article 요소를
사용하는 것이 권장된다.
section 요소는
일반적인 컨테이너 요소가 아니다. 스타일링 목적으로만 또는 스크립팅 편의를 위해 요소가 필요한 경우
작성자는 대신 div 요소를 사용하는
것이 권장된다. 일반적인 규칙은 요소의 콘텐츠가 문서의 개요에 명시적으로 나열될 경우에만 section
요소가 적절하다는 것이다.
다음 예제에서는 두 개의 짧은 섹션을 포함하는 사과에 관한 기사(더 큰 웹페이지의 일부)를 볼 수 있다.
< article >
< hgroup >
< h2 > Apples</ h2 >
< p > Tasty, delicious fruit!</ p >
</ hgroup >
< p > The apple is the pomaceous fruit of the apple tree.</ p >
< section >
< h3 > Red Delicious</ h3 >
< p > These bright red apples are the most common found in many
supermarkets.</ p >
</ section >
< section >
< h3 > Granny Smith</ h3 >
< p > These juicy, green apples make a great filling for
apple pies.</ p >
</ section >
</ article >
다음은 졸업자 목록을 위한 섹션과 졸업식 설명을 위한 섹션이라는 두 섹션을 가진 졸업식 프로그램이다. (이 예제의 마크업은 요소 간 공백의 양을 최소화하기 위해 가끔 사용되는 드문 스타일을 사용한다.)
<!DOCTYPE Html>
< Html Lang = En
>< Head
>< Title
> Graduation Ceremony Summer 2022</ Title
></ Head
>< Body
>< H1
> Graduation</ H1
>< Section
>< H2
> Ceremony</ H2
>< P
> Opening Procession</ P
>< P
> Speech by Valedictorian</ P
>< P
> Speech by Class President</ P
>< P
> Presentation of Diplomas</ P
>< P
> Closing Speech by Headmaster</ P
></ Section
>< Section
>< H2
> Graduates</ H2
>< Ul
>< Li
> Molly Carpenter</ Li
>< Li
> Anastasia Luccio</ Li
>< Li
> Ebenezar McCoy</ Li
>< Li
> Karrin Murphy</ Li
>< Li
> Thomas Raith</ Li
>< Li
> Susan Rodriguez</ Li
></ Ul
></ Section
></ Body
></ Html >
이 예제에서는 책의 작성자가 일부 섹션을 장으로, 일부를 부록으로 마크업하고 CSS를 사용하여 이 두 섹션 클래스의 헤더 스타일을 서로 다르게 지정한다.
< style >
section { border : double medium ; margin : 2 em ; }
section . chapter h2 { font : 2 em Roboto , Helvetica Neue , sans-serif ; }
section . appendix h2 { font : small-caps 2 em Roboto , Helvetica Neue , sans-serif ; }
</ style >
< header >
< hgroup >
< h1 > My Book</ h1 >
< p > A sample with not much content</ p >
</ hgroup >
< p >< small > Published by Dummy Publicorp Ltd.</ small ></ p >
</ header >
< section class = "chapter" >
< h2 > My First Chapter</ h2 >
< p > This is the first of my chapters. It doesn't say much.</ p >
< p > But it has two paragraphs!</ p >
</ section >
< section class = "chapter" >
< h2 > It Continues: The Second Chapter</ h2 >
< p > Bla dee bla, dee bla dee bla. Boom.</ p >
</ section >
< section class = "chapter" >
< h2 > Chapter Three: A Further Example</ h2 >
< p > It's not like a battle between brightness and earthtones would go
unnoticed.</ p >
< p > But it might ruin my story.</ p >
</ section >
< section class = "appendix" >
< h2 > Appendix A: Overview of Examples</ h2 >
< p > These are demonstrations.</ p >
</ section >
< section class = "appendix" >
< h2 > Appendix B: Some Closing Remarks</ h2 >
< p > Hopefully this long example shows that you < em > can</ em > style
sections, so long as they are used to indicate actual sections.</ p >
</ section >
nav
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.nav 요소는 다른
페이지 또는 페이지 내의 일부로 연결되는 페이지의 섹션, 즉 내비게이션 링크가 있는 섹션을 나타낸다.
페이지의 모든 링크 그룹을 nav
요소에 넣을 필요는 없다.
이 요소는 주로 주요 내비게이션 블록으로 구성된 섹션을 위한 것이다. 특히 푸터에는 서비스 약관,
홈페이지 및 저작권 페이지처럼 사이트의 여러 페이지로 연결되는 짧은 링크 목록이 있는 경우가 많다.
이러한 경우에는 footer 요소만으로
충분하다. 이러한 경우에 nav 요소를 사용할 수는
있지만 일반적으로는 필요하지 않다.
초기 렌더링에서 내비게이션 정보를 생략하는 것이 유용하거나 내비게이션 정보를 즉시 사용할 수 있는 것이 유용한 사용자를 대상으로 하는 사용자 에이전트(예: 스크린 리더)는 이 요소를 사용하여 페이지의 어떤 콘텐츠를 처음에 건너뛰거나 요청 시 제공할지(또는 둘 다)를 결정할 수 있다.
다음 예제에는 두 개의 nav 요소가 있다. 하나는
사이트 전체의 기본 내비게이션을 위한 것이고, 다른 하나는 페이지 자체의 보조 내비게이션을 위한 것이다.
< body >
< h1 > The Wiki Center Of Exampland</ h1 >
< nav >
< ul >
< li >< a href = "/" > Home</ a ></ li >
< li >< a href = "/events" > Current Events</ a ></ li >
...more...
</ ul >
</ nav >
< article >
< header >
< h2 > Demos in Exampland</ h2 >
< p > Written by A. N. Other.</ p >
</ header >
< nav >
< ul >
< li >< a href = "#public" > Public demonstrations</ a ></ li >
< li >< a href = "#destroy" > Demolitions</ a ></ li >
...more...
</ ul >
</ nav >
< div >
< section id = "public" >
< h2 > Public demonstrations</ h2 >
< p > ...more...</ p >
</ section >
< section id = "destroy" >
< h2 > Demolitions</ h2 >
< p > ...more...</ p >
</ section >
...more...
</ div >
< footer >
< p >< a href = "?edit" > Edit</ a > | < a href = "?delete" > Delete</ a > | < a href = "?Rename" > Rename</ a ></ p >
</ footer >
</ article >
< footer >
< p >< small > © copyright 1998 Exampland Emperor</ small ></ p >
</ footer >
</ body >
다음 예제에서는 페이지의 여러 위치에 링크가 있지만 그중 한 위치만 내비게이션 섹션으로 간주된다.
< body itemscope itemtype = "http://schema.org/Blog" >
< header >
< h1 > Wake up sheeple!</ h1 >
< p >< a href = "news.html" > News</ a > -
< a href = "blog.html" > Blog</ a > -
< a href = "forums.html" > Forums</ a ></ p >
< p > Last Modified: < span itemprop = "dateModified" > 2009-04-01</ span ></ p >
< nav >
< h2 > Navigation</ h2 >
< ul >
< li >< a href = "articles.html" > Index of all articles</ a ></ li >
< li >< a href = "today.html" > Things sheeple need to wake up for today</ a ></ li >
< li >< a href = "successes.html" > Sheeple we have managed to wake</ a ></ li >
</ ul >
</ nav >
</ header >
< main >
< article itemprop = "blogPosts" itemscope itemtype = "http://schema.org/BlogPosting" >
< header >
< h2 itemprop = "headline" > My Day at the Beach</ h2 >
</ header >
< div itemprop = "articleBody" >
< p > Today I went to the beach and had a lot of fun.</ p >
...more content...
</ div >
< footer >
< p > Posted < time itemprop = "datePublished" datetime = "2009-10-10" > Thursday</ time > .</ p >
</ footer >
</ article >
...more blog posts...
</ main >
< footer >
< p > Copyright ©
< span itemprop = "copyrightYear" > 2010</ span >
< span itemprop = "copyrightHolder" > The Example Company</ span >
</ p >
< p >< a href = "about.html" > About</ a > -
< a href = "policy.html" > Privacy Policy</ a > -
< a href = "contact.html" > Contact Us</ a ></ p >
</ footer >
</ body >
위 예제에서는 schema.org 어휘를 사용하여 블로그 게시물의 게시일과 기타 메타데이터를 제공하는 마이크로데이터 주석도 볼 수 있다.
nav 요소가 반드시
목록을 포함해야 하는 것은 아니며 다른 종류의 콘텐츠도 포함할 수 있다. 이 내비게이션 블록에서는
산문으로 링크를 제공한다:
< nav >
< h1 > Navigation</ h1 >
< p > You are on my home page. To the north lies < a href = "/blog" > my
blog</ a > , from whence the sounds of battle can be heard. To the east
you can see a large mountain, upon which many < a
href = "/school" > school papers</ a > are littered. Far up thus mountain
you can spy a little figure who appears to be me, desperately
scribbling a < a href = "/school/thesis" > thesis</ a > .</ p >
< p > To the west are several exits. One fun-looking exit is labeled < a
href = "https://games.example.com/" > "games"</ a > . Another more
boring-looking exit is labeled < a
href = "https://isp.example.net/" > ISP™</ a > .</ p >
< p > To the south lies a dark and dank < a href = "/about" > contacts
page</ a > . Cobwebs cover its disused entrance, and at one point you
see a rat run quickly out of the page.</ p >
</ nav >
이 예제에서는 사용자가 폴더를 전환할 수 있도록 이메일 애플리케이션에서 nav를 사용한다:
< p >< input type = button value = "Compose" onclick = "compose()" ></ p >
< nav >
< h1 > Folders</ h1 >
< ul >
< li > < a href = "/inbox" onclick = "return openFolder(this.href)" > Inbox</ a > < span class = count ></ span >
< li > < a href = "/sent" onclick = "return openFolder(this.href)" > Sent</ a >
< li > < a href = "/drafts" onclick = "return openFolder(this.href)" > Drafts</ a >
< li > < a href = "/trash" onclick = "return openFolder(this.href)" > Trash</ a >
< li > < a href = "/customers" onclick = "return openFolder(this.href)" > Customers</ a >
</ ul >
</ nav >
aside
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.aside 요소는
aside 요소
주변의 콘텐츠와 간접적으로 관련되어 있으며 해당 콘텐츠와 분리된 것으로 간주할 수 있는 콘텐츠로
구성된 페이지의 섹션을 나타낸다. 이러한 섹션은 인쇄된 타이포그래피에서
사이드바로 표시되는 경우가 많다.
이 요소는 인용문이나 사이드바와 같은 타이포그래피 효과, 광고, nav 요소의 그룹 및 페이지의
주요 콘텐츠와 분리된 것으로 간주되는 기타 콘텐츠에 사용할 수 있다.
괄호 안의 내용을 위해서만 aside 요소를 사용하는
것은 적절하지 않다. 그러한 내용은 문서의 주요 흐름에 포함되기 때문이다.
다음 예제는 유럽에 관한 훨씬 긴 뉴스 기사에서 스위스에 관한 배경 자료를 마크업하는 데 aside를 사용하는 방법을 보여 준다.
< aside >
< h2 > Switzerland</ h2 >
< p > Switzerland, a land-locked country in the middle of geographic
Europe, has not joined the geopolitical European Union, though it is
a signatory to a number of European treaties.</ p >
</ aside >
다음 예제는 긴 기사에서 인용문을 마크업하는 데 aside를 사용하는 방법을 보여 준다.
...
< p > He later joined a large company, continuing on the same work.
< q > I love my job. People ask me what I do for fun when I'm not at
work. But I'm paid to do my hobby, so I never know what to
answer. Some people wonder what they would do if they didn't have to
work... but I know what I would do, because I was unemployed for a
year, and I filled that time doing exactly what I do now.</ q ></ p >
< aside >
< q > People ask me what I do for fun when I'm not at work. But I'm
paid to do my hobby, so I never know what to answer.</ q >
</ aside >
< p > Of course his work — or should that be hobby? —
isn't his only passion. He also enjoys other pleasures.</ p >
...
다음 발췌문은 블로그에서 블로그롤과 기타 부가 콘텐츠에 aside를 사용할 수
있는 방법을 보여 준다:
< body >
< header >
< h1 > My wonderful blog</ h1 >
< p > My tagline</ p >
</ header >
< aside >
<!-- this aside contains two sections that are tangentially related
to the page, namely, links to other blogs, and links to blog posts
from this blog -->
< nav >
< h2 > My blogroll</ h2 >
< ul >
< li >< a href = "https://blog.example.com/" > Example Blog</ a >
</ ul >
</ nav >
< nav >
< h2 > Archives</ h2 >
< ol reversed >
< li >< a href = "/last-post" > My last post</ a >
< li >< a href = "/first-post" > My first post</ a >
</ ol >
</ nav >
</ aside >
< aside >
<!-- this aside is tangentially related to the page also, it
contains twitter messages from the blog author -->
< h1 > Twitter Feed</ h1 >
< blockquote cite = "https://twitter.example.net/t31351234" >
I'm on vacation, writing my blog.
</ blockquote >
< blockquote cite = "https://twitter.example.net/t31219752" >
I'm going to go on vacation soon.
</ blockquote >
</ aside >
< article >
<!-- this is a blog post -->
< h2 > My last post</ h2 >
< p > This is my last post.</ p >
< footer >
< p >< a href = "/last-post" rel = bookmark > Permalink</ a >
</ footer >
</ article >
< article >
<!-- this is also a blog post -->
< h2 > My first post</ h2 >
< p > This is my first post.</ p >
< aside >
<!-- this aside is about the blog post, since it's inside the
<article> element; it would be wrong, for instance, to put the
blogroll here, since the blogroll isn't really related to this post
specifically, only to the page as a whole -->
< h2 > Posting</ h2 >
< p > While I'm thinking about it, I wanted to say something about
posting. Posting is fun!</ p >
</ aside >
< footer >
< p >< a href = "/first-post" rel = bookmark > Permalink</ a >
</ footer >
</ article >
< footer >
< p >< a href = "/archives" > Archives</ a > -
< a href = "/about" > About me</ a > -
< a href = "/copyright" > Copyright</ a ></ p >
</ footer >
</ body >
h1, h2, h3, h4, h5 및 h6
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
hgroup
요소의 자식으로.[Exposed =Window ]
interface HTMLHeadingElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
이 요소들은 해당 섹션의 제목을 나타낸다.
이 요소들의 의미 체계와 의미는 제목과 개요 절에서 정의한다.
이 요소들은 이름의 숫자로 주어지는 제목 수준을
가진다.
제목 수준은
중첩된 섹션의 수준에 대응한다. h1
요소는 최상위 섹션을 위한 것이고, h2
요소는 하위 섹션을 위한 것이며, h3
요소는 하위 섹션의 하위 섹션을 위한 것이고, 이후도 같은 방식이다.
각각의 문서 개요(제목 및 섹션 구조)와 관련해서 다음 두 코드 조각은 의미상 동일하다:
< body >
< h1 > Let's call it a draw(ing surface)</ h1 >
< h2 > Diving in</ h2 >
< h2 > Simple shapes</ h2 >
< h2 > Canvas coordinates</ h2 >
< h3 > Canvas coordinates diagram</ h3 >
< h2 > Paths</ h2 >
</ body >
< body >
< h1 > Let's call it a draw(ing surface)</ h1 >
< section >
< h2 > Diving in</ h2 >
</ section >
< section >
< h2 > Simple shapes</ h2 >
</ section >
< section >
< h2 > Canvas coordinates</ h2 >
< section >
< h3 > Canvas coordinates diagram</ h3 >
</ section >
</ section >
< section >
< h2 > Paths</ h2 >
</ section >
</ body >
작성자는 간결함을 위해 앞의 스타일을 선호하거나 추가 스타일링 지점을 위해 뒤의 스타일을 선호할 수 있다. 어느 것이 가장 좋은지는 전적으로 선호하는 작성 스타일의 문제이다.
hgroup
요소현재의 모든 엔진에서 지원된다.
p 요소 뒤에
하나의 h1,
h2,
h3,
h4,
h5
또는 h6
요소가 오고, 그 뒤에 0개 이상의
p 요소가 오며, 선택적으로
스크립트 지원
요소와 섞일 수 있다.
HTMLElement를 사용한다.hgroup 요소는 제목과
관련 콘텐츠를 나타낸다. 이 요소는
h1–h6
요소를 부제목, 대체 제목 또는 태그라인을 나타내는 콘텐츠를 포함하는 하나 이상의
p 요소와 함께
그룹화하는 데 사용할 수 있다.
다음은 hgroup 요소 안에
포함된 유효한 제목의 몇 가지 예이다.
< hgroup >
< h1 > The reality dysfunction</ h1 >
< p > Space is not the only void</ p >
</ hgroup >
< hgroup >
< h1 > Dr. Strangelove</ h1 >
< p > Or: How I Learned to Stop Worrying and Love the Bomb</ p >
</ hgroup >
header
요소현재의 모든 엔진에서 지원된다.
header 또는 footer 요소
자손은 없어야 한다.HTMLElement를 사용한다.header 요소는 소개
또는 내비게이션 보조 수단의 그룹을 나타낸다.
header
요소는 일반적으로 제목
(h1–h6
요소 또는 hgroup
요소)을 포함하도록 의도되지만, 필수는 아니다. header 요소는
섹션의 목차, 검색 폼 또는 관련 로고를 감싸는 데에도 사용할 수 있다.
다음은 몇 가지 헤더 예제이다. 첫 번째 예제는 게임을 위한 것이다:
< header >
< p > Welcome to...</ p >
< h1 > Voidwars!</ h1 >
</ header >
다음 코드 조각은 명세의 헤더를 마크업하는 데 이 요소를 사용하는 방법을 보여 준다:
< header >
< hgroup >
< h1 > Fullscreen API</ h1 >
< p > Living Standard — Last Updated 19 October 2015< p >
</ hgroup >
< dl >
< dt > Participate:</ dt >
< dd >< a href = "https://github.com/whatwg/fullscreen" > GitHub whatwg/fullscreen</ a ></ dd >
< dt > Commits:</ dt >
< dd >< a href = "https://github.com/whatwg/fullscreen/commits" > GitHub whatwg/fullscreen/commits</ a ></ dd >
</ dl >
</ header >
header
요소는 섹셔닝
콘텐츠가 아니며, 새 섹션을 시작하지 않는다.
이 예제에서 페이지에는 h1
요소가 제공하는 페이지 제목과 h2
요소가 제공하는 제목을 가진 두 개의 하위 섹션이 있다.
header 요소 뒤의
콘텐츠는 여전히 header 요소에서
시작된 마지막 하위 섹션의 일부이다. 이는 header 요소가
개요 알고리즘에 참여하지 않기 때문이다.
< body >
< header >
< h1 > Little Green Guys With Guns</ h1 >
< nav >
< ul >
< li >< a href = "/games" > Games</ a >
< li >< a href = "/forum" > Forum</ a >
< li >< a href = "/download" > Download</ a >
</ ul >
</ nav >
< h2 > Important News</ h2 > <!-- this starts a second subsection -->
<!-- this is part of the subsection entitled "Important News" -->
< p > To play today's games you will need to update your client.</ p >
< h2 > Games</ h2 > <!-- this starts a third subsection -->
</ header >
< p > You have three active games:</ p >
<!-- this is still part of the subsection entitled "Games" -->
...
footer
요소현재의 모든 엔진에서 지원된다.
header 또는 footer 요소
자손은 없어야 한다.HTMLElement를 사용한다.footer 요소는 가장
가까운 조상 섹셔닝 콘텐츠 요소의 푸터를 나타내며, 그러한 조상이 없으면 body 요소의 푸터를 나타낸다.
푸터에는 일반적으로 해당 섹션의 작성자, 관련 문서로 연결되는 링크, 저작권 데이터 등과 같은
정보가 포함된다.
footer 요소가
전체 섹션을 포함하는 경우, 해당 섹션은 부록, 색인, 긴 판권란, 자세한 라이선스 계약 및 이와 유사한
콘텐츠를 나타낸다.
섹션의 작성자 또는 편집자에 대한 연락처 정보는 address 요소에
속하며, 해당 요소 자체가 footer 안에
있을
수 있다. 바이라인 및 header나
footer 모두에
적합할 수 있는 기타 정보는 둘 중 하나에 둘 수도 있고 어느 쪽에도 두지 않을 수도 있다. 이러한
요소의 주요 목적은 작성자가 유지관리하고 스타일링하기 쉬운 자체 설명적 마크업을 작성하도록 돕는
것일 뿐이며, 작성자에게 특정 구조를 강제하도록 의도된 것은 아니다.
푸터는 일반적으로 섹션의 끝에 나타나지만 반드시 그럴 필요는 없다.
조상 섹셔닝 콘텐츠 요소가 없으면 전체 페이지에 적용된다.
footer
요소 자체는 섹셔닝 콘텐츠가 아니며, 새 섹션을 시작하지
않는다.
다음은 같은 콘텐츠를 가진 푸터 두 개가 하나는 위쪽에, 다른 하나는 아래쪽에 있는 페이지이다:
< body >
< footer >< a href = "../" > Back to index...</ a ></ footer >
< hgroup >
< h1 > Lorem ipsum</ h1 >
< p > The ipsum of all lorems</ p >
</ hgroup >
< p > A dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.</ p >
< footer >< a href = "../" > Back to index...</ a ></ footer >
</ body >
다음 예제는 footer 요소가 사이트
전체 푸터와 섹션 푸터 모두에 사용되는 모습을 보여 준다.
<!DOCTYPE HTML>
< HTML LANG = "en" >< HEAD >
< TITLE > The Ramblings of a Scientist</ TITLE >
< BODY >
< H1 > The Ramblings of a Scientist</ H1 >
< ARTICLE >
< H1 > Episode 15</ H1 >
< VIDEO SRC = "/fm/015.ogv" CONTROLS PRELOAD >
< P >< A HREF = "/fm/015.ogv" > Download video</ A > .</ P >
</ VIDEO >
< FOOTER > <!-- footer for article -->
< P > Published < TIME DATETIME = "2009-10-21T18:26-07:00" > on 2009/10/21 at 6:26pm</ TIME ></ P >
</ FOOTER >
</ ARTICLE >
< ARTICLE >
< H1 > My Favorite Trains</ H1 >
< P > I love my trains. My favorite train of all time is a Köf.</ P >
< P > It is fun to see them pull some coal cars because they look so
dwarfed in comparison.</ P >
< FOOTER > <!-- footer for article -->
< P > Published < TIME DATETIME = "2009-09-15T14:54-07:00" > on 2009/09/15 at 2:54pm</ TIME ></ P >
</ FOOTER >
</ ARTICLE >
< FOOTER > <!-- site wide footer -->
< NAV >
< P >< A HREF = "/credits.html" > Credits</ A > —
< A HREF = "/tos.html" > Terms of Service</ A > —
< A HREF = "/index.html" > Blog Index</ A ></ P >
</ NAV >
< P > Copyright © 2009 Gordon Freeman</ P >
</ FOOTER >
</ BODY >
</ HTML >
일부 사이트 디자인에는 때때로 "대형 푸터"라고 부르는 것이 있다. 이는 이미지, 다른 기사로 연결되는 링크, 피드백을 보내는 페이지로 연결되는 링크, 특별 제안 등 많은 자료를 포함하는 푸터로, 어떤 면에서는 푸터 안에 완전한 "첫 페이지"가 있는 것과 같다.
다음 코드 조각은 "대형 푸터"가 있는 사이트에서 페이지 하단을 보여 준다:
...
< footer >
< nav >
< section >
< h1 > Articles</ h1 >
< p >< img src = "images/somersaults.jpeg" alt = "" > Go to the gym with
our somersaults class! Our teacher Jim takes you through the paces
in this two-part article. < a href = "articles/somersaults/1" > Part
1</ a > · < a href = "articles/somersaults/2" > Part 2</ a ></ p >
< p >< img src = "images/kindplus.jpeg" > Tired of walking on the edge of
a clif<!-- sic --> ? Our guest writer Lara shows you how to bumble
your way through the bars. < a href = "articles/kindplus/1" > Read
more...</ a ></ p >
< p >< img src = "images/crisps.jpeg" > The chips are down, now all
that's left is a potato. What can you do with it? < a
href = "articles/crisps/1" > Read more...</ a ></ p >
</ section >
< ul >
< li > < a href = "/about" > About us...</ a >
< li > < a href = "/feedback" > Send feedback!</ a >
< li > < a href = "/sitemap" > Sitemap</ a >
</ ul >
</ nav >
< p >< small > Copyright © 2015 The Snacker —
< a href = "/tos" > Terms of Service</ a ></ small ></ p >
</ footer >
</ body >
address
요소
현재의 모든 엔진에서 지원된다.
header, footer 또는
address 요소
자손은 없어야 한다.
HTMLElement를 사용한다.address 요소는
가장 가까운 article 또는
body 요소 조상의
연락처 정보를 나타낸다. 해당 조상이 body
요소이면 연락처 정보는 문서 전체에 적용된다.
예를 들어 HTML과 관련된 W3C 웹사이트의 페이지에는 다음과 같은 연락처 정보가 포함될 수 있다:
< ADDRESS >
< A href = "../People/Raggett/" > Dave Raggett</ A > ,
< A href = "../People/Arnaud/" > Arnaud Le Hors</ A > ,
contact persons for the < A href = "Activity" > W3C HTML Activity</ A >
</ ADDRESS >
address 요소는
해당 주소가 실제로 관련 연락처 정보인 경우를 제외하고 임의의 주소(예: 우편 주소)를 나타내는 데
사용해서는 안 된다. (일반적인 우편 주소를 마크업하는 데 적합한 요소는
p 요소이다.)
address 요소는
연락처 정보 이외의 정보를 포함해서는 안 된다.
예를 들어 다음은 address
요소를
부적합하게 사용한 것이다:
< ADDRESS > Last Modified: 1999/12/24 23:37:50</ ADDRESS >
일반적으로 address 요소는
다른 정보와 함께 footer 요소에
포함된다.
노드 node의 연락처 정보는 다음 목록에서 처음으로 적용 가능한 항목에 의해 정의되는
address
요소의 모음이다:
article 요소인 경우body
요소인 경우연락처 정보는 node를 조상으로 가지면서 node의 자손인 다른 body 또는
article
요소 조상을 가지지 않는 모든 address 요소로
구성된다.
article 요소인
조상 요소가 있는 경우body
요소인 조상
요소가 있는 경우node의 연락처 정보는 가장 가까운 article 또는
body 요소 조상 중
더 가까운 요소의 연락처 정보와 같다.
node에는 연락처 정보가 없다.
사용자 에이전트는 노드의 연락처 정보를 사용자에게 노출하거나, 섹션의 연락처 정보를 기준으로 섹션을 색인하는 것과 같은 다른 목적으로 사용할 수 있다.
이 예제에서 푸터는 연락처 정보와 저작권 고지를 포함한다.
< footer >
< address >
For more details, contact
< a href = "mailto:js@example.com" > John Smith</ a > .
</ address >
< p >< small > © copyright 2038 Example Corp.</ small ></ p >
</ footer >
h1–h6
요소에는 요소의 계산된 제목 수준을
가져오기로 주어지는 제목 수준이 있다.
이 요소들은 제목을 나타낸다. 제목의 제목 수준이 낮을수록 해당 제목이 가진 조상 섹션의 수가 적다.
개요는 예를 들어 목차를 생성할 때 문서 개요를 생성하는 데 사용해야 한다. 대화형 목차를 만들 때 항목은 사용자를 관련 제목으로 이동시켜야 한다.
문서에 하나 이상의 제목이 있으면 개요 안의 적어도 하나의 제목은 제목 수준이 1이어야 한다.
다음 예제는 부적합하다:
< body >
< h1 > Apples</ h1 >
< p > Apples are fruit.</ p >
< section >
< h3 > Taste</ h3 >
< p > They taste lovely.</ p >
</ section >
</ body >
다음과 같이 작성하면 적합하게 된다:
< body >
< h1 > Apples</ h1 >
< p > Apples are fruit.</ p >
< section >
< h2 > Taste</ h2 >
< p > They taste lovely.</ p >
</ section >
</ body >
headingoffset
콘텐츠 속성을 사용하면 작성자가 자손의 제목 수준에 오프셋을 적용할 수 있다.
headingoffset
속성이 지정되면 그 값은 0 이상 8 이하의 유효한 음이 아닌 정수여야 한다.
headingreset
콘텐츠 속성은 불리언
속성이다. 이를 사용하면 작성자가 제목 오프셋 계산이 해당 속성을 가진 요소 너머로 순회하지
못하도록 할 수 있다.
요소 element이 주어졌을 때 요소의 계산된 제목 수준을 가져오려면:
level을 0으로 둔다.
element의 지역 이름이 h1이면,
level을 1로 설정한다.
element의 지역 이름이 h2이면,
level을 2로 설정한다.
element의 지역 이름이 h3이면,
level을 3으로 설정한다.
element의 지역 이름이 h4이면,
level을 4로 설정한다.
element의 지역 이름이 h5이면,
level을 5로 설정한다.
element의 지역 이름이 h6이면,
level을 6으로 설정한다.
단언: level은 0이 아니다.
element가 주어졌을 때 요소의 계산된 제목 오프셋을 가져온 결과만큼 level을 증가시킨다.
level이 9보다 크면 9를 반환한다.
level을 반환한다.
요소 element이 주어졌을 때 요소의 계산된 제목 오프셋을 가져오려면 다음 단계를 수행한다. 이 단계들은 음이 아닌 정수를 반환한다.
offset을 0으로 둔다.
inclusiveAncestor를 element로 둔다.
inclusiveAncestor가 null이 아닌 동안:
nextOffset을 0으로 둔다.
inclusiveAncestor가 HTML 요소이고
headingoffset
속성을 가지면 음이 아닌 정수 구문 분석
규칙을 사용하여 그 값을 구문 분석한다.
값을 구문 분석한 결과가 오류가 아니면 nextOffset을 해당 값으로 설정한다.
offset을 nextOffset만큼 증가시킨다.
inclusiveAncestor가 HTML 요소이고
headingreset
속성을 가지면 offset을 반환한다.
inclusiveAncestor의 부모가 섀도 루트이면 inclusiveAncestor를 해당 섀도 루트의 호스트로 설정하고 계속한다.
inclusiveAncestor를 inclusiveAncestor의 부모 요소로 설정한다.
offset을 반환한다.
이 예제는 각 제목 수준을 보여 주는 주석과 함께 headingoffset,
headingreset
및 aria-level
속성을 조합한 모습을 보여 준다. 이 예제는 다양한 조합을 설명하기 위한 것이며 모범 사례 예제는
아니다.
< body >
< main >
< h1 > This is a heading level 1</ h1 >
< article headingoffset = "1" >
< h1 > This is a heading level 2</ h1 >
< section headingoffset = "1" >
< h1 > This is a heading level 3</ h1 >
< dialog headingreset >
< h1 > This is a heading level 1</ h1 >
</ dialog >
</ section >
</ article >
< h1 aria-level = "2" > This is a heading level 2</ h1 >
</ main >
</ body >
다음 마크업 조각은:
< body >
< hgroup id = "document-title" >
< h1 > HTML: Living Standard</ h1 >
< p > Last Updated 12 August 2016</ p >
</ hgroup >
< p > Some intro to the document.</ p >
< h2 > Table of contents</ h2 >
< ol id = toc > ...</ ol >
< h2 > First section</ h2 >
< p > Some intro to the first section.</ p >
</ body >
...3개의 문서 제목을 생성한다:
<h1>HTML: Living Standard</h1>
<h2>Table of contents</h2>.
<h2>First section</h2>.
개요를 렌더링한 모습은 다음과 같을 수 있다:
먼저 매우 짧은 장과 하위 섹션으로 구성된 책 문서를 살펴보자:
<!DOCTYPE HTML>
< html lang = en >
< title > The Tax Book (all in one page)</ title >
< h1 > The Tax Book</ h1 >
< h2 > Earning money</ h2 >
< p > Earning money is good.</ p >
< h3 > Getting a job</ h3 >
< p > To earn money you typically need a job.</ p >
< h2 > Spending money</ h2 >
< p > Spending is what money is mainly used for.</ p >
< h3 > Cheap things</ h3 >
< p > Buying cheap things often not cost-effective.</ p >
< h3 > Expensive things</ h3 >
< p > The most expensive thing is often not the most cost-effective either.</ p >
< h2 > Investing money</ h2 >
< p > You can lend your money to other people.</ p >
< h2 > Losing money</ h2 >
< p > If you spend money or invest money, sooner or later you will lose money.
< h3 > Poor judgement</ h3 >
< p > Usually if you lose money it's because you made a mistake.</ p >
이 문서의 개요는 다음과 같이 표시할 수 있다:
문서는 여러 개의 최상위 제목을 포함할 수 있다:
<!DOCTYPE HTML>
< html lang = en >
< title > Alphabetic Fruit</ title >
< h1 > Apples</ h1 >
< p > Pomaceous.</ p >
< h1 > Bananas</ h1 >
< p > Edible.</ p >
< h1 > Carambola</ h1 >
< p > Star.</ p >
문서의 개요는 다음과 같이 표시할 수 있다:
header 요소는 문서의
개요에 영향을 주지 않는다:
<!DOCTYPE HTML>
< html lang = "en" >
< title > We're adopting a child! — Ray's blog</ title >
< h1 > Ray's blog</ h1 >
< article >
< header >
< nav >
< a href = "?t=-1d" > Yesterday</ a > ;
< a href = "?t=-7d" > Last week</ a > ;
< a href = "?t=-1m" > Last month</ a >
</ nav >
< h2 > We're adopting a child!</ h2 >
</ header >
< p > As of today, Janine and I have signed the papers to become
the proud parents of baby Diane! We've been looking forward to
this day for weeks.</ p >
</ article >
</ html >
문서의 개요는 다음과 같이 표시할 수 있다:
다음 예제는 적합하지만 제목 수준이 1인 제목이 없으므로 권장되지 않는다:
<!DOCTYPE HTML>
< html lang = en >
< title > Alphabetic Fruit</ title >
< section >
< h2 > Apples</ h2 >
< p > Pomaceous.</ p >
</ section >
< section >
< h2 > Bananas</ h2 >
< p > Edible.</ p >
</ section >
< section >
< h2 > Carambola</ h2 >
< p > Star.</ p >
</ section >
문서의 개요는 다음과 같이 표시할 수 있다:
다음 예제는 적합하지만 첫 번째 제목의 제목 수준이 1이 아니므로 권장되지 않는다:
<!DOCTYPE HTML>
< html lang = en >
< title > Feathers on The Site of Encyclopedic Knowledge</ title >
< h2 > A plea from our caretakers</ h2 >
< p > Please, we beg of you, send help! We're stuck in the server room!</ p >
< h1 > Feathers</ h1 >
< p > Epidermal growths.</ p >
문서의 개요는 다음과 같이 표시할 수 있다:
사용자 에이전트는 내비게이션을 돕기 위해 페이지 개요를 사용자에게 노출하는 것이 권장된다. 이는 특히 스크린 리더와 같은 비시각적 미디어에 해당한다.
예를 들어 사용자 에이전트는 화살표 키를 다음과 같이 매핑할 수 있다:
이 절은 비규범적이다.
| 요소 | 목적 |
|---|---|
| 예제 | |
body
|
문서의 콘텐츠. |
|
|
article
|
원칙적으로 독립적으로 배포하거나 재사용할 수 있는, 예를 들어 신디케이션에 사용할 수 있는 문서, 페이지, 애플리케이션 또는 사이트의 완전하거나 독립된 구성. 이는 포럼 게시물, 잡지 또는 신문 기사, 블로그 게시물, 사용자가 제출한 댓글, 대화형 위젯이나 가젯 또는 기타 독립적인 콘텐츠 항목일 수 있다. |
|
|
section
|
문서 또는 애플리케이션의 일반적인 섹션. 이 맥락에서 섹션은 일반적으로 제목을 포함하는 주제별 콘텐츠 그룹이다. |
|
|
nav
|
다른 페이지 또는 페이지 내의 일부로 연결되는 페이지의 섹션, 즉 내비게이션 링크가 있는 섹션. |
|
|
aside
|
aside 요소 주변의
콘텐츠와 간접적으로 관련되어 있으며 해당 콘텐츠와 분리된 것으로 간주할 수 있는 콘텐츠로
구성된 페이지의 섹션. 이러한 섹션은 인쇄된 타이포그래피에서 사이드바로 표시되는 경우가 많다.
|
|
|
h1–h6
|
제목 |
|
|
hgroup
|
제목과 관련 콘텐츠. 이 요소는 h1–h6
요소를 부제목, 대체 제목 또는 태그라인을 나타내는 콘텐츠를 포함하는 하나 이상의
p 요소와 함께
그룹화하는 데 사용할 수 있다.
|
|
|
header
|
소개 또는 내비게이션 보조 수단의 그룹. |
|
|
footer
|
가장 가까운 조상 섹셔닝 콘텐츠 요소의 푸터. 그러한 조상이 없으면 body 요소의 푸터이다. 푸터에는 일반적으로 해당 섹션의 작성자, 관련 문서로 연결되는 링크, 저작권 데이터 등과 같은 정보가 포함된다. |
|
이 절은 비규범적이다.
section은 다른
무언가의 일부를 이룬다. article은 그
자체로
하나의 독립된 대상이다. 하지만 어느 것이 어느 것인지 어떻게 알 수 있을까? 대부분의 실제 답은
"작성자의 의도에 따라 다르다"이다.
예를 들어 "이 즙이 많고 초록색인 사과는 애플파이의 훌륭한 속재료가 된다."라고만 쓰인 "Granny
Smith" 장이 있는 책을 상상할 수 있다. 다른 종류의 사과에 관한 다른 장이 많이 있을 것이므로 이는
section이
된다.
반면에 "Granny Smith. 이 즙이 많고 초록색인 사과는 애플파이의 훌륭한 속재료가 된다."라고만
쓰인 트윗, reddit 댓글, tumblr 게시물 또는 신문 분류 광고를 상상할 수도 있다. 그것이 전체
콘텐츠이므로 이는 article이 된다.
기사에 달린 댓글은 댓글을 다는 대상인 article의 일부가
아니므로 그 자체가 하나의 article이다.
p
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
hgroup 요소의
자식으로.p 요소 바로 뒤에
address, article,
aside, blockquote, details, dialog,
div, dl, fieldset, figcaption,
figure, footer, form, h1,
h2,
h3,
h4,
h5,
h6,
header,
hgroup, hr, main, menu, nav,
ol, p, pre, search, section,
table 또는 ul 요소가 오면 종료 태그를 생략할 수 있다. 또는 부모
요소에 더 이상 콘텐츠가 없고 부모 요소가 a, audio, del, ins, map,
noscript 또는 video 요소가 아닌 HTML 요소이거나 자율 사용자 정의
요소인 경우에도 생략할 수 있다.
[Exposed =Window ]
interface HTMLParagraphElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
단락은 일반적으로 시각적 미디어에서 빈 줄을 통해 인접한 블록과 물리적으로 분리된 텍스트 블록으로 나타내지만, 스타일시트 또는 사용자 에이전트가 인라인 단락 기호(¶)를 사용하는 것처럼 단락 구분을 다른 방식으로 표시하는 것도 마찬가지로 타당하다.
다음 예제는 적합한 HTML 조각이다:
< p > The little kitten gently seated herself on a piece of
carpet. Later in her life, this would be referred to as the time the
cat sat on the mat.</ p >
< fieldset >
< legend > Personal information</ legend >
< p >
< label > Name: < input name = "n" ></ label >
< label >< input name = "anon" type = "checkbox" > Hide from other users</ label >
</ p >
< p >< label > Address: < textarea name = "a" ></ textarea ></ label ></ p >
</ fieldset >
< p > There was once an example from Femley,< br >
Whose markup was of dubious quality.< br >
The validator complained,< br >
So the author was pained,< br >
To move the error from the markup to the rhyming.</ p >
더 구체적인 요소가 더 적절한 경우 p 요소를 사용하지 않는 것이
좋다.
다음 예제는 기술적으로 올바르다:
< section >
<!-- ... -->
< p > Last modified: 2001-04-23</ p >
< p > Author: fred@example.com</ p >
</ section >
그러나 다음과 같이 마크업하는 것이 더 좋다:
< section >
<!-- ... -->
< footer > Last modified: 2001-04-23</ footer >
< address > Author: fred@example.com</ address >
</ section >
또는:
< section >
<!-- ... -->
< footer >
< p > Last modified: 2001-04-23</ p >
< address > Author: fred@example.com</ address >
</ footer >
</ section >
목록 요소(특히 ol 및
ul 요소)는 p 요소의 자식이 될 수 없다.
따라서 문장에 글머리 기호 목록이 포함된 경우 이를 어떻게 마크업해야 하는지 궁금할 수 있다.
예를 들어 이 환상적인 문장에는 다음과 관련된 글머리 기호가 있다
그리고 아래에서 더 자세히 설명한다.
해결책은 HTML 용어에서 단락이 논리적 개념이 아니라 구조적 개념이라는 점을 이해하는 것이다. 위의 환상적인 예제에는 이 명세에서 정의한 단락이 실제로 다섯 개 있다. 목록 앞에 하나, 각 글머리 기호마다 하나씩, 목록 뒤에 하나가 있다.
따라서 위 예제의 마크업은 다음과 같이 작성할 수 있다:
< p > For instance, this fantastic sentence has bullets relating to</ p >
< ul >
< li > wizards,
< li > faster-than-light travel, and
< li > telepathy,
</ ul >
< p > and is further discussed below.</ p >
여러 개의 "구조적" 단락으로 구성된 이러한 "논리적" 단락을 편리하게 스타일링하려는 작성자는
p 요소 대신 div 요소를 사용할 수
있다.
따라서 예를 들어 위 예제는 다음과 같이 작성할 수 있다:
< div > For instance, this fantastic sentence has bullets relating to
< ul >
< li > wizards,
< li > faster-than-light travel, and
< li > telepathy,
</ ul >
and is further discussed below.</ div >
이 예제에는 여전히 다섯 개의 구조적 단락이 있지만, 이제 작성자는 예제의 각 부분을 별도로
고려하지 않고 div만 스타일링할 수
있다.
hr
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
select 요소의 자손으로.[Exposed =Window ]
interface HTMLHRElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
hr 요소가 나타내는 것은 단락 수준의 주제
구분, 예를 들어 이야기의 장면 전환이나 참고서의 한 섹션 안에서 다른 주제로의 전환이다.
또는 select 요소의
옵션 집합 사이에 있는 구분자를 나타낸다.
다음은 프로젝트 설명서의 가상 발췌문으로, 두 섹션에서
hr 요소를 사용하여 섹션
안의 주제를 구분하는 모습을 보여 준다.
< section >
< h1 > Communication</ h1 >
< p > There are various methods of communication. This section
covers a few of the important ones used by the project.</ p >
< hr >
< p > Communication stones seem to come in pairs and have mysterious
properties:</ p >
< ul >
< li > They can transfer thoughts in two directions once activated
if used alone.</ li >
< li > If used with another device, they can transfer one's
consciousness to another body.</ li >
< li > If both stones are used with another device, the
consciousnesses switch bodies.</ li >
</ ul >
< hr >
< p > Radios use the electromagnetic spectrum in the meter range and
longer.</ p >
< hr >
< p > Signal flares use the electromagnetic spectrum in the
nanometer range.</ p >
</ section >
< section >
< h1 > Food</ h1 >
< p > All food at the project is rationed:</ p >
< dl >
< dt > Potatoes</ dt >
< dd > Two per day</ dd >
< dt > Soup</ dt >
< dd > One bowl per day</ dd >
</ dl >
< hr >
< p > Cooking is done by the chefs on a set rotation.</ p >
</ section >
섹션 자체 사이에는 hr
요소가 필요하지 않다. 이는
section 요소와
h1
요소 자체가 주제 변경을
암시하기 때문이다.
Peter F. Hamilton의 Pandora's Star에서 가져온 다음 발췌문은 장면 전환에 앞서는 두
단락과 그 뒤에 오는 단락을 보여 준다. 인쇄된 책에서는 두 번째 단락과 세 번째 단락 사이에
중앙에 별 하나가 놓인 공백으로 표현된 장면 전환을 여기서는 hr 요소를 사용하여 나타낸다.
< p > Dudley was ninety-two, in his second life, and fast approaching
time for another rejuvenation. Despite his body having the physical
age of a standard fifty-year-old, the prospect of a long degrading
campaign within academia was one he regarded with dread. For a
supposedly advanced civilization, the Intersolar Commonwealth could be
appallingly backward at times, not to mention cruel.</ p >
< p >< i > Maybe it won't be that bad</ i > , he told himself. The lie was
comforting enough to get him through the rest of the night's
shift.</ p >
< hr >
< p > The Carlton AllLander drove Dudley home just after dawn. Like the
astronomer, the vehicle was old and worn, but perfectly capable of
doing its job. It had a cheap diesel engine, common enough on a
semi-frontier world like Gralmond, although its drive array was a
thoroughly modern photoneural processor. With its high suspension and
deep-tread tyres it could plough along the dirt track to the
observatory in all weather and seasons, including the metre-deep snow
of Gralmond's winters.</ p >
pre
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
[Exposed =Window ]
interface HTMLPreElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
pre 요소가 나타내는 것은 서식이 미리 지정된 텍스트 블록이며,
그 안의 구조는 요소가 아니라 타이포그래피 관례로 나타낸다.
HTML 구문에서
바로 뒤에 오는
pre 요소의 시작 태그 뒤의
선행 줄바꿈 문자는 제거된다.
pre 요소를 사용할 수 있는 경우의 예:
작성자는 음성 합성기, 점자 디스플레이 등의 사용자에게 발생하는 것처럼 서식이 사라질 때 서식이 미리 지정된 텍스트가 어떻게 경험될지 고려하는 것이 권장된다. ASCII 아트와 같은 경우에는 텍스트 설명과 같은 대체 표현이 문서의 독자에게 더 보편적으로 접근 가능할 가능성이 높다.
컴퓨터 코드 블록을 나타내려면 pre 요소를
code 요소와 함께 사용할 수
있으며, 컴퓨터 출력 블록을 나타내려면 pre
요소를
samp 요소와 함께 사용할 수 있다.
마찬가지로 kbd 요소는
사용할 수 있으며,
pre 요소 안에서 사용자가
입력할 텍스트를 나타낸다.
이 요소에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.
다음 코드 조각에서는 컴퓨터 코드 예제가 제시된다.
< p > This is the < code > Panel</ code > constructor:</ p >
< pre >< code > function Panel(element, canClose, closeHandler) {
this.element = element;
this.canClose = canClose;
this.closeHandler = function () { if (closeHandler) closeHandler() };
}</ code ></ pre >
다음 코드 조각에서는 samp와 kbd 요소가
pre 요소의 콘텐츠 안에서
함께 사용되어 Zork I 세션을 보여 준다.
< pre >< samp > You are in an open field west of a big white house with a boarded
front door.
There is a small mailbox here.
></ samp > < kbd > open mailbox</ kbd >
< samp > Opening the mailbox reveals:
A leaflet.
></ samp ></ pre >
다음은 pre 요소를 사용하여
시 자체의 본질적인 일부를 이루는 특이한 서식을 보존하는 현대시를 보여 준다.
< pre > maxling
it is with a heart
heavy
that i admit loss of a feline
so loved
a friend lost to the
unknown
(night)
~cdr 11dec07</ pre >
blockquote 요소
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
cite — 인용문
출처 또는 편집에 대한 추가 정보로 연결되는 링크
cite.
[Exposed =Window ]
interface HTMLQuoteElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , ReflectURL ] attribute USVString cite ;
};
HTMLQuoteElement 인터페이스는
q 요소에서도
사용된다.
blockquote
요소는
다른 출처에서 인용한 섹션을 나타낸다.
blockquote
안의 콘텐츠는 다른 출처에서 인용해야 하며, 해당 출처에 주소가 있는 경우 그 주소를 cite 속성에 지정할 수 있다.
cite
속성이 있으면 그 값은
공백으로 둘러싸일 수 있는 유효한
URL이어야 한다. 대응하는
인용 링크를 얻으려면 속성 값을 요소의 노드 문서를 기준으로 구문 분석해야 한다. 사용자 에이전트는
사용자가 이러한 인용 링크를 따라가도록 허용할 수 있지만, 이 링크는 주로 독자가 아니라 비공개 용도
(예: 사이트의 인용문 사용에 관한 통계를 수집하는 서버 측 스크립트)를 위한 것이다.
blockquote의
콘텐츠는 축약하거나 텍스트 언어의 관례적인 방식으로 맥락을 추가할 수 있다.
예를 들어 영어에서는 전통적으로 대괄호를 사용한다. "Jane ate the cracker. She then said she liked apples and fish."라는 문장이 있는 페이지를 생각해 보자. 다음과 같이 인용할 수 있다:
< blockquote >
< p > [Jane] then said she liked [...] fish.</ p >
</ blockquote >
인용문의 출처 표시는 있는 경우 blockquote
요소 밖에 배치해야 한다.
예를 들어 여기서는 인용문 뒤의 단락에 출처 표시가 제공된다:
< blockquote >
< p > I contend that we are both atheists. I just believe in one fewer
god than you do. When you understand why you dismiss all the other
possible gods, you will understand why I dismiss yours.</ p >
</ blockquote >
< p > — Stephen Roberts</ p >
아래의 다른 예제에서는 출처 표시를 나타내는 다른 방법을 보여 준다.
여기서는 blockquote
요소를 figure
요소 및 그 figcaption과 함께
사용하여 인용문과 출처 표시를 명확하게 연결한다. 출처 표시는 인용문의 일부가 아니므로 blockquote
자체 안에 속하지 않는다:
< figure >
< blockquote >
< p > The truth may be puzzling. It may take some work to grapple with.
It may be counterintuitive. It may contradict deeply held
prejudices. It may not be consonant with what we desperately want to
be true. But our preferences do not determine what's true. We have a
method, and that method helps us to reach not absolute truth, only
asymptotic approaches to the truth — never there, just closer
and closer, always finding vast new oceans of undiscovered
possibilities. Cleverly designed experiments are the key.</ p >
</ blockquote >
< figcaption > Carl Sagan, in "< cite > Wonder and Skepticism</ cite > ", from
the < cite > Skeptical Inquirer</ cite > Volume 19, Issue 1 (January-February
1995)</ figcaption >
</ figure >
다음 예제에서는 cite를 blockquote와 함께
사용하는 방법을 보여 준다:
< p > His next piece was the aptly named < cite > Sonnet 130</ cite > :</ p >
< blockquote cite = "https://quotes.example.org/s/sonnet130.html" >
< p > My mistress' eyes are nothing like the sun,< br >
Coral is far more red, than her lips red,< br >
...
이 예제에서는 포럼 게시물이 blockquote를
사용하여
사용자가 어떤 게시물에
답글을 작성하는지 보여 주는 방법을 설명한다. article 요소는
스레드 구조를 마크업하기 위해
각 게시물에 사용된다.
< article >
< h1 >< a href = "https://bacon.example.com/?blog=109431" > Bacon on a crowbar</ a ></ h1 >
< article >
< header >< strong > t3yw</ strong > 12 points 1 hour ago</ header >
< p > I bet a narwhal would love that.</ p >
< footer >< a href = "?pid=29578" > permalink</ a ></ footer >
< article >
< header >< strong > greg</ strong > 8 points 1 hour ago</ header >
< blockquote >< p > I bet a narwhal would love that.</ p ></ blockquote >
< p > Dude narwhals don't eat bacon.</ p >
< footer >< a href = "?pid=29579" > permalink</ a ></ footer >
< article >
< header >< strong > t3yw</ strong > 15 points 1 hour ago</ header >
< blockquote >
< blockquote >< p > I bet a narwhal would love that.</ p ></ blockquote >
< p > Dude narwhals don't eat bacon.</ p >
</ blockquote >
< p > Next thing you'll be saying they don't get capes and wizard
hats either!</ p >
< footer >< a href = "?pid=29580" > permalink</ a ></ footer >
< article >
< article >
< header >< strong > boing</ strong > -5 points 1 hour ago</ header >
< p > narwhals are worse than ceiling cat</ p >
< footer >< a href = "?pid=29581" > permalink</ a ></ footer >
</ article >
</ article >
</ article >
</ article >
< article >
< header >< strong > fred</ strong > 1 points 23 minutes ago</ header >
< blockquote >< p > I bet a narwhal would love that.</ p ></ blockquote >
< p > I bet they'd love to peel a banana too.</ p >
< footer >< a href = "?pid=29582" > permalink</ a ></ footer >
</ article >
</ article >
</ article >
이 예제에서는 짧은 코드 조각에 blockquote를
사용하는 방법을 보여 주며,
p 요소를 blockquote
요소 안에서 반드시 사용할 필요는 없음을 보여 준다:
< p > He began his list of "lessons" with the following:</ p >
< blockquote > One should never assume that his side of
the issue will be recognized, let alone that it will
be conceded to have merits.</ blockquote >
< p > He continued with a number of similar points, ending with:</ p >
< blockquote > Finally, one should be prepared for the threat
of breakdown in negotiations at any given moment and not
be cowed by the possibility.</ blockquote >
< p > We shall now discuss these points...
뒤의 섹션에는 대화를 나타내는 방법의 예제가 제시되어
있으며, 이 목적으로 cite 및 blockquote
요소를 사용하는 것은 적절하지 않다.
ol
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
li 요소가 포함된 경우: 실체적 콘텐츠.li 및 스크립트 지원
요소.reversed — 목록의 번호를
역순으로 지정
start — 목록의 시작 값
type — 목록 마커의 종류
reversed, start, type.
[Exposed =Window ]
interface HTMLOListElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , Reflect ] attribute boolean reversed ;
[CEReactions , Reflect , ReflectDefault=1] attribute long start ;
[CEReactions , Reflect ] attribute DOMString type ;
// also has obsolete members
};
ol 요소는 항목의 순서를
변경하면 문서의 의미가 바뀌도록 항목이 의도적으로 정렬된 목록을 나타낸다.
목록의 항목은 ol
요소의 li
요소 자식 노드이며, 트리 순서를 따른다.
현재의 모든 엔진에서 지원된다.
reversed 속성은
불리언 속성이다. 이 속성이 있으면
목록이 내림차순 목록
(..., 3, 2, 1)임을 나타낸다. 속성을 생략하면 목록은 오름차순 목록(1, 2, 3, ...)이다.
start 속성이
있으면 유효한 정수여야 한다. 이 속성은
목록의 시작 값을 결정하는 데 사용된다.
ol 요소에는 다음과 같이
결정되는 정수인 시작 값이 있다:
type 속성은
목록에서 사용할 마커의 종류가 중요한 경우(예:
항목을 번호나 문자로 참조하는 경우)에 이를
지정하는 데 사용할 수 있다.
이 속성을 지정하는 경우 다음 표의 행 가운데 첫 번째 셀에 제시된 문자 중 하나와 동일한 값이어야 한다.
type 속성은
첫 번째 셀이 속성 값과 일치하는 행의 두 번째 열 셀에 제시된 상태를 나타낸다.
일치하는 셀이 없거나 속성을 생략한 경우 이 속성은 decimal 상태를 나타낸다.
| 키워드 | 상태 | 설명 | 값 1~3 및 3999~4001의 예 | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
1
(U+0031)
|
decimal | 10진수 | 1. | 2. | 3. | ... | 3999. | 4000. | 4001. | ... |
a (U+0061)
|
lower-alpha | 라틴 소문자 | a. | b. | c. | ... | ewu. | ewv. | eww. | ... |
A (U+0041)
|
upper-alpha | 라틴 대문자 | A. | B. | C. | ... | EWU. | EWV. | EWW. | ... |
i (U+0069)
|
lower-roman | 로마 숫자 소문자 | i. | ii. | iii. | ... | mmmcmxcix. | i̅v̅. | i̅v̅i. | ... |
I (U+0049)
|
upper-roman | 로마 숫자 대문자 | I. | II. | III. | ... | MMMCMXCIX. | I̅V̅. | I̅V̅I. | ... |
사용자 에이전트는 ol 요소의
type 속성 상태와 일치하는
방식으로 목록의 항목을 렌더링해야 한다. 0 이하의 숫자는 type
속성과 관계없이 항상 10진법을
사용해야 한다.
CSS 사용자 에이전트의 경우 이 속성을 'list-style-type' CSS 속성에 매핑하는 방법이 렌더링 섹션에 제시되어 있다. 이 매핑은 단순하며 위의 상태는 대응하는 CSS 값과 같은 이름을 가진다.
CSS 사용자 에이전트에서 이 속성을 구현하는 데 사용하는 기본 CSS 목록 스타일을 다시 정의할 수 있으며, 이렇게 하면 목록 항목의 렌더링 방식에 영향을 준다.
[ReflectDefault]로 인해
start IDL 속성은
start 콘텐츠 속성이 생략되고
reversed 콘텐츠 속성이
지정된 경우 목록의 시작 값과 반드시 일치하지는 않는다.
다음 마크업은 순서가 중요하여 ol
요소가 적절한 목록을 보여 준다. 동일한 항목에 ul 요소를
사용하는 예를 보려면
이 목록을 ul
섹션의 동등한 목록과 비교하라.
< p > I have lived in the following countries (given in the order of when
I first lived there):</ p >
< ol >
< li > Switzerland
< li > United Kingdom
< li > United States
< li > Norway
</ ol >
목록의 순서를 변경하면 문서의 의미가 어떻게 달라지는지 주목하라. 다음 예제에서는 처음 두 항목의 상대적인 순서를 변경하여 작성자의 출생지가 바뀌었다:
< p > I have lived in the following countries (given in the order of when
I first lived there):</ p >
< ol >
< li > United Kingdom
< li > Switzerland
< li > United States
< li > Norway
</ ol >
ul
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
li 요소가 포함된 경우: 실체적 콘텐츠.li 및 스크립트 지원
요소.[Exposed =Window ]
interface HTMLUListElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
ul 요소는 항목의 순서가
중요하지 않은 목록, 즉 순서를 변경해도 문서의 의미가 실질적으로 바뀌지 않는 목록을 나타낸다.
다음 마크업은 순서가 중요하지 않아
ul 요소가 적절한 목록을
보여 준다. 동일한 항목에 ol 요소를 사용하는 예를 보려면
이 목록을 ol 섹션의
동등한 목록과 비교하라.
< p > I have lived in the following countries:</ p >
< ul >
< li > Norway
< li > Switzerland
< li > United Kingdom
< li > United States
</ ul >
목록의 순서를 변경해도 문서의 의미가 달라지지 않는다는 점에 주목하라. 위 코드 조각의 항목은 알파벳순으로 제시되어 있지만, 아래 코드 조각에서는 문서의 의미를 전혀 바꾸지 않고 2007년 당시 계좌 잔액의 크기순으로 제시한다:
< p > I have lived in the following countries:</ p >
< ul >
< li > Switzerland
< li > Norway
< li > United Kingdom
< li > United States
</ ul >
menu 요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
li 요소가 포함된 경우: 실체적 콘텐츠.li 및 스크립트 지원
요소.[Exposed =Window ]
interface HTMLMenuElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
menu 요소는
콘텐츠로 구성된 도구 모음을 나타낸다.
콘텐츠는 항목의 순서 없는 목록(li 요소로 나타냄)
형식이며,
각 항목은 사용자가 수행하거나 활성화할 수 있는 명령을 나타낸다.
menu 요소는
명령의 순서 없는 목록("도구 모음")을 표현하기 위한 ul의
의미론적 대안일 뿐이다.
이 예제에서 텍스트 편집 애플리케이션은 menu
요소를 사용하여
일련의 편집 명령을 제공한다:
< menu >
< li >< button onclick = "copy()" >< img src = "copy.svg" alt = "Copy" ></ button ></ li >
< li >< button onclick = "cut()" >< img src = "cut.svg" alt = "Cut" ></ button ></ li >
< li >< button onclick = "paste()" >< img src = "paste.svg" alt = "Paste" ></ button ></ li >
</ menu >
이를 일반적인 도구 모음 메뉴처럼 보이게 하는 스타일링은 애플리케이션이 담당한다는 점에 주목하라.
li
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
ol 요소 내부.ul 요소 내부.menu 요소 내부.li 요소 바로 뒤에 다른
li 요소가 오거나 부모 요소에
더 이상의 콘텐츠가 없으면 li 요소의 종료 태그를 생략할 수 있다.
ul 또는 menu 요소의 자식이 아닌 경우:
value — 목록 항목의 서수 값
value.
[Exposed =Window ]
interface HTMLLIElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , Reflect ] attribute long value ;
// also has obsolete members
};
li 요소는 목록 항목을 나타낸다. 부모 요소가
ol, ul 또는 menu 요소이면 이 요소는
해당 요소에 정의된 부모 요소 목록의 항목이다. 그렇지 않으면 목록 항목에는 다른 li 요소와의
목록 관련 관계가 정의되지 않는다.
value 속성이
있으면 유효한 정수여야 한다. 이 속성은
li의 목록 소유자가
ol 요소인 경우 목록 항목의
서수
값을 결정하는 데 사용된다.
주어진 목록 소유자 owner가 소유한 각 요소의 서수 값을 결정하려면 다음 단계를 수행한다:
i를 1로 둔다.
owner가 ol 요소이면
numbering을 owner의 시작
값으로 둔다. 그렇지 않으면
numbering을 1로 둔다.
반복: i가 owner가 소유한 목록 항목의 수보다 크면 반환한다. owner가 소유한 모든 목록 항목에 서수 값이 할당되었다.
parsed를 속성 값을 정수로 구문 분석한 결과로 둔다.
parsed가 오류가 아니면 numbering을 parsed로 설정한다.
item의 서수 값은 numbering이다.
owner가 ol 요소이고
owner에 reversed
속성이 있으면
numbering을 1만큼 감소시킨다.
그렇지 않으면 numbering을 1만큼 증가시킨다.
i를 1만큼 증가시킨다.
반복이라고 표시된 단계로 이동한다.
요소의 value IDL 속성은
요소의 서수 값과 직접
대응하지 않는다. 단지 콘텐츠 속성을 반영할 뿐이다. 예를 들어 다음 목록이 있다고 하자:
< ol >
< li > Item 1
< li value = "3" > Item 3
< li > Item 4
</ ol >
다음 예제에서는 상위 10개 영화를 역순으로 나열한다. figure 요소와 그 figcaption
요소를 사용하여 목록에 제목을 부여하는 방식에 주목하라.
< figure >
< figcaption > The top 10 movies of all time</ figcaption >
< ol >
< li value = "10" >< cite > Josie and the Pussycats</ cite > , 2001</ li >
< li value = "9" >< cite lang = "sh" > Црна мачка, бели мачор</ cite > , 1998</ li >
< li value = "8" >< cite > A Bug's Life</ cite > , 1998</ li >
< li value = "7" >< cite > Toy Story</ cite > , 1995</ li >
< li value = "6" >< cite > Monsters, Inc</ cite > , 2001</ li >
< li value = "5" >< cite > Cars</ cite > , 2006</ li >
< li value = "4" >< cite > Toy Story 2</ cite > , 1999</ li >
< li value = "3" >< cite > Finding Nemo</ cite > , 2003</ li >
< li value = "2" >< cite > The Incredibles</ cite > , 2004</ li >
< li value = "1" >< cite > Ratatouille</ cite > , 2007</ li >
</ ol >
</ figure >
ol 요소에 reversed 속성을 사용하여
다음과 같이 마크업할 수도 있다:
< figure >
< figcaption > The top 10 movies of all time</ figcaption >
< ol reversed >
< li >< cite > Josie and the Pussycats</ cite > , 2001</ li >
< li >< cite lang = "sh" > Црна мачка, бели мачор</ cite > , 1998</ li >
< li >< cite > A Bug's Life</ cite > , 1998</ li >
< li >< cite > Toy Story</ cite > , 1995</ li >
< li >< cite > Monsters, Inc</ cite > , 2001</ li >
< li >< cite > Cars</ cite > , 2006</ li >
< li >< cite > Toy Story 2</ cite > , 1999</ li >
< li >< cite > Finding Nemo</ cite > , 2003</ li >
< li >< cite > The Incredibles</ cite > , 2004</ li >
< li >< cite > Ratatouille</ cite > , 2007</ li >
</ ol >
</ figure >
li 요소 안에 제목 요소(예:
h1)를
포함하는 것은 적합하지만, 작성자가 의도한 의미 체계를 전달하지 못할 가능성이 높다.
제목은 새 섹션을 시작하므로 목록 안의 제목은 암시적으로 목록을 여러 섹션에 걸치도록 분할한다.
dl
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
dt 요소 뒤에 하나 이상의
dd 요소가 오는 그룹 0개 이상.
선택적으로 스크립트 지원
요소를 중간에 섞을 수 있다.
div 요소.
선택적으로 스크립트 지원 요소를
중간에 섞을 수 있다.[Exposed =Window ]
interface HTMLDListElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
dl 요소는 0개 이상의
이름-값 그룹으로 구성된 연관 목록(설명 목록)을 나타낸다. 이름-값 그룹은 하나 이상의 이름(dt 요소, div 요소 자식의 자식일 수 있음)
뒤에 하나 이상의 값(dd 요소, div 요소
자식의 자식일 수 있음)이 오는 형식이다. 이때 dt 및
dd 요소 자식과
div 요소
자식의 자식인 dt 및 dd 요소를 제외한 노드는
무시한다. 하나의 dl 요소 안에는 각 이름마다
하나를 초과하는 dt 요소가 없어야 한다.
이름-값 그룹은 용어와 정의, 메타데이터 주제와 값, 질문과 답변 또는 다른 모든 이름-값 데이터 그룹일 수 있다.
그룹 안의 값은 대안 관계이다. 같은 값의 일부를 구성하는 여러 단락은 모두 같은 dd 요소 안에 제공해야 한다.
그룹 목록의 순서와 각 그룹 안의 이름 및 값의 순서는 중요할 수 있다.
그룹에 마이크로데이터 속성이나
전체 그룹에 적용되는 기타 전역 속성을 주석으로 추가하거나 단순히 스타일링하기
위해
dl 요소의 각 그룹을 div 요소로 감쌀 수 있다.
이는 dl 요소의 의미 체계를
변경하지 않는다.
dl 요소
dl의 이름-값 그룹은 다음 알고리즘을 사용하여 결정한다. 이름-값 그룹에는
이름(초기에는 비어 있는 dt 요소의 목록)과
값(초기에는 비어 있는 dd 요소의 목록)이 있다.
groups를 이름-값 그룹의 빈 목록으로 둔다.
current를 새 이름-값 그룹으로 둔다.
seenDd를 false로 둔다.
child를 dl의 첫 번째 자식으로 둔다.
grandchild를 null로 둔다.
child가 null이 아닌 동안:
child가 div
요소이면:
grandchild를 child의 첫 번째 자식으로 둔다.
grandchild가 null이 아닌 동안:
grandchild에 대해 dt 또는
dd 처리를 수행한다.
grandchild를 grandchild의 다음 형제로 설정한다.
그렇지 않으면 child에 대해 dt
또는 dd 처리를 수행한다.
child를 child의 다음 형제로 설정한다.
current가 비어 있지 않으면 current를 groups에 추가한다.
groups를 반환한다.
노드 node에 대해 dt 또는
dd를 처리한다는 것은 다음 단계를 수행하는 것을 의미한다:
이름-값 그룹의 이름 또는 값이 빈 목록이면 대개 dd 요소를 dt 요소 대신 사용하거나 그 반대로
잘못 사용했기 때문이다. 적합성 검사기는 이러한 실수를 찾아내고 작성자에게 마크업을 올바르게 사용하는
방법을 안내할 수 있다.
다음 예제에서는 하나의 항목("Authors")이 두 값("John"과 "Luke")에 연결되어 있다.
< dl >
< dt > Authors
< dd > John
< dd > Luke
< dt > Editor
< dd > Frank
</ dl >
다음 예제에서는 하나의 정의가 두 용어에 연결되어 있다.
< dl >
< dt lang = "en-US" > < dfn > color</ dfn > </ dt >
< dt lang = "en-GB" > < dfn > colour</ dfn > </ dt >
< dd > A sensation which (in humans) derives from the ability of
the fine structure of the eye to distinguish three differently
filtered analyses of a view. </ dd >
</ dl >
다음 예제는 dl 요소를 사용하여 일종의
메타데이터를 마크업하는 방법을 보여 준다. 예제의 마지막에는 하나의 그룹에 두 메타데이터 레이블
("Authors"와 "Editors")과 두 값("Robert Rothman"과 "Daniel Jackson")이 있다. 이 예제에서는
스타일링을 돕기 위해 dt 및 dd 요소 그룹 주위에
div 요소도 사용한다.
< dl >
< div >
< dt > Last modified time </ dt >
< dd > 2004-12-23T23:33Z </ dd >
</ div >
< div >
< dt > Recommended update interval </ dt >
< dd > 60s </ dd >
</ div >
< div >
< dt > Authors </ dt >
< dt > Editors </ dt >
< dd > Robert Rothman </ dd >
< dd > Daniel Jackson </ dd >
</ div >
</ dl >
다음 예제는 dl 요소를 사용하여 일련의
지침을 제공하는 방법을 보여 준다.
여기서는 지침의 순서가 중요하다. 다른 예제에서는 블록의 순서가 중요하지 않았다.
< p > Determine the victory points as follows (use the
first matching case):</ p >
< dl >
< dt > If you have exactly five gold coins </ dt >
< dd > You get five victory points </ dd >
< dt > If you have one or more gold coins, and you have one or more silver coins </ dt >
< dd > You get two victory points </ dd >
< dt > If you have one or more silver coins </ dt >
< dd > You get one victory point </ dd >
< dt > Otherwise </ dt >
< dd > You get no victory points </ dd >
</ dl >
다음 코드 조각은 dl 요소를 용어집으로 사용하는
방법을 보여 준다. 정의되는 단어를 나타내기 위해 dfn을
사용하는 점에 주목하라.
< dl >
< dt >< dfn > Apartment</ dfn > , n.</ dt >
< dd > An execution context grouping one or more threads with one or
more COM objects.</ dd >
< dt >< dfn > Flat</ dfn > , n.</ dt >
< dd > A deflated tire.</ dd >
< dt >< dfn > Home</ dfn > , n.</ dt >
< dd > The user's login directory.</ dd >
</ dl >
이 예제는 dl 요소에서 마이크로데이터 속성과 div 요소를 함께 사용하여
프랑스 레스토랑의 아이스크림 디저트에 주석을 추가한다.
< dl >
< div itemscope itemtype = "http://schema.org/Product" >
< dt itemprop = "name" > Café ou Chocolat Liégeois
< dd itemprop = "offers" itemscope itemtype = "http://schema.org/Offer" >
< span itemprop = "price" > 3.50</ span >
< data itemprop = "priceCurrency" value = "EUR" > €</ data >
< dd itemprop = "description" >
2 boules Café ou Chocolat, 1 boule Vanille, sauce café ou chocolat, chantilly
</ div >
< div itemscope itemtype = "http://schema.org/Product" >
< dt itemprop = "name" > Américaine
< dd itemprop = "offers" itemscope itemtype = "http://schema.org/Offer" >
< span itemprop = "price" > 3.50</ span >
< data itemprop = "priceCurrency" value = "EUR" > €</ data >
< dd itemprop = "description" >
1 boule Crème brûlée, 1 boule Vanille, 1 boule Caramel, chantilly
</ div >
</ dl >
div 요소가 없으면
다음과 같이 itemref 속성을
사용하여 dd 요소의 데이터를
항목과 연결해야 한다.
< dl >
< dt itemscope itemtype = "http://schema.org/Product" itemref = "1-offer 1-description" >
< span itemprop = "name" > Café ou Chocolat Liégeois</ span >
< dd id = "1-offer" itemprop = "offers" itemscope itemtype = "http://schema.org/Offer" >
< span itemprop = "price" > 3.50</ span >
< data itemprop = "priceCurrency" value = "EUR" > €</ data >
< dd id = "1-description" itemprop = "description" >
2 boules Café ou Chocolat, 1 boule Vanille, sauce café ou chocolat, chantilly
< dt itemscope itemtype = "http://schema.org/Product" itemref = "2-offer 2-description" >
< span itemprop = "name" > Américaine</ span >
< dd id = "2-offer" itemprop = "offers" itemscope itemtype = "http://schema.org/Offer" >
< span itemprop = "price" > 3.50</ span >
< data itemprop = "priceCurrency" value = "EUR" > €</ data >
< dd id = "2-description" itemprop = "description" >
1 boule Crème brûlée, 1 boule Vanille, 1 boule Caramel, chantilly
</ dl >
dl 요소는
대화를 마크업하는 데 적절하지 않다. 대화를 마크업하는 방법의 예제를 참조하라.
dt
요소현재의 모든 엔진에서 지원된다.
dl 요소 안의 dd 또는 dt 요소 앞.dl 요소의 자식인 div 요소 안의 dd 또는 dt 요소 앞.
header, footer, 섹셔닝 콘텐츠 또는 제목 콘텐츠 자손은 없어야 한다.dt 요소 바로 뒤에
다른 dt 요소 또는
dd 요소가 오면
dt 요소의 종료 태그를 생략할 수 있다.
HTMLElement를 사용한다.dt 요소는 설명 목록(dl 요소)에 있는
용어-설명 그룹의 용어 또는 이름 부분을 나타낸다.
dt 요소 자체는
dl 요소에서 사용될 때
그 콘텐츠가 정의되는 용어임을 나타내지 않지만, 이는 dfn
요소를 사용하여 나타낼 수 있다.
이 예제는 질문에는 dt 요소를 사용하고 답변에는
dd 요소를 사용하여
마크업한 자주 묻는 질문(FAQ) 목록을 보여 준다.
< article >
< h1 > FAQ</ h1 >
< dl >
< dt > What do we want?</ dt >
< dd > Our data.</ dd >
< dt > When do we want it?</ dt >
< dd > Now.</ dd >
< dt > Where is it?</ dt >
< dd > We are not sure.</ dd >
</ dl >
</ article >
dd
요소현재의 모든 엔진에서 지원된다.
dl 요소 안의 dt 또는 dd 요소 뒤.dl 요소의 자식인 div 요소 안의 dt 또는 dd 요소 뒤.
dd 요소 바로 뒤에
다른 dd 요소 또는
dt 요소가 오거나
부모 요소에 더 이상의 콘텐츠가 없으면 dd 요소의 종료 태그를 생략할 수 있다.
HTMLElement를 사용한다.dd 요소는 설명 목록(dl 요소)에 있는
용어-설명 그룹의 설명, 정의 또는 값 부분을 나타낸다.
dl은 사전처럼
어휘 목록을 정의하는 데 사용할 수 있다. 다음 예제에서 dfn을 포함한 dt로 제공되는 각 항목에는
정의의 여러 부분을 보여 주는 여러 dd가 있다.
< dl >
< dt >< dfn > happiness</ dfn ></ dt >
< dd class = "pronunciation" > /ˈhæpinəs/</ dd >
< dd class = "part-of-speech" >< i >< abbr > n.</ abbr ></ i ></ dd >
< dd > The state of being happy.</ dd >
< dd > Good fortune; success. < q > Oh < b > happiness</ b > ! It worked!</ q ></ dd >
< dt >< dfn > rejoice</ dfn ></ dt >
< dd class = "pronunciation" > /rɪˈdʒɔɪs/</ dd >
< dd >< i class = "part-of-speech" >< abbr > v.intr.</ abbr ></ i > To be delighted oneself.</ dd >
< dd >< i class = "part-of-speech" >< abbr > v.tr.</ abbr ></ i > To cause one to be delighted.</ dd >
</ dl >
figure
요소현재의 모든 엔진에서 지원된다.
figcaption 요소
뒤에 플로 콘텐츠.figcaption
요소.HTMLElement를 사용한다.figure 요소는
선택적으로 캡션을 포함하며 자체적으로 완결된(완전한 문장과 같은) 일부 플로
콘텐츠를 나타낸다. 일반적으로 문서의 주요 흐름에서
하나의 단위로 참조된다.
이 맥락에서 "자체적으로 완결된"은 반드시 독립적이라는 의미는 아니다. 예를 들어
단락의 각 문장은 자체적으로 완결되어 있다. 문장의 일부인 이미지는 figure에
적절하지 않지만, 이미지로 구성된 전체 문장은
적절하다.
따라서 이 요소는 삽화, 다이어그램, 사진, 코드 목록 등에 주석을 달기 위해 사용할 수 있다.
figure를
캡션(예: 그림 번호)으로 식별하여 문서의 주요 콘텐츠에서 참조하면, 문서의 흐름에 영향을 주지 않고
해당 콘텐츠를 주요 콘텐츠에서 멀리, 예를 들어 페이지 옆, 전용 페이지 또는 부록으로 쉽게
이동할 수 있다.
figure 요소를
상대적 위치로 참조하는 경우, 예를 들어
"위 사진에서" 또는 "다음 그림에서 보듯이"라고 하면 그림을 이동할 때 페이지의 의미가 손상된다.
작성자는 페이지의 의미에 영향을 주지 않고 쉽게 스타일을 다시 지정할 수 있도록 이러한 상대적 참조
대신 레이블을 사용하여 그림을 참조하는 것을 고려하는 것이 권장된다.
요소의 첫 번째 figcaption 요소
자식이 있으면 해당 요소는 figure 요소
콘텐츠의
캡션을 나타낸다. 자식
figcaption
요소가 없으면 캡션도 없다.
figure 요소의
콘텐츠는 주변 흐름의 일부이다. 이미지 공유 사이트의 사진처럼 페이지의 목적이 그림을 표시하는
것이라면 figure 및 figcaption 요소를
사용하여 해당 그림의 캡션을 명시적으로 제공할 수 있다. 주변 흐름과 간접적으로만 관련되거나 주변
흐름과 별개의 목적을 제공하는 콘텐츠에는 aside
요소를 사용해야 하며,
이 요소 자체가 figure를 감쌀 수
있다.
예를 들어 article의 콘텐츠를
반복하는 강조 인용문은 콘텐츠의 일부가 아니라 독자의 관심을 끌거나 핵심 주제를 강조하기 위해
콘텐츠를 반복하는 것이므로 figure보다
aside에 배치하는 것이
더 적절하다.
이 예제는 figure 요소를
사용하여
코드 목록을 마크업하는 방법을 보여 준다.
< p > In < a href = "#l4" > listing 4</ a > we see the primary core interface
API declaration.</ p >
< figure id = "l4" >
< figcaption > Listing 4. The primary core interface API declaration.</ figcaption >
< pre >< code > interface PrimaryCore {
boolean verifyDataLine();
undefined sendData(sequence< byte> data);
undefined initSelfDestruct();
}</ code ></ pre >
</ figure >
< p > The API is designed to use UTF-8.</ p >
여기서는 페이지의 주요 콘텐츠인 사진을 갤러리에서처럼 마크업하기 위한 figure 요소를 보여 준다.
<!DOCTYPE HTML>
< html lang = "en" >
< title > Bubbles at work — My Gallery™</ title >
< figure >
< img src = "bubbles-work.jpeg"
alt = "Bubbles, sitting in his office chair, works on his
latest project intently." >
< figcaption > Bubbles at work</ figcaption >
</ figure >
< nav >< a href = "19414.html" > Prev</ a > — < a href = "19416.html" > Next</ a ></ nav >
이 예제에서는 그림이 아닌 이미지와 그림인 이미지 및 비디오를 함께 보여 준다.
첫 번째 이미지는 문자 그대로 예제의 두 번째 문장의 일부이므로 자체적으로 완결된 단위가 아니며,
따라서 figure는
적절하지 않다.
< h2 > Malinko's comics</ h2 >
< p > This case centered on some sort of "intellectual property"
infringement related to a comic (see Exhibit A). The suit started
after a trailer ending with these words:
< blockquote >
< img src = "promblem-packed-action.png" alt = "ROUGH COPY! Promblem-Packed Action!" >
</ blockquote >
< p > ...was aired. A lawyer, armed with a Bigger Notebook, launched a
preemptive strike using snowballs. A complete copy of the trailer is
included with Exhibit B.
< figure >
< img src = "ex-a.png" alt = "Two squiggles on a dirty piece of paper." >
< figcaption > Exhibit A. The alleged < cite > rough copy</ cite > comic.</ figcaption >
</ figure >
< figure >
< video src = "ex-b.mov" ></ video >
< figcaption > Exhibit B. The < cite > Rough Copy</ cite > trailer.</ figcaption >
</ figure >
< p > The case was resolved out of court.
여기서는 시의 일부를 figure를
사용하여
마크업한다.
< figure >
< p > 'Twas brillig, and the slithy toves< br >
Did gyre and gimble in the wabe;< br >
All mimsy were the borogoves,< br >
And the mome raths outgrabe.</ p >
< figcaption >< cite > Jabberwocky</ cite > (first verse). Lewis Carroll, 1832-98</ figcaption >
</ figure >
성에 관해 논의하는 훨씬 더 큰 저작의 일부일 수 있는 이 예제에서는 중첩된
figure 요소를
사용하여 그룹 캡션과 그룹 내 각 그림의 개별 캡션을 모두 제공한다:
< figure >
< figcaption > The castle through the ages: 1423, 1858, and 1999 respectively.</ figcaption >
< figure >
< figcaption > Etching. Anonymous, ca. 1423.</ figcaption >
< img src = "castle1423.jpeg" alt = "The castle has one tower, and a tall wall around it." >
</ figure >
< figure >
< figcaption > Oil-based paint on canvas. Maria Towle, 1858.</ figcaption >
< img src = "castle1858.jpeg" alt = "The castle now has two towers and two walls." >
</ figure >
< figure >
< figcaption > Film photograph. Peter Jankle, 1999.</ figcaption >
< img src = "castle1999.jpeg" alt = "The castle lies in ruins, the original tower all that remains in one piece." >
</ figure >
</ figure >
앞의 예제는 다음과 같이 더 간결하게 작성할 수도 있다. 중첩된 figure/figcaption 쌍 대신
title 속성을 사용한다:
< figure >
< img src = "castle1423.jpeg" title = "Etching. Anonymous, ca. 1423."
alt = "The castle has one tower, and a tall wall around it." >
< img src = "castle1858.jpeg" title = "Oil-based paint on canvas. Maria Towle, 1858."
alt = "The castle now has two towers and two walls." >
< img src = "castle1999.jpeg" title = "Film photograph. Peter Jankle, 1999."
alt = "The castle lies in ruins, the original tower all that remains in one piece." >
< figcaption > The castle through the ages: 1423, 1858, and 1999 respectively.</ figcaption >
</ figure >
그림은 때때로 콘텐츠에서 암시적으로만 참조된다:
< article >
< h1 > Fiscal negotiations stumble in Congress as deadline nears</ h1 >
< figure >
< img src = "obama-reid.jpeg" alt = "Obama and Reid sit together smiling in the Oval Office." >
< figcaption > Barack Obama and Harry Reid. White House press photograph.</ figcaption >
</ figure >
< p > Negotiations in Congress to end the fiscal impasse sputtered on Tuesday, leaving both chambers
grasping for a way to reopen the government and raise the country's borrowing authority with a
Thursday deadline drawing near.</ p >
...
</ article >
figcaption 요소
현재의 모든 엔진에서 지원된다.
figure 요소의 첫 번째
또는 마지막 자식.HTMLElement를 사용한다.figcaption
요소는
부모 figure 요소가 있는 경우
그 요소에서 나머지 콘텐츠를 설명하는 캡션 또는 범례를 나타낸다.
이 요소에는 출처에 관한 추가 정보를 포함할 수 있다:
< figcaption >
< p > A duck.</ p >
< p >< small > Photograph courtesy of 🌟 News.</ small ></ p >
</ figcaption >
< figcaption >
< p > Average rent for 3-room apartments, excluding non-profit apartments</ p >
< p > Zürich’s Statistics Office — < time datetime = 2017-11-14 > 14 November 2017</ time ></ p >
</ figcaption >
main
요소현재의 모든 엔진에서 지원된다.
main 요소인 경우에만 해당한다.
HTMLElement를 사용한다.문서에는 속성이 지정되지
않은 main 요소가 둘 이상 있어서는
안 된다.
계층적으로 올바른 main 요소는 조상 요소가
html, body, div, 접근 가능한 이름이 없는 form 및 자율 사용자 정의 요소로
제한되는 요소이다. 각 main 요소는
계층적으로
올바른 main
요소여야 한다.
이 예제에서 작성자는 페이지의 각 구성 요소가 상자 안에 렌더링되는 표현 방식을 사용했다.
헤더, 푸터, 내비게이션 바 및 사이드바와 구별하여 페이지의 주요 콘텐츠를 감싸기 위해 main 요소를 사용한다.
<!DOCTYPE html>
< html lang = "en" >
< title > RPG System 17</ title >
< style >
header , nav , aside , main , footer {
margin : 0.5 em ; border : thin solid ; padding : 0.5 em ;
background : #EFF ; color : black ; box-shadow : 0 0 0.25 em #033 ;
}
h1 , h2 , p { margin : 0 ; }
nav , main { float : left ; }
aside { float : right ; }
footer { clear : both ; }
</ style >
< header >
< h1 > System Eighteen</ h1 >
</ header >
< nav >
< a href = "../16/" > ← System 17</ a >
< a href = "../18/" > RPXIX →</ a >
</ nav >
< aside >
< p > This system has no HP mechanic, so there's no healing.
</ aside >
< main >
< h2 > Character creation</ h2 >
< p > Attributes (magic, strength, agility) are purchased at the cost of one point per level.</ p >
< h2 > Rolls</ h2 >
< p > Each encounter, roll the dice for all your skills. If you roll more than the opponent, you win.</ p >
</ main >
< footer >
< p > Copyright © 2013
</ footer >
</ html >
다음 예제에서는 여러 main 요소를 사용하고,
서버 왕복 없이 내비게이션이 작동하도록 스크립트를 사용하며 현재 항목이 아닌 요소에는 속성을 설정한다:
<!doctype html>
< html lang = en-CA >
< meta charset = utf-8 >
< title > … </ title >
< link rel = stylesheet href = spa.css >
< script src = spa.js async ></ script >
< nav >
< a href = / > Home</ a >
< a href = /about > About</ a >
< a href = /contact > Contact</ a >
</ nav >
< main >
< h1 > Home</ h1 >
…
</ main >
< main hidden >
< h1 > About</ h1 >
…
</ main >
< main hidden >
< h1 > Contact</ h1 >
…
</ main >
< footer > Made with ❤️ by < a href = https://example.com/ > Example 👻</ a > .</ footer >
search
요소현재 엔진에서는 지원되지 않는다.
HTMLElement를 사용한다.search 요소는 검색 또는
필터링 작업 수행과 관련된 일련의 폼 컨트롤이나 기타 콘텐츠를 포함하는 문서 또는 애플리케이션의
일부를 나타낸다. 이는 웹 사이트나
애플리케이션 검색, 현재 웹 페이지에서 검색 결과를 검색하거나 필터링하는 방법 또는 전역이나
인터넷 전체를 대상으로 하는 검색 기능일 수 있다.
검색 결과를 표시하기 위해서만 search 요소를 사용하는
것은 적절하지 않다. 다만 "빠른 검색" 결과의 일부인 제안과 링크는 검색 기능의 일부로 포함할 수 있다.
대신 반환된 검색 결과 웹 페이지는 해당 웹 페이지의 주요 콘텐츠 일부로 표시되어야 한다.
다음 예제에서 작성자는 웹 페이지의 header 안에 검색 폼을
포함한다:
< header >
< h1 >< a href = "/" > My fancy blog</ a ></ h1 >
...
< search >
< form action = "search.php" >
< label for = "query" > Find an article</ label >
< input id = "query" name = "q" type = "search" >
< button type = "submit" > Go!</ button >
</ form >
</ search >
</ header >
이 예제에서 작성자는 웹 애플리케이션의 검색 기능을 전적으로 JavaScript로 구현했다.
서버 측 제출을 수행하기 위해 form 요소를
사용하지 않지만,
이를 포함하는 search 요소는
자손 콘텐츠가 검색 기능을 나타낸다는 목적을 의미론적으로 식별한다.
< search >
< label >
Find and filter your query
< input type = "search" id = "query" >
</ label >
< label >
< input type = "checkbox" id = "exact-only" >
Exact matches only
</ label >
< section >
< h3 > Results found:</ h3 >
< ul id = "results" >
< li >
< p >< a href = "services/consulting" > Consulting services</ a ></ p >
< p >
Find out how can we help you improve your business with our integrated consultants, Bob and Bob.
</ p >
</ li >
...
</ ul >
<!--
when a query returns or filters out all results
render the no results message here
-->
< output id = "no-results" ></ output >
</ section >
</ search >
다음 예제에서 페이지에는 두 가지 검색 기능이 있다. 첫 번째 기능은 웹 페이지의
header에 있으며
웹 사이트의 콘텐츠를 검색하는 전역 메커니즘으로 사용된다. 그 목적은 지정된 title 속성으로 나타낸다.
두 번째 기능은 현재 페이지의 콘텐츠를 검색하고 필터링하는 메커니즘을 나타내므로 페이지의
주요 콘텐츠 일부로 포함된다. 이 기능은 목적을 나타내는 제목을 포함한다.
< body >
< header >
...
< search title = "Website" >
...
</ search >
</ header >
< main >
< h1 > Hotels near your location</ h1 >
< search >
< h2 > Filter results</ h2 >
...
</ search >
< article >
<!-- search result content -->
</ article >
</ main >
</ body >
div
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
dl 요소의 자식.option 요소, optgroup 요소 또는
select 요소의 자손.
dl 요소의 자식인 경우: 하나 이상의
dt 요소 뒤에 하나 이상의
dd 요소가 오며, 선택적으로
스크립트 지원
요소를 중간에 섞을 수 있다.
option 요소,
optgroup 요소 또는
select 요소의 자손인
경우: 투명.
[Exposed =Window ]
interface HTMLDivElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
div 요소에는 특별한 의미가
전혀 없다. 이 요소는 자식들을 나타낸다.
연속된 요소 그룹에 공통되는 의미 체계를 마크업하기 위해 class, lang 및 title 속성과 함께 사용할 수 있다.
또한 dl 요소에서
dt 및
dd 요소 그룹을 감싸는 데
사용할 수 있다.
작성자는 다른 적절한 요소가 없을 때 사용하는 최후의 수단으로 div 요소를 간주하는 것이
강력히 권장된다. div 요소 대신 더 적절한 요소를
사용하면 독자의 접근성이 향상되고 작성자가 더 쉽게 유지보수할 수 있다.
예를 들어 블로그 게시물은 article,
장은
section,
페이지의 내비게이션 보조 수단은 nav, 폼 컨트롤 그룹은
fieldset을 사용하여
마크업한다.
한편 div 요소는
스타일 지정 목적이나 한 섹션에서 모두 유사한 방식으로 주석을 달아야 하는 여러 단락을 감싸는 데
유용할 수 있다. 다음 예제에서는 두 단락 요소에 각각 언어를 설정하는 대신 div 요소를 사용하여 두 단락의
언어를 한 번에 설정한다:
< article lang = "en-US" >
< h1 > My use of language and my cats</ h1 >
< p > My cat's behavior hasn't changed much since her absence, except
that she plays her new physique to the neighbors regularly, in an
attempt to get pets.</ p >
< div lang = "en-GB" >
< p > My other cat, coloured black and white, is a sweetie. He followed
us to the pool today, walking down the pavement with us. Yesterday
he apparently visited our neighbours. I wonder if he recognises that
their flat is a mirror image of ours.</ p >
< p > Hm, I just noticed that in the last paragraph I used British
English. But I'm supposed to write in American English. So I
shouldn't say "pavement" or "flat" or "colour"...</ p >
</ div >
< p > I should say "sidewalk" and "apartment" and "color"!</ p >
</ article >
a
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
href 속성이 있는 경우: 대화형 콘텐츠.a 요소 자손 또는
tabindex 속성이 지정된 자손이
없어야 한다.
href — 하이퍼링크의 주소
target — 하이퍼링크 내비게이션을 위한 내비게이션 가능 객체
download —
리소스로 이동하는 대신 다운로드할지 여부 및 다운로드할 경우의 파일 이름
ping — ping할 URL
rel — 하이퍼링크를 포함하는 문서 내 위치와 대상 리소스 사이의
관계
hreflang —
연결된 리소스의 언어
type — 참조된 리소스
유형에 대한 힌트
referrerpolicy
— 요소가 시작한 가져오기에 적용할 리퍼러
정책
href 속성이 있는 경우: 작성자용; 구현자용.
href, hreflang,
type 및 내비게이션 URL 속성
href.
[Exposed =Window ]
interface HTMLAnchorElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , Reflect ] attribute DOMString download ;
[CEReactions , Reflect ] attribute USVString ping ;
[CEReactions , Reflect ] attribute DOMString rel ;
[SameObject , PutForwards =value , Reflect="rel"] readonly attribute DOMTokenList relList ;
[CEReactions ] attribute DOMString text ;
[CEReactions ] attribute DOMString referrerPolicy ;
// also has obsolete members
};
HTMLAnchorElement includes HyperlinkElementUtils ;
HTMLAnchorElement includes HTMLHyperlinkElementUtils ;
a 요소에 href 속성이 있으면,
그 요소는 콘텐츠로 레이블이 지정된 하이퍼링크(하이퍼텍스트 앵커)를 나타낸다.
a 요소에 href 속성이 없으면,
그 요소는 관련성이 있었다면 링크가 배치되었을 위치를 나타내는 자리표시자를 나타내며, 요소의 콘텐츠로만
구성된다.
target, download, ping,
rel, hreflang, type
및 referrerpolicy
속성은 href 속성이
없으면 생략해야 한다.
itemprop
속성이 a 요소에 지정된 경우,
href 속성도
지정해야 한다.
사이트가 모든 페이지에서 일관된 내비게이션 도구 모음을 사용하는 경우, 일반적으로 페이지 자체로
연결되는 링크를 a 요소를 사용하여 마크업할 수 있다:
< nav >
< ul >
< li > < a href = "/" > Home</ a > </ li >
< li > < a href = "/news" > News</ a > </ li >
< li > < a > Examples</ a > </ li >
< li > < a href = "/legal" > Legal</ a > </ li >
</ ul >
</ nav >
href, target, download, ping
및 referrerpolicy
속성은 사용자가 a 요소를 사용하여
생성된 하이퍼링크를 따라갈
때나 하이퍼링크를 다운로드할 때
발생하는 동작에 영향을 준다. rel, hreflang 및 type 속성은 사용자가 링크를
따라가기 전에 대상 리소스의 예상 특성을 사용자에게 나타내는 데 사용할 수 있다.
a.texttextContent와
동일하다.
HTMLAnchorElement/referrerPolicy
현재의 모든 엔진에서 지원된다.
IDL 속성 referrerPolicy는 referrerpolicy
콘텐츠 속성을 알려진 값으로만 제한하여
반영해야 한다.
text
속성의 getter는 이 요소의 자손
텍스트 콘텐츠를 반환해야 한다.
a 요소는 내부에 대화형 콘텐츠
(예: 버튼이나 다른 링크)가 없는 한 전체 단락, 목록, 표 등은 물론 전체 섹션까지 감쌀 수 있다.
다음 예제는 이를 사용하여 전체 광고 블록을 링크로 만드는 방법을 보여 준다:
< aside class = "advertising" >
< h1 > Advertising</ h1 >
< a href = "https://ad.example.com/?adid=1929&pubid=1422" >
< section >
< h1 > Mellblomatic 9000!</ h1 >
< p > Turn all your widgets into mellbloms!</ p >
< p > Only $9.99 plus shipping and handling.</ p >
</ section >
</ a >
< a href = "https://ad.example.com/?adid=375&pubid=1422" >
< section >
< h1 > The Mellblom Browser</ h1 >
< p > Web browsing at the speed of light.</ p >
< p > No other browser goes faster!</ p >
</ section >
</ a >
</ aside >
다음 예제는 약간의 스크립트를 사용하여 채용 공고 표의 전체 행을 사실상 하이퍼링크로 만드는 방법을 보여 준다:
< table >
< tr >
< th > Position
< th > Team
< th > Location
< tr >
< td >< a href = "/jobs/manager" > Manager</ a >
< td > Remotees
< td > Remote
< tr >
< td >< a href = "/jobs/director" > Director</ a >
< td > Remotees
< td > Remote
< tr >
< td >< a href = "/jobs/astronaut" > Astronaut</ a >
< td > Architecture
< td > Remote
</ table >
< script >
document. querySelector( "table" ). onclick = ({ target }) => {
if ( target. parentElement. localName === "tr" ) {
const link = target. parentElement. querySelector( "a" );
if ( link) {
link. click();
}
}
}
</ script >
em
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.특정 콘텐츠의 강세 수준은 그 콘텐츠의 조상 em 요소 수로
정해진다.
강세 강조의 위치를 바꾸면 문장의 의미가 달라진다. 따라서 이 요소는 콘텐츠의 필수적인 부분을 이룬다. 이와 같은 방식으로 강세를 사용하는 정확한 방법은 언어에 따라 달라진다.
다음 예제는 강세 강조를 변경하면 의미가 어떻게 달라지는지 보여 준다. 먼저 강세가 없는 일반적인 사실 진술이다:
< p > Cats are cute animals.</ p >
첫 번째 단어를 강조하면 논의 중인 동물의 종류에 의문이 있다는 의미를 암시한다 (예를 들어 누군가 개가 귀엽다고 주장할 수 있다):
< p >< em > Cats</ em > are cute animals.</ p >
강세를 동사로 옮기면 문장 전체의 진실성이 의문시되고 있음을 강조한다 (예를 들어 누군가 고양이는 귀엽지 않다고 말할 수 있다):
< p > Cats < em > are</ em > cute animals.</ p >
강세를 형용사로 옮기면 고양이의 정확한 특성을 다시 주장하게 된다 (예를 들어 누군가 고양이는 못된 동물이라고 제안했을 수 있다):
< p > Cats are < em > cute</ em > animals.</ p >
마찬가지로 누군가 고양이는 채소라고 주장했다면 이를 바로잡는 사람이 마지막 단어를 강조할 수 있다:
< p > Cats are cute < em > animals</ em > .</ p >
문장 전체를 강조하면 화자가 요점을 전달하기 위해 강하게 주장하고 있음이 분명해진다. 이러한 종류의 강세 강조는 일반적으로 문장 부호에도 영향을 주므로 여기서는 느낌표를 사용한다.
< p >< em > Cats are cute animals!</ em ></ p >
분노와 귀여움에 대한 강조가 섞이면 다음과 같은 마크업이 될 수 있다:
< p >< em > Cats are < em > cute</ em > animals!</ em ></ p >
em 요소는 일반적인
"기울임꼴" 요소가 아니다. 때로는 텍스트를 다른 분위기나 목소리로 말하는 것처럼 단락의 나머지
부분과 구별해 돋보이게 하려는 경우가 있다. 이 경우에는 i 요소가
더 적절하다.
strong
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.strong 요소는
콘텐츠의 강한 중요성, 심각성 또는 긴급성을 나타낸다.
중요성: strong 요소는 제목,
캡션 또는 단락에서 정말 중요한 부분을 더 상세하거나, 더 유쾌하거나, 단순히 상용구인 다른 부분과
구별하는 데 사용할 수 있다. (이는 부제목을 마크업하는 것과는 다르며, 부제목에는 hgroup 요소가 적절하다.)
예를 들어 앞 단락의 첫 번째 단어는 단락 나머지 부분의 더 자세한 텍스트와 구별하기
위해 strong으로
마크업되어 있다.
심각성: strong 요소는 경고나
주의 알림을 마크업하는 데 사용할 수 있다.
긴급성: strong 요소는 사용자가
문서의 다른 부분보다 더 먼저 확인해야 하는 콘텐츠를 나타내는 데 사용할 수 있다.
특정 콘텐츠의 상대적 중요도는 그 콘텐츠의 조상 strong 요소 수로
정해진다. 각 strong 요소는
콘텐츠의 중요도를 높인다.
strong 요소를
사용하여 텍스트 일부의 중요도를 변경해도 문장의 의미는 달라지지 않는다.
여기서 "chapter"라는 단어와 실제 장 번호는 단순한 상용구이며, 장의 실제 이름은 strong으로
마크업된다:
< h1 > Chapter 1: < strong > The Praxis</ strong ></ h1 >
다음 예제에서는 캡션 안의 다이어그램 이름을 앞의 상용구 텍스트와 뒤의 설명에서 구별하기 위해
strong으로
마크업한다:
< figcaption > Figure 1. < strong > Ant colony dynamics</ strong > . The ants in this colony are
affected by the heat source (upper left) and the food source (lower right).</ figcaption >
이 예제에서 제목은 실제로 "Flowers, Bees, and Honey"이지만 작성자는 제목에 가벼운 농담을
덧붙였다. 따라서 strong 요소를
사용하여 첫 번째 부분을 뒤의 부분과 구별한다.
< h1 >< strong > Flowers, Bees, and Honey</ strong > and other things I don't understand</ h1 >
다음은 게임의 경고 알림에서 각 부분을 중요도에 따라 마크업한 예이다:
< p >< strong > Warning.</ strong > This dungeon is dangerous.
< strong > Avoid the ducks.</ strong > Take any gold you find.
< strong >< strong > Do not take any of the diamonds</ strong > ,
they are explosive and < strong > will destroy anything within
ten meters.</ strong ></ strong > You have been warned.</ p >
이 예제에서 strong 요소는
사용자가
먼저 읽어야 하는 텍스트 부분을 나타내는 데 사용된다.
< p > Welcome to Remy, the reminder system.</ p >
< p > Your tasks for today:</ p >
< ul >
< li >< p >< strong > Turn off the oven.</ strong ></ p ></ li >
< li >< p > Put out the trash.</ p ></ li >
< li >< p > Do the laundry.</ p ></ li >
</ ul >
small
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.small 요소는 작은 글씨와
같은 부가 설명을 나타낸다.
작은 글씨에는 일반적으로 면책 조항, 주의 사항, 법적 제한 또는 저작권이 포함된다. 작은 글씨는 출처 표시나 라이선스 요구 사항을 충족하는 데 사용되기도 한다.
small
요소는 em 요소로 강조된
텍스트의 강조를 "약화"하거나 strong 요소로
중요하게
표시된 텍스트의 중요도를 낮추지 않는다. 텍스트를 강조되거나 중요하지 않은 것으로 표시하려면 각각
em 또는 strong 요소로
마크업하지 않으면 된다.
small 요소는 여러
단락, 목록 또는 텍스트 섹션과 같이 긴 범위의 텍스트에 사용해서는 안 된다. 이 요소는 짧은 텍스트
구간에만 사용하도록 의도되었다. 예를 들어 이용 약관을 나열하는 페이지의 텍스트는 small 요소에 적합하지
않다. 그러한 경우 텍스트는 부가 설명이 아니라 페이지의 주요 콘텐츠이기 때문이다.
small 요소는
부제목에 사용해서는 안 된다. 그 목적에는 hgroup 요소를 사용한다.
이 예제에서 small 요소는 호텔 객실
가격에 부가가치세가 포함되지 않았음을 나타내는 데 사용된다:
< dl >
< dt > Single room
< dd > 199 € < small > breakfast included, VAT not included</ small >
< dt > Double room
< dd > 239 € < small > breakfast included, VAT not included</ small >
</ dl >
두 번째 예제에서 small 요소는 기사
안의
부가 설명에 사용된다.
< p > Example Corp today announced record profits for the
second quarter < small > (Full Disclosure: Foo News is a subsidiary of
Example Corp)</ small > , leading to speculation about a third quarter
merger with Demo Group.</ p >
이는 여러 단락 길이일 수 있고 텍스트의 주요 흐름에서 분리되는 사이드바와는 다르다. 다음 예제에서는 같은 기사의 사이드바를 보여 준다. 이 사이드바에도 작은 글씨가 있으며, 사이드바에 있는 정보의 출처를 나타낸다.
< aside >
< h1 > Example Corp</ h1 >
< p > This company mostly creates small software and Web
sites.</ p >
< p > The Example Corp company mission is "To provide entertainment
and news on a sample basis".</ p >
< p >< small > Information obtained from < a
href = "https://example.com/about.html" > example.com</ a > home
page.</ small ></ p >
</ aside >
마지막 예제에서 small 요소는
중요한 작은 글씨로 표시된다.
< p >< strong >< small > Continued use of this service will result in a kiss.</ small ></ strong ></ p >
s
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.s 요소는 더 이상 정확하지 않거나
더 이상 관련이 없는 콘텐츠를 나타낸다.
s 요소는 문서 편집을
나타내는 데 적절하지 않다. 문서에서 제거된 텍스트 범위를 마크업하려면 del 요소를 사용한다.
이 예제에서는 해당 제품에 새로운 할인 가격이 있으므로 권장 소매 가격을 더 이상 관련이 없는 것으로 표시한다.
< p > Buy our Iced Tea and Lemonade!</ p >
< p >< s > Recommended retail price: $3.99 per bottle</ s ></ p >
< p >< strong > Now selling for just $2.99 a bottle!</ strong ></ p >
cite
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.cite 요소는 저작물의
제목(예:
책,
논문,
수필,
시,
악보,
노래,
대본,
영화,
TV 프로그램,
게임,
조각,
그림,
연극 공연,
희곡,
오페라,
뮤지컬,
전시회,
판례 보고서,
컴퓨터 프로그램
등)을 나타낸다. 이는 인용되거나 자세히 참조되는 저작물(즉, 출전)일 수도 있고,
단순히 지나가듯 언급되는 저작물일 수도 있다.
사람의 이름은 저작물의 제목이 아니다. 사람들이 그 사람을 하나의 작품이라고 부르더라도 마찬가지이다.
따라서 이 요소를 사람의 이름을 마크업하는 데 사용해서는 안 된다. (어떤 경우에는 이름에 b 요소가 적절할 수 있다.
예를 들어 유명인의 이름이 주의를 끌기 위해 다른 스타일로 렌더링되는 키워드인 가십 기사에서 그렇다.
다른 경우에는 요소가 정말로 필요하다면 span 요소를 사용할 수 있다.)
다음 예는 cite 요소의 일반적인 사용법을 보여
줍니다:
< p > 내가 가장 좋아하는 책은 Peter F. Hamilton의 < cite > The Reality Dysfunction</ cite > 입니다.
내가 가장 좋아하는 만화는 Stephan Pastis의 < cite > Pearls Before
Swine</ cite > 입니다. 내가 가장 좋아하는 트랙은 Cannonball Adderley Sextet의 < cite > Jive
Samba</ cite > 입니다.</ p >
다음은 올바른 사용법입니다:
< p > 2008년 2월 중순 당시의 Wikipedia 문서 < cite > HTML</ cite > 에 따르면,
속성 값을 따옴표로 묶지 않는 것은 안전하지 않습니다. 이는 명백히 지나치게
단순화한 설명입니다.</ p >
그러나 다음은 잘못된 사용법입니다. 여기서 cite 요소는
작품의 제목보다 훨씬 많은 내용을 포함하기 때문입니다:
<!-- 이 예를 복사하지 마세요. 잘못된 사용법의 예입니다! -->
< p > 2008년 2월 중순 당시의 < cite > HTML에 관한 Wikipedia 문서</ cite > 에 따르면,
속성 값을 따옴표로 묶지 않는 것은 안전하지 않습니다. 이는 명백히 지나치게
단순화한 설명입니다.</ p >
cite 요소는 참고 문헌의
모든 인용에서 핵심적인 부분이지만, 제목을 표시하는 데만
사용됩니다:
< p >< cite > 세계 인권 선언</ cite > , 국제 연합,
1948년 12월. 총회 결의 217 A (III)로 채택됨.</ p >
인용 표기는
인용문이 아닙니다(인용문에는 q
요소가
적절합니다).
다음은 잘못된 사용법입니다. cite는 인용문을
위한 요소가 아니기 때문입니다:
< p >< cite > 이것은 잘못되었습니다!</ cite > 라고 Ian이 말했습니다.</ p >
다음 역시 잘못된 사용법입니다. 사람은 작품이 아니기 때문입니다:
< p >< q > 이것도 여전히 잘못되었습니다!</ q > 라고 < cite > Ian</ cite > 이 말했습니다.</ p >
올바른 사용법에서는 cite 요소를 사용하지
않습니다:
< p >< q > 이것은 올바릅니다</ q > 라고 Ian이 말했습니다.</ p >
위에서 언급했듯이, b 요소는
특정 종류의 문서에서 이름을 키워드로
표시하는 데 적절할 수 있습니다:
< p > 그리고 < b > Ian</ b > 은 < q > 가십 칼럼에서는 어쩌면 이것이
맞을 수도 있습니다!</ q > 라고 말했습니다.</ p >
작품의 제목을 관례적으로 문장 부호로 구분하는 경우
— 예를 들어 영어에서 문서 제목 주위에 사용하는 따옴표나 일본어에서 책 제목 주위에 사용하는 겹낫표(『』) —
해당 문장 부호는 제목의 일부가 아니며
cite 요소 밖에 위치합니다.
다음은 올바른 사용법입니다:
< p > 『< cite lang = "ja" > 阪急電車</ cite > 』에 대한 내 서평의 제목은 “< cite > 귀여운 단편 소설 모음</ cite > ”이었습니다.</ p >
q
요소현재의 모든 엔진에서 지원된다.
cite — 인용문 출처 또는 편집에 대한
추가 정보로 연결되는 링크
HTMLQuoteElement를 사용한다.q 요소는 다른 출처에서 인용한 일부
구문 콘텐츠를 나타낸다.
요소의 콘텐츠를 인용하는 인용 부호 문장 부호(예: 따옴표)는 q
요소 바로 앞, 뒤 또는 내부에
나타나서는 안 된다. 사용자 에이전트가 렌더링에 삽입한다.
q 요소 내부의 콘텐츠는 다른
출처에서 인용한 것이어야 하며, 주소가 있다면 cite 속성에서 인용할 수 있다. 소설이나 각본의 인물을
인용하는 경우처럼 출처는 허구일 수 있다.
cite 속성이 있으면 공백으로 둘러싸일 수 있는 유효한
URL이어야 한다. 해당 인용 링크를 얻으려면 속성 값을 요소의 노드 문서를
기준으로 구문 분석해야 한다. 사용자 에이전트는 사용자가 이러한
인용 링크를 따라가도록 허용할 수 있지만, 이 링크는 주로 독자가 아니라 비공개 용도(예: 사이트의
인용문 사용에 관한 통계를 수집하는 서버 측 스크립트)를 위한 것이다.
q 요소를 인용문이 아닌 따옴표
대신 사용해서는 안 된다. 예를 들어 빈정대는 문장을 마크업하는 데 q
요소를 사용하는 것은 적절하지
않다.
인용문을 마크업할 때 q 요소를
사용하는 것은 전적으로 선택 사항이다. q 요소 없이 명시적인 인용
부호
문장 부호를 사용하는 것도 똑같이 올바르다.
다음은 q 요소를 사용하는 간단한 예이다:
< p > The man said < q > Things that are impossible just take
longer</ q > . I disagreed with him.</ p >
다음은 q 요소 안의 명시적인 인용 링크와
요소 밖의 명시적인 출전을 모두 포함한 예이다:
< p > The W3C page < cite > About W3C</ cite > says the W3C's
mission is < q cite = "https://www.w3.org/Consortium/" > To lead the
World Wide Web to its full potential by developing protocols and
guidelines that ensure long-term growth for the Web</ q > . I
disagree with this mission.</ p >
다음 예제에서는 인용문 자체가 인용문을 포함한다:
< p > In < cite > Example One</ cite > , he writes < q > The man
said < q > Things that are impossible just take longer</ q > . I
disagreed with him</ q > . Well, I disagree even more!</ p >
다음 예제에서는 q 요소 대신 따옴표를 사용한다:
< p > His best argument was ❝I disagree❞, which
I thought was laughable.</ p >
다음 예제에는 인용문이 없다. 따옴표는 단어의 이름을 나타내기 위해 사용된다. 이 경우 q 요소를 사용하는 것은 적절하지
않다.
< p > The word "ineffable" could have been used to describe the disaster
resulting from the campaign's mismanagement.</ p >
dfn
요소현재의 모든 엔진에서 지원된다.
dfn 요소 자손은 없어야 한다.title 속성은 이 요소에서
특별한 의미 체계를 가진다: 전체 용어
또는 약어의 확장형
HTMLElement를 사용한다.dfn 요소는 용어를 정의하는
인스턴스를 나타낸다. dfn 요소의 가장 가까운 조상인
단락, 설명 목록 그룹 또는 섹션에는 dfn 요소가 제공하는 용어의 정의도 포함되어야 한다.
정의되는 용어: dfn 요소에 title 속성이 있으면
그 속성의 정확한 값이 정의되는 용어이다. 그렇지 않고 정확히 하나의 요소 자식 노드를 포함하며
자식 Text
노드는 없고, 그 자식 요소가 title 속성을 가진
abbr 요소라면 그
속성의 정확한 값이 정의되는 용어이다. 그렇지 않으면 dfn 요소의 자손 텍스트 콘텐츠가 정의되는 용어를 제공한다.
dfn 요소의 title 속성이 있으면 정의되는 용어만
포함해야 한다.
조상 요소의 title 속성은 dfn 요소에 영향을 주지 않는다.
dfn 요소로 연결되는 a 요소는 dfn 요소가 정의한 용어의
인스턴스를 나타낸다.
다음 조각에서는 "Garage Door Opener"라는 용어가 첫 번째 단락에서 처음 정의된 다음 두 번째 단락에서 사용된다. 두 경우 모두 실제로 표시되는 것은 그 약어이다.
< p > The < dfn >< abbr title = "Garage Door Opener" > GDO</ abbr ></ dfn >
is a device that allows off-world teams to open the iris.</ p >
<!-- ... later in the document: -->
< p > Teal'c activated his < abbr title = "Garage Door Opener" > GDO</ abbr >
and so Hammond ordered the iris to be opened.</ p >
< p > The < dfn id = gdo >< abbr title = "Garage Door Opener" > GDO</ abbr ></ dfn >
is a device that allows off-world teams to open the iris.</ p >
<!-- ... later in the document: -->
< p > Teal'c activated his < a href = #gdo > < abbr title = "Garage Door Opener" > GDO</ abbr > </ a >
and so Hammond ordered the iris to be opened.</ p >
abbr
요소현재의 모든 엔진에서 지원된다.
title 속성은 이
요소에서 특별한 의미 체계를 가진다:
전체 용어 또는 약어의 확장형
HTMLElement를 사용한다.abbr 요소는 선택적으로
확장형과 함께 약어 또는 두문자어를 나타낸다. title 속성을 사용하여 약어의 확장형을
제공할 수 있다. 이 속성을 지정하는 경우 약어의 확장형만 포함해야 한다.
아래 단락은 abbr 요소로 마크업된 약어를
포함한다. 이 단락은 "Web Hypertext Application Technology Working Group"이라는 용어를 정의한다.
< p > The < dfn id = whatwg >< abbr
title = "Web Hypertext Application Technology Working Group" > WHATWG</ abbr ></ dfn >
is a loose unofficial collaboration of web browser manufacturers and
interested parties who wish to develop new technologies designed to
allow authors to write and deploy Applications over the World Wide
Web.</ p >
이를 작성하는 다른 방법은 다음과 같다:
< p > The < dfn id = whatwg > Web Hypertext Application Technology
Working Group</ dfn > (< abbr
title = "Web Hypertext Application Technology Working Group" > WHATWG</ abbr > )
is a loose unofficial collaboration of web browser manufacturers and
interested parties who wish to develop new technologies designed to
allow authors to write and deploy Applications over the World Wide
Web.</ p >
이 단락에는 두 개의 약어가 있다. 하나만 정의되어 있음에 유의한다. 연결된 확장형이 없는 다른
약어에는 abbr 요소를 사용하지 않는다.
< p > The
< abbr title = "Web Hypertext Application Technology Working Group" > WHATWG</ abbr >
started working on HTML5 in 2004.</ p >
이 단락은 약어를 그 정의에 연결한다.
< p > The < a href = "#whatwg" >< abbr
title = "Web Hypertext Application Technology Working Group" > WHATWG</ abbr ></ a >
community does not have much representation from Asia.</ p >
이 단락은 확장형을 제공하지 않고 약어를 마크업한다. 이는 약어에 스타일(예: 작은 대문자)을 적용하기 위한 훅일 수 있다.
< p > Philip` and Dashiva both denied that they were going to
get the issue counts from past revisions of the specification to
backfill the < abbr > WHATWG</ abbr > issue graph.</ p >
약어가 복수형이면 확장형의 문법적 수(복수형 또는 단수형)는 요소 콘텐츠의 문법적 수와 일치해야 한다.
여기서는 복수형이 요소 밖에 있으므로 확장형은 단수형이다:
< p > Two < abbr title = "Working Group" > WG</ abbr > s worked on
this specification: the < abbr > WHATWG</ abbr > and the
< abbr > HTMLWG</ abbr > .</ p >
여기서는 복수형이 요소 안에 있으므로 확장형은 복수형이다:
< p > Two < abbr title = "Working Groups" > WGs</ abbr > worked on
this specification: the < abbr > WHATWG</ abbr > and the
< abbr > HTMLWG</ abbr > .</ p >
약어는 반드시 이 요소를 사용하여 마크업할 필요는 없다. 이 요소는 다음과 같은 경우에 유용할 것으로 예상된다:
title 속성이 있는
abbr 요소를 사용하는 것은
확장형을 인라인(예: 괄호 안)에 포함하는 방법의 대안이다.
title 속성이 있는 abbr 요소를 사용하여
약어를 마크업하거나, 텍스트 안에 확장형을 인라인으로 포함하는 것이 권장된다.title 속성 없이 abbr 요소를 사용할 수
있다.
title 속성에서 확장형을 한 번 제공해도
같은 문서에서 같은 콘텐츠를 가지지만 title 속성이 없는 다른 abbr 요소가 같은 확장형을
가진 것처럼 동작하지는 않는다. 모든 abbr 요소는
독립적이다.
ruby
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.ruby 요소를 사용하면 하나
이상의 구문 콘텐츠 범위에 루비 주석을 표시할 수 있다. 루비 주석은 기본 텍스트 옆에 표시되는 짧은
텍스트 구간으로, 주로 동아시아 조판에서 발음 안내나 기타 주석을 포함하기 위해 사용된다.
일본어에서는 이러한 조판 형식을 후리가나라고도 한다.
ruby 요소의 콘텐츠
모델은 다음 시퀀스 중 하나 이상으로 구성된다:
다음 중 하나:
다음 중 하나:
ruby 및 rt 요소는 아래에 설명된 것을
포함하되 이에 한정되지 않는 다양한 종류의 주석에 사용할 수 있다. 특히 일본어 루비와 일본어에서
루비를 렌더링하는 방법에 관한 자세한 내용은 일본어 조판 요구 사항을 참조한다.
[JLREQ]
작성 시점에는 CSS가 아직 HTML ruby 요소의 렌더링을
완전히 제어하는 방법을 제공하지 않는다. CSS가 적절한 시기에 아래에 설명된 스타일을 지원하도록
확장되기를 기대한다.
하나 이상의 히라가나 또는 가타카나 문자(루비 주석)가 각 표의 문자(기본 텍스트)와 함께 배치된다. 이는 한자의 읽는 법을 제공하는 데 사용된다.
< ruby > B< rt > annotation</ ruby >
이 예제에서는 각 주석이 하나의 기본 문자에 대응함에 유의한다.
< ruby > 君< rt > くん</ ruby >< ruby > 子< rt > し</ ruby > は< ruby > 和< rt > わ</ ruby > して< ruby > 同< rt > どう</ ruby > ぜず。
君子は和して同 ぜず。
이 예제는 각각 하나의 기본 텍스트 구간과 주석을 가진 두 개의 연속된 ruby 요소(위 마크업과
같음) 대신, 기본 텍스트 구간 두 개와 주석 두 개(각각 하나씩)를 가진 하나의 ruby 요소를 사용하여
다음과 같이 작성할 수도 있다:
< ruby > 君< rt > くん</ rt > 子< rt > し</ ruby > は< ruby > 和< rt > わ</ ruby > して< ruby > 同< rt > どう</ ruby > ぜず。
이는 앞의 경우와 비슷하다. 복합어의 각 표의 문자(기본 텍스트)에 히라가나 또는 가타카나 문자(루비 주석)로 읽는 법을 제공한다. 차이점은 기본 텍스트 구간이 서로 분리된 것이 아니라 복합어를 이룬다는 점이다.
< ruby > B< rt > annotation</ rt > B< rt > annotation</ ruby >
이 예제에서도 각 주석이 하나의 기본 문자에 대응함에 유의한다. 이 예제에서 각 복합어(주쿠고)는
하나의 ruby 요소에 대응한다.
여기서 예상되는 렌더링은 각 주석이 해당 기본 문자 위(세로쓰기에서는 옆)에 배치되고, 주석이 인접한 문자 위로 돌출하지 않는 것이다.
< ruby > 鬼< rt > き</ rt > 門< rt > もん</ rt ></ ruby > の< ruby > 方< rt > ほう</ rt > 角< rt > がく</ rt ></ ruby > を< ruby > 凝< rt > ぎょう</ rt > 視< rt > し</ rt ></ ruby > する
鬼門の方角を凝視する
이는 의미론적으로 앞의 경우와 동일하다(기본 복합어의 각 개별 표의 문자에 히라가나 또는 가타카나 문자로 읽는 법이 주석으로 제공됨). 다만 렌더링은 더 복잡한 주쿠고 루비 렌더링이다.
이는 위의 복합어 모노 루비 예제와 같다. 서로 다른 렌더링은 서로 다른 스타일 지정(예: CSS)을 사용하여 구현될 것으로 예상되며 여기에는 표시하지 않는다.
< ruby > 鬼< rt > き</ rt > 門< rt > もん</ rt ></ ruby > の< ruby > 方< rt > ほう</ rt > 角< rt > がく</ rt ></ ruby > を< ruby > 凝< rt > ぎょう</ rt > 視< rt > し</ rt ></ ruby > する
주쿠고 루비 렌더링에 관한 자세한 내용은 일본어 조판 요구 사항의 부록 F를 참조한다. [JLREQ]
주석은 발음 대신 또는 발음과 함께 기본 텍스트의 의미를 설명한다. 따라서 기본 텍스트와 주석 모두 여러 문자 길이일 수 있다.
< ruby > BASE< rt > annotation</ ruby >
여기서는 복합 표의어에 대응하는 가타카나를 주석으로 제공한다.
< ruby > 境界面< rt > インターフェース</ ruby >
境界面
여기서는 복합 표의어의 영어 번역을 주석으로 제공한다.
< ruby lang = "ja" > 編集者< rt lang = "en" > editor</ ruby >
編集者
일대일 대응이 어려우므로 여러 기본 문자에 대응하는 음성 읽기이다. (영어에서는 "Colonel"과 "Lieutenant"가 일부 방언에서 발음과 개별 문자의 직접적인 대응이 상당히 불분명한 단어의 예이다.)
이 예제에서는 꽃 종의 이름에 그룹 루비를 사용하여 음성 읽기를 제공한다:
< ruby > 紫陽花< rt > あじさい</ ruby >
紫陽花
때로는 위에서 설명한 루비 스타일을 결합한다.
그 결과 두 주석이 같은 하나의 기본 구간을 덮는다면 주석을 연속해서 배치하면 된다.
< ruby > BASE< rt > annotation 1< rt > annotation 2</ ruby >
< ruby > B< rt > a< rt > a</ ruby >< ruby > A< rt > a< rt > a</ ruby >< ruby > S< rt > a< rt > a</ ruby >< ruby > E< rt > a< rt > a</ ruby >
이 인위적인 예제에서는 일부 기호에 영어와 프랑스어 이름을 제공한다.
< ruby >
♥ < rt > Heart < rt lang = fr > Cœur </ rt >
☘ < rt > Shamrock < rt lang = fr > Trèfle </ rt >
✶ < rt > Star < rt lang = fr > Étoile </ rt >
</ ruby >
다음 예제와 같이 더 복잡한 상황에서는 중첩된 ruby 요소를 사용하여
내부 주석을 제공한 다음, 그 전체 ruby에
"외부" 수준의
주석을 제공한다.
< ruby >< ruby > B< rt > a</ rt > A< rt > n</ rt > S< rt > t</ rt > E< rt > n</ rt ></ ruby >< rt > annotation</ ruby >
여기서는 음성 읽기와 의미를 모두 루비 주석으로 제공한다. 중첩된 ruby 요소의 주석은 각
기본 문자에 대한 모노 루비 음성 주석을 제공하고, 외부 ruby 요소의 자식인
rt 요소의 주석은
히라가나를 사용하여 의미를 제공한다.
< ruby >< ruby > 東< rt > とう</ rt > 南< rt > なん</ rt ></ ruby >< rt > たつみ</ rt ></ ruby > の方角
東南 の方角
이는 같은 예제이지만 의미를 일본어 대신 영어로 제공한다:
< ruby >< ruby > 東< rt > とう</ rt > 南< rt > なん</ rt ></ ruby >< rt lang = en > Southeast</ rt ></ ruby > の方角
東南 の方角
ruby 요소 조상이 없는
ruby 요소 안에서
콘텐츠는 구간으로 나뉘며, 구간은 기본 텍스트 구간, 주석 구간 및 무시되는 구간의 세 범주로
배치된다. 무시되는 구간은 문서의 의미 체계 일부를 이루지 않는다. 이들은 일부 요소 간 공백과 rp 요소로 구성되며, 후자는
루비를 전혀 지원하지 않는 레거시 사용자 에이전트를 위해 사용된다. 기본 텍스트 구간은 겹칠 수
있다(DOM의 어느 한 위치에서도 겹치는 구간은 최대 두 개이며, 겹치는 구간보다 시작점이 이른 구간은
종료점도 같거나 더 늦고, 겹치는 구간보다 종료점이 늦은 구간은 시작점도 같거나 더 이르다).
주석 구간은 rt 요소에 대응한다. 각 주석
구간은 기본 텍스트 구간과 연결될 수 있으며, 각 기본 텍스트 구간에는 주석 구간이 연결될 수 있다.
(적합한 문서에서는 각 기본 텍스트 구간이 최소 하나의 주석 구간과 연결되고, 각 주석 구간은 하나의
기본 텍스트 구간과 연결된다.) ruby 요소는
포함하는 기본
텍스트 구간의 합집합과, 해당 기본 텍스트 구간에서 주석 구간으로의 매핑을 나타낸다. 구간은 DOM
범위로 설명하며, 주석 구간
범위는 항상 정확히 하나의 요소로 구성된다. [DOM]
특정 시점의 ruby 요소 콘텐츠의
구간화와 범주화는 다음 알고리즘을 실행하여 얻는 결과이다:
base text segments를 기본 텍스트 구간의 빈 목록으로 둔다. 각 구간은 기본 텍스트 하위 구간 목록을 가질 수 있다.
annotation segments를 주석 구간의 빈 목록으로 둔다. 각 구간은 기본 텍스트 구간 또는 하위 구간과 연결될 수 있다.
root를 알고리즘을 실행하는 대상인 ruby 요소로 둔다.
root에 ruby 요소 조상이
있으면 end 레이블이 지정된 단계로 이동한다.
current parent를 root로 둔다.
index를 0으로 둔다.
start index를 null로 둔다.
saved start index를 null로 둔다.
current base text를 null로 둔다.
Start mode: index가 current parent의 자식 노드 수보다 크거나 같으면 end mode 레이블이 지정된 단계로 이동한다.
current parent의 index번째 노드가 rt 또는 rp 요소이면
annotation mode 레이블이 지정된 단계로 이동한다.
start index를 index의 값으로 설정한다.
Base mode: current parent의 index번째 노드가 ruby 요소이고
current parent가 root와 같은 요소이면 루비 수준을 푸시한 다음
start mode 레이블이 지정된 단계로 이동한다.
current parent의 index번째 노드가 rt 또는 rp 요소이면 현재 기본 텍스트를
설정한 다음 annotation mode 레이블이 지정된 단계로 이동한다.
index를 1만큼 증가시킨다.
Base mode post-increment: index가 current parent의 자식 노드 수보다 크거나 같으면 end mode 레이블이 지정된 단계로 이동한다.
base mode 레이블이 지정된 단계로 돌아간다.
Annotation mode: current parent의 index번째 노드가 rt 요소이면 루비 주석을 푸시하고
annotation mode increment 레이블이 지정된 단계로 이동한다.
current parent의 index번째 노드가 rp 요소이면
annotation mode increment 레이블이 지정된 단계로 이동한다.
current parent의 index번째 노드가 Text
노드가 아니거나, Text
노드이지만 요소 간 공백이 아니면
base mode
레이블이 지정된 단계로 이동한다.
Annotation mode increment: lookahead index를 index에 1을 더한 값으로 둔다.
Annotation mode white-space skipper: lookahead index가 current parent의 자식 노드 수와 같으면 end mode 레이블이 지정된 단계로 이동한다.
current parent의 lookahead index번째 노드가 rt 요소 또는 rp 요소이면
index를 lookahead index로 설정하고 annotation mode 레이블이 지정된
단계로 이동한다.
current parent의 lookahead index번째 노드가 Text
노드가 아니거나, Text
노드이지만 요소 간 공백이 아니면
base mode
레이블이 지정된 단계로 이동한다(index를 더 증가시키지 않으므로 지금까지 확인한 요소 간 공백은 다음 기본 텍스트 구간의 일부가
된다).
lookahead index를 1만큼 증가시킨다.
annotation mode white-space skipper 레이블이 지정된 단계로 이동한다.
End mode: current parent가 root와 같은 요소가 아니면 루비 수준을 팝하고 base mode post-increment 레이블이 지정된 단계로 이동한다.
End: base text segments와 annotation segments를 반환한다. 두 목록 중
어느 쪽의 구간으로도 설명되지 않는 ruby 요소의
콘텐츠는 암시적으로 무시되는 구간에 속한다.
위 단계에서 현재 기본 텍스트를 설정하라고 하면 알고리즘의 해당 지점에서 다음 단계를 실행한다:
위 단계에서 루비 수준을 푸시하라고 하면 알고리즘의 해당 지점에서 다음 단계를 실행한다:
current parent를 current parent의 index번째 노드로 둔다.
index를 0으로 둔다.
saved start index를 start index의 값으로 설정한다.
start index를 null로 둔다.
위 단계에서 루비 수준을 팝하라고 하면 알고리즘의 해당 지점에서 다음 단계를 실행한다:
index를 root 안에서 current parent의 위치로 둔다.
current parent를 root로 둔다.
index를 1만큼 증가시킨다.
start index를 saved start index의 값으로 설정한다.
saved start index를 null로 둔다.
위 단계에서 루비 주석을 푸시하라고 하면 알고리즘의 해당 지점에서 다음 단계를 실행한다:
rt를 current parent의 index번째 노드인 rt 요소로 둔다.
annotation range를 DOM 범위로 둔다. 그 시작은 경계점(current parent, index)이고, 끝은 경계점 (current parent, index에 1을 더한 값)이다(즉, rt만 포함한다).
new annotation segment를 annotation range 범위로 설명되는 주석 구간으로 둔다.
current base text가 null이 아니면 new annotation segment를 current base text와 연결한다.
new annotation segment를 annotation segments에 추가한다.
이 예제에서는 일본어 텍스트 漢字의 각 표의 문자에 히라가나 읽기를 주석으로 제공한다.
...
< ruby > 漢< rt > かん</ rt > 字< rt > じ</ rt ></ ruby >
...
다음과 같이 렌더링될 수 있다:

이 예제에서는 번체 중국어 텍스트 漢字의 각 표의 문자에 주음부호 읽기를 주석으로 제공한다.
< ruby > 漢< rt > ㄏㄢˋ</ rt > 字< rt > ㄗˋ</ rt ></ ruby >
다음과 같이 렌더링될 수 있다:

이 예제에서는 간체 중국어 텍스트 汉字의 각 표의 문자에 병음 읽기를 주석으로 제공한다.
...< ruby > 汉< rt > hàn</ rt > 字< rt > zì</ rt ></ ruby > ...
다음과 같이 렌더링될 수 있다:
이 더 인위적인 예제에서 두문자어 "HTML"에는 네 개의 주석이 있다. 하나는 전체 두문자어가 무엇인지 간단히 설명하고, 하나는 "HT"를 "Hypertext"로 확장하며, 하나는 문자 "M"을 "Markup"으로 확장하고, 하나는 문자 "L"을 "Language"로 확장한다.
< ruby >
< ruby > HT< rt > Hypertext</ rt > M< rt > Markup</ rt > L< rt > Language</ rt ></ ruby >
< rt > An abstract language for describing documents and applications
</ ruby >
rt
요소현재의 모든 엔진에서 지원된다.
ruby 요소의 자식.
rt 요소 바로 뒤에
rt 또는 rp 요소가 오거나,
부모 요소에 더 이상의 콘텐츠가 없으면 rt 요소의 종료 태그를 생략할 수 있다.
HTMLElement를 사용한다.rt 요소는 루비 주석의
루비 텍스트 구성 요소를 표시한다. ruby 요소의 자식인
경우,
그 자체로는 아무것도 나타내지 않지만,
ruby 요소는 자신이
무엇을 나타내는지 결정하는 과정의 일부로
이 요소를 사용한다.
ruby 요소의 자식이 아닌
rt 요소는
자신의 자식과 같은 것을 나타낸다.
rp
요소현재의 모든 엔진에서 지원된다.
ruby 요소의 자식으로서,
rt 요소 바로 앞이나
바로 뒤.
rp 요소 바로 뒤에
rt 또는 rp 요소가 오거나,
부모 요소에 더 이상의 콘텐츠가 없으면 rp 요소의 종료 태그를 생략할 수 있다.
HTMLElement를 사용한다.rp 요소는 루비 주석을
지원하지 않는 사용자 에이전트에서 표시할 수 있도록 루비 주석의 루비 텍스트 구성 요소 주위에
괄호나 기타 콘텐츠를 제공하는 데 사용할 수 있다.
ruby 요소의 자식인
rp 요소는 아무것도
나타내지 않는다. 부모 요소가 ruby 요소가 아닌 rp 요소는 자신의 자식을
나타낸다.
텍스트 漢字의 각 표의 문자에 음성 읽기를 주석으로 제공한 위 예제는,
레거시 사용자 에이전트에서 읽기가 괄호 안에 표시되도록 rp를
사용하여 확장할 수 있다:
...
< ruby > 漢< rp > (</ rp >< rt > かん</ rt >< rp > )</ rp > 字< rp > (</ rp >< rt > じ</ rt >< rp > )</ rp ></ ruby >
...
적합한 사용자 에이전트에서는 위와 같이 렌더링되지만, 루비를 지원하지 않는 사용자 에이전트에서는 다음과 같이 렌더링된다:
... 漢(かん)字(じ)...
하나의 구간에 여러 주석이 있는 경우 rp 요소를 주석
사이에도
배치할 수 있다. 다음은 일부 기호에 영어와 프랑스어 이름을 제공했던 앞의 인위적인 예제를
rp 요소도 포함하여
다시 나타낸 것이다:
< ruby >
♥< rp > : </ rp >< rt > Heart</ rt >< rp > , </ rp >< rt lang = fr > Cœur</ rt >< rp > .</ rp >
☘< rp > : </ rp >< rt > Shamrock</ rt >< rp > , </ rp >< rt lang = fr > Trèfle</ rt >< rp > .</ rp >
✶< rp > : </ rp >< rt > Star</ rt >< rp > , </ rp >< rt lang = fr > Étoile</ rt >< rp > .</ rp >
</ ruby >
이렇게 하면 루비를 지원하지 않는 사용자 에이전트에서 예제가 다음과 같이 렌더링된다:
♥: Heart, Cœur. ☘: Shamrock, Trèfle. ✶: Star, Étoile.
data
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
value — 기계가 읽을 수 있는 값
value가 있는
기본.
[Exposed =Window ]
interface HTMLDataElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , Reflect ] attribute DOMString value ;
};
data 요소는 자신의 콘텐츠와,
value 속성에 있는
해당 콘텐츠의 기계가 읽을 수 있는 형식을 함께 나타낸다.
value 속성은
반드시 존재해야 한다. 그 값은 요소 콘텐츠를 기계가 읽을 수 있는 형식으로 나타낸 것이어야 한다.
값이 날짜 또는 시간과 관련된 경우에는 더 구체적인 time 요소를 대신 사용할 수 있다.
이 요소는 여러 목적으로 사용할 수 있다.
이 명세에 정의된 마이크로포맷 또는 마이크로데이터 속성과 함께 사용하면,
이 요소는 데이터 처리기를 위한 기계가 읽을 수 있는 값과 웹 브라우저 렌더링을 위한 사람이 읽을 수
있는 값을 모두 제공한다. 이 경우 value 속성에
사용할 형식은
사용 중인 마이크로포맷 또는 마이크로데이터 어휘에 의해 결정된다.
그러나 페이지의 스크립트와 함께 사용하여 사람이 읽을 수 있는 값 옆에 스크립트가 저장할 리터럴 값을
제공할 수도 있다. 그러한 경우 사용할 형식은 오직 스크립트의 필요에 따라 결정된다. (data-* 속성도 그러한 상황에서
유용할 수 있다.)
여기서는 짧은 표의 숫자 값을 data 요소를
사용하여
인코딩한다. 따라서 한 열에서는 숫자가 텍스트 형식으로 표시되고 다른 열에서는 분해된 형식으로
표시되더라도, 표 정렬 JavaScript 라이브러리가 각 열에 정렬 메커니즘을 제공할 수 있다.
< script src = "sortable.js" ></ script >
< table class = "sortable" >
< thead > < tr > < th > Game < th > Corporations < th > Map Size
< tbody >
< tr > < td > 1830 < td > < data value = "8" > Eight</ data > < td > < data value = "93" > 19+74 hexes (93 total)</ data >
< tr > < td > 1856 < td > < data value = "11" > Eleven</ data > < td > < data value = "99" > 12+87 hexes (99 total)</ data >
< tr > < td > 1870 < td > < data value = "10" > Ten</ data > < td > < data value = "149" > 4+145 hexes (149 total)</ data >
</ table >
time
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
datetime 속성이 있는 경우:
구문 콘텐츠.
datetime —
기계가 읽을 수 있는 값
datetime이
있는 기본.
[Exposed =Window ]
interface HTMLTimeElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , Reflect ] attribute DOMString dateTime ;
};
time 요소는 자신의 콘텐츠와,
datetime 속성에 있는
해당 콘텐츠의 기계가 읽을 수 있는 형식을 함께 나타낸다. 콘텐츠의 종류는 아래에 설명된 다양한
종류의 날짜, 시간, 시간대 오프셋 및 기간으로 제한된다.
datetime
속성은 존재할 수 있다. 존재하는 경우 그 값은 요소 콘텐츠를 기계가 읽을 수 있는 형식으로 나타낸
것이어야 한다.
datetime 콘텐츠
속성이 없는 time 요소에는 요소 자손이
없어야 한다.
time 요소의
날짜시간 값은 요소에 datetime 콘텐츠
속성이 있으면 그 속성의 값이고, 그렇지 않으면 time 요소의 자식 텍스트 콘텐츠이다.
time 요소의 날짜시간 값은 다음 구문 중 하나와
일치해야 한다.
< time > 2011-11</ time >
< time > 2011-11-18</ time >
< time > 11-18</ time >
< time > 14:54</ time >
< time > 14:54:39</ time >
< time > 14:54:39.929</ time >
< time > 2011-11-18T14:54</ time >
< time > 2011-11-18T14:54:39</ time >
< time > 2011-11-18T14:54:39.929</ time >
< time > 2011-11-18 14:54</ time >
< time > 2011-11-18 14:54:39</ time >
< time > 2011-11-18 14:54:39.929</ time >
날짜는 있지만 시간대 오프셋이 없는 시간은 하루 동안 각 시간대의 동일한 특정 시각에 관찰되는 이벤트를 지정하는 데 유용하다. 예를 들어 2020년 새해는 모든 시간대에서 정확히 같은 순간이 아니라 각 시간대의 2020-01-01 00:00에 기념된다. 화상 회의처럼 모든 시간대에서 동일한 시점에 발생하는 이벤트에는 유효한 전역 날짜 및 시간 문자열이 더 유용할 가능성이 크다.
< time > Z</ time >
< time > +0000</ time >
< time > +00:00</ time >
< time > -0800</ time >
< time > -08:00</ time >
날짜가 없는 시간 또는 여러 날짜에 반복되는 이벤트를 가리키는 시간에서는, 시간을 제어하는 지리적 위치를 지정하는 것이 시간대 오프셋을 지정하는 것보다 일반적으로 더 유용하다. 지리적 위치의 시간대 오프셋은 일광 절약 시간제로 인해 변경되기 때문이다. 일부 경우에는 시간대 경계가 다시 그려질 때처럼 지리적 위치의 시간대 자체가 바뀌기도 한다. 이는 2011년 말 사모아에서 일어났다. 시간대의 경계와 각 시간대 안에서 적용되는 규칙을 설명하는 데이터베이스가 있으며, 이를 시간대 데이터베이스라고 한다. [TZDATABASE]
< time > 2011-11-18T14:54Z</ time >
< time > 2011-11-18T14:54:39Z</ time >
< time > 2011-11-18T14:54:39.929Z</ time >
< time > 2011-11-18T14:54+0000</ time >
< time > 2011-11-18T14:54:39+0000</ time >
< time > 2011-11-18T14:54:39.929+0000</ time >
< time > 2011-11-18T14:54+00:00</ time >
< time > 2011-11-18T14:54:39+00:00</ time >
< time > 2011-11-18T14:54:39.929+00:00</ time >
< time > 2011-11-18T06:54-0800</ time >
< time > 2011-11-18T06:54:39-0800</ time >
< time > 2011-11-18T06:54:39.929-0800</ time >
< time > 2011-11-18T06:54-08:00</ time >
< time > 2011-11-18T06:54:39-08:00</ time >
< time > 2011-11-18T06:54:39.929-08:00</ time >
< time > 2011-11-18 14:54Z</ time >
< time > 2011-11-18 14:54:39Z</ time >
< time > 2011-11-18 14:54:39.929Z</ time >
< time > 2011-11-18 14:54+0000</ time >
< time > 2011-11-18 14:54:39+0000</ time >
< time > 2011-11-18 14:54:39.929+0000</ time >
< time > 2011-11-18 14:54+00:00</ time >
< time > 2011-11-18 14:54:39+00:00</ time >
< time > 2011-11-18 14:54:39.929+00:00</ time >
< time > 2011-11-18 06:54-0800</ time >
< time > 2011-11-18 06:54:39-0800</ time >
< time > 2011-11-18 06:54:39.929-0800</ time >
< time > 2011-11-18 06:54-08:00</ time >
< time > 2011-11-18 06:54:39-08:00</ time >
< time > 2011-11-18 06:54:39.929-08:00</ time >
날짜와 시간대 오프셋이 있는 시간은 특정 이벤트나, 시간이 특정 지리적 위치에 고정되지 않은 반복 가상 이벤트를 지정하는 데 유용하다. 예를 들어 소행성이 충돌한 정확한 시각이나, 세계의 특정 지역이 일광 절약 시간제를 적용하는지와 관계없이 매일 1400 UTC에 열리는 일련의 회의 중 특정 회의가 이에 해당한다. 정확한 시각이 특정 지리적 위치의 현지 시간대 오프셋에 따라 달라지는 이벤트에는 해당 지리적 위치와 결합한 유효한 현지 날짜 및 시간 문자열이 더 유용할 가능성이 크다.
< time > 2011-W47</ time >
< time > 2011</ time >
< time > 0001</ time >
< time > PT4H18M3S</ time >
< time > 4h 18m 3s</ time >
요소 콘텐츠의 기계가 읽을 수 있는 등가물은 요소의 날짜시간 값에서 다음 알고리즘을 사용하여 얻어야 한다:
요소의 날짜시간 값에서 월 문자열을 구문 분석한 결과가 월이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.
요소의 날짜시간 값에서 날짜 문자열을 구문 분석한 결과가 날짜이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.
요소의 날짜시간 값에서 연도 없는 날짜 문자열을 구문 분석한 결과가 연도 없는 날짜이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.
요소의 날짜시간 값에서 시간 문자열을 구문 분석한 결과가 시간이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.
요소의 날짜시간 값에서 현지 날짜 및 시간 문자열을 구문 분석한 결과가 현지 날짜 및 시간이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.
요소의 날짜시간 값에서 시간대 오프셋 문자열을 구문 분석한 결과가 시간대 오프셋이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.
요소의 날짜시간 값에서 전역 날짜 및 시간 문자열을 구문 분석한 결과가 전역 날짜 및 시간이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.
요소의 날짜시간 값에서 주 문자열을 구문 분석한 결과가 주이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.
요소의 날짜시간 값이 오직 ASCII 숫자로만 구성되고, 그중 적어도 하나가 U+0030 DIGIT ZERO (0)가 아니면, 기계가 읽을 수 있는 등가물은 해당 숫자를 연도로 나타내는 십진수 해석이다. 반환한다.
요소의 날짜시간 값에서 기간 문자열을 구문 분석한 결과가 기간이면, 그것이 기계가 읽을 수 있는 등가물이다. 반환한다.
기계가 읽을 수 있는 등가물이 없다.
위에서 참조한 알고리즘은 임의의 문자열 s에 대해 오직 하나의 알고리즘만 값을 반환하도록 설계된 것이다. 더 효율적인 방법은 이러한 모든 데이터 유형을 한 번에 구문 분석하는 단일 알고리즘을 만드는 것일 수 있다. 그러한 알고리즘의 개발은 독자의 연습 문제로 남겨 둔다.
time 요소는 예를 들어
마이크로포맷에서 날짜를 인코딩하는 데 사용할 수 있다. 다음은 time 요소를 사용하는
hCalendar 변형을 통해 이벤트를 인코딩하는 가상의 방법을 보여 준다:
< div class = "vevent" >
< a class = "url" href = "http://www.web2con.com/" > http://www.web2con.com/</ a >
< span class = "summary" > Web 2.0 Conference</ span > :
< time class = "dtstart" datetime = "2005-10-05" > October 5</ time > -
< time class = "dtend" datetime = "2005-10-07" > 7</ time > ,
at the < span class = "location" > Argent Hotel, San Francisco, CA</ span >
</ div >
여기서는 Atom 어휘를 기반으로 한 가상의 마이크로데이터 어휘를 time 요소와 함께 사용하여
블로그 게시물의 게시 날짜를 마크업한다.
< article itemscope itemtype = "https://n.example.org/rfc4287" >
< h1 itemprop = "title" > Big tasks</ h1 >
< footer > Published < time itemprop = "published" datetime = "2009-08-29" > two days ago</ time > .</ footer >
< p itemprop = "content" > Today, I went out and bought a bike for my kid.</ p >
</ article >
이 예제에서는 다른 기사의 게시 날짜를 time을
사용하여 마크업한다.
이번에는 schema.org 마이크로데이터 어휘를 사용한다:
< article itemscope itemtype = "http://schema.org/BlogPosting" >
< h1 itemprop = "headline" > Small tasks</ h1 >
< footer > Published < time itemprop = "datePublished" datetime = "2009-08-30" > yesterday</ time > .</ footer >
< p itemprop = "articleBody" > I put a bike bell on her bike.</ p >
</ article >
다음 조각에서는 나중에 스크립트로 처리할 수 있도록 time 요소를 사용하여
ISO8601 형식으로 날짜를 인코딩한다:
< p > Our first date was < time datetime = "2006-09-23" > a Saturday</ time > .</ p >
두 번째 조각에서는 값에 시간이 포함된다:
< p > We stopped talking at < time datetime = "2006-09-24T05:00-07:00" > 5am the next morning</ time > .</ p >
페이지가 로드한 스크립트는 페이지가 날짜와 시간을 time 요소로 마크업한다는
내부 규칙을 알고 있으므로, 페이지를 훑으면서 그 안의 모든 time 요소를 확인하여
날짜와 시간의 색인을 만들 수 있다.
예를 들어 이 요소는 "Friday"라는 문자열에, 2011년 11월 18일이 "Friday"에 대응하는 의미라는 추가 의미 체계를 함께 전달한다:
Today is < time datetime = "2011-11-18" > Friday</ time > .
이 예제에서는 태평양 표준시 시간대의 특정 시각을 지정한다:
Your next meeting is at < time datetime = "2011-11-18T15:00-08:00" > 3pm</ time > .
code
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.code 요소는 컴퓨터 코드의
조각을 나타낸다. 이는 XML 요소 이름, 파일 이름,
컴퓨터 프로그램 또는 컴퓨터가 인식할 수 있는 기타 문자열일 수 있다.
마크업되는 컴퓨터 코드의 언어를 나타내는 공식적인 방법은 없다. 예를 들어 구문 강조 스크립트가
올바른 규칙을 사용할 수 있도록 code 요소에 사용된
언어를
표시하려는 작성자는 class 속성을 사용할 수 있다. 예를 들어 요소에
"language-" 접두사가 붙은 클래스를 추가할 수 있다.
다음 예제는 문장 부호를 포함하여 요소 이름과 컴퓨터 코드를 마크업하기 위해 단락에서 이 요소를 사용하는 방법을 보여 준다.
< p > The < code > code</ code > element represents a fragment of computer
code.</ p >
< p > When you call the < code > activate()</ code > method on the
< code > robotSnowman</ code > object, the eyes glow.</ p >
< p > The example below uses the < code > begin</ code > keyword to indicate
the start of a statement block. It is paired with an < code > end</ code >
keyword, which is followed by the < code > .</ code > punctuation character
(full stop) to indicate the end of the program.</ p >
다음 예제는 pre 및 code 요소를 사용하여 코드
블록을 마크업하는 방법을 보여 준다.
< pre >< code class = "language-pascal" > var i: Integer;
begin
i := 1;
end.</ code ></ pre >
이 예제에서는 사용된 언어를 나타내기 위해 클래스를 사용한다.
자세한 내용은 pre 요소를
참조한다.
var
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.var 요소는 변수를 나타낸다. 이는 수학 표현식이나 프로그래밍 맥락의
실제 변수, 상수를 나타내는 식별자, 물리량을 식별하는 기호, 함수 매개변수 또는 산문에서 자리표시자로
사용되는 용어일 수 있다.
아래 단락에서는 문자 "n"을 산문 안의 변수로 사용한다:
< p > If there are < var > n</ var > pipes leading to the ice
cream factory then I expect at < em > least</ em > < var > n</ var >
flavors of ice cream to be available for purchase!</ p >
수학, 특히 가장 간단한 표현식을 넘어서는 모든 경우에는 MathML이 더 적절하다. 그러나 var 요소는 이후 MathML 표현식에서
언급되는 특정 변수를 참조하는 데 여전히 사용할 수 있다.
이 예제에서는 방정식과 그 방정식의 변수를 참조하는 범례를 보여 준다. 표현식 자체는 MathML로
마크업하지만, 그림의 범례에 언급되는 변수에는 var를
사용한다.
< figure >
< math >
< mi > a</ mi >
< mo > =</ mo >
< msqrt >
< msup >< mi > b</ mi >< mn > 2</ mn ></ msup >
< mi > +</ mi >
< msup >< mi > c</ mi >< mn > 2</ mn ></ msup >
</ msqrt >
</ math >
< figcaption >
Using Pythagoras' theorem to solve for the hypotenuse < var > a</ var > of
a triangle with sides < var > b</ var > and < var > c</ var >
</ figcaption >
</ figure >
여기서는 질량-에너지 등가성을 설명하는 방정식을 문장 안에서 사용하고, var 요소를 사용하여 그 방정식의
변수와 상수를 마크업한다:
< p > Then she turned to the blackboard and picked up the chalk. After a few moment's
thought, she wrote < var > E</ var > = < var > m</ var > < var > c</ var >< sup > 2</ sup > . The teacher
looked pleased.</ p >
samp
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.samp 요소는 다른 프로그램
또는 컴퓨팅 시스템의 예제 출력이나 인용된 출력을 나타낸다.
이 요소는 웹 애플리케이션에서 즉각적인 출력을 제공하는 데 사용할 수 있는 output 요소와 대비할 수
있다.
이 예제는 samp
요소를 인라인으로 사용하는 방법을 보여 준다:
< p > The computer said < samp > Too much cheese in tray
two</ samp > but I didn't know what that meant.</ p >
두 번째 예제는 콘솔 프로그램의 예제 출력 블록을 보여 준다. 중첩된
samp 및 kbd 요소를 사용하면
스타일시트로 예제 출력의 특정 요소에 스타일을 지정할 수 있다. 또한 samp의 일부에는 훨씬 더
상세한 마크업으로 주석을 달아 매우 정밀한 스타일 지정을 가능하게 한다. 이를 위해 span 요소를 사용한다.
< pre >< samp >< span class = "prompt" > jdoe@mowmow:~$</ span > < kbd > ssh demo.example.com</ kbd >
Last login: Tue Apr 12 09:10:17 2005 from mowmow.example.com on pts/1
Linux demo 2.6.10-grsec+gg3+e+fhs6b+nfs+gr0501+++p3+c4a+gr2b-reslog-v6.189 #1 SMP Tue Feb 1 11:22:36 PST 2005 i686 unknown
< span class = "prompt" > jdoe@demo:~$</ span > < span class = "cursor" > _</ span ></ samp ></ pre >
세 번째 예제는 입력 블록과 그에 대응하는 출력을 보여 준다. 이 예제는
code 및 samp 요소를 모두 사용한다.
< pre >
< code class = "language-javascript" > console.log(2.3 + 2.4)</ code >
< samp > 4.699999999999999</ samp >
</ pre >
kbd
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.kbd 요소는 사용자 입력
(일반적으로 키보드 입력이지만 음성 명령과 같은 다른 입력을 나타내는 데도 사용할 수 있음)을 나타낸다.
kbd 요소가 samp 요소 안에 중첩되면,
시스템에서 에코된 입력을 나타낸다.
kbd 요소가 samp 요소를 포함하면,
메뉴 항목을 호출하는 경우처럼 시스템 출력을 기반으로 한 입력을 나타낸다.
kbd 요소가 다른 kbd 요소 안에 중첩되면,
입력 메커니즘에 적합한 실제 키 또는 기타 단일 입력 단위를 나타낸다.
여기서는 kbd 요소를
사용하여 눌러야 할 키를 나타낸다:
< p > To make George eat an apple, press < kbd >< kbd > Shift</ kbd > + < kbd > F3</ kbd ></ kbd ></ p >
두 번째 예제에서는 사용자에게 특정 메뉴 항목을 선택하라고 지시한다. 바깥쪽
kbd 요소는 입력 블록을
마크업하고, 안쪽 kbd 요소는 입력의 각 개별
단계를 나타내며, 그 안의 samp 요소는 각 단계가
시스템에 표시되는 것, 이 경우에는 메뉴 레이블을 기반으로 한 입력임을 나타낸다:
< p > To make George eat an apple, select
< kbd >< kbd >< samp > File</ samp ></ kbd > |< kbd >< samp > Eat Apple...</ samp ></ kbd ></ kbd >
</ p >
이 정도의 정밀함은 필요하지 않다. 다음도 똑같이 적절하다:
< p > To make George eat an apple, select < kbd > File | Eat Apple...</ kbd ></ p >
sub 및 sup 요소
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
sub
요소: 작성자용; 구현자용.sup
요소: 작성자용; 구현자용.HTMLElement를 사용한다.sup
요소는 위 첨자를 나타내고, sub
요소는 아래 첨자를 나타낸다.
이 요소들은 단지 표현을 위한 조판이 아니라 특정 의미가 있는 조판 관례를 마크업하는 데만 사용해야
한다. 예를 들어 LaTeX 문서 작성 시스템의 이름에 sub 및
sup
요소를 사용하는 것은 적절하지 않다. 일반적으로 작성자는 이 요소가 없으면 콘텐츠의 의미가
달라지는 경우에만 이 요소를 사용해야 한다.
일부 언어에서는 위 첨자가 특정 약어의 조판 관례 일부이다.
< p > Their names are
< span lang = "fr" >< abbr > M< sup > lle</ sup ></ abbr > Gwendoline</ span > and
< span lang = "fr" >< abbr > M< sup > me</ sup ></ abbr > Denise</ span > .</ p >
sub
요소는 아래 첨자가 있는 변수의 경우 var
요소 안에서 사용할 수
있다.
여기서는 sub
요소를 사용하여 변수군에서 변수를 식별하는 아래 첨자를 나타낸다:
< p > The coordinate of the < var > i</ var > th point is
(< var > x< sub >< var > i</ var ></ sub ></ var > , < var > y< sub >< var > i</ var ></ sub ></ var > ).
For example, the 10th point has coordinate
(< var > x< sub > 10</ sub ></ var > , < var > y< sub > 10</ sub ></ var > ).</ p >
수학 표현식에서는 아래 첨자와 위 첨자를 자주 사용한다. 작성자는 수학 마크업에 MathML을 사용하는
것이 권장되지만, 자세한 수학적 마크업이 필요하지 않은 경우 sub 및
sup
사용을 선택할 수 있다. [MATHML]
< var > E</ var > =< var > m</ var >< var > c</ var >< sup > 2</ sup >
f(< var > x</ var > , < var > n</ var > ) = log< sub > 4</ sub >< var > x</ var >< sup >< var > n</ var ></ sup >
i
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.i 요소는 분류학적 명칭, 전문 용어,
다른 언어의 관용구, 음역, 생각 또는 서양 문서의 선박 이름처럼 다른 특성을 가진 텍스트임을 나타내는
방식으로 대체 목소리나 분위기의 텍스트 구간 또는 일반적인 산문과 달리 구별되는 텍스트 구간을 나타낸다.
본문과 다른 언어의 용어에는 lang 속성(XML에서는 XML 네임스페이스의 lang 속성)으로 주석을
달아야 한다.
아래 예제는 i 요소의 사용법을 보여 준다:
< p > The < i class = "taxonomy" > Felis silvestris catus</ i > is cute.</ p >
< p > The term < i > prose content</ i > is defined above.</ p >
< p > There is a certain < i lang = "fr" > je ne sais quoi</ i > in the air.</ p >
다음 예제에서는 꿈의 장면을 i 요소로 마크업한다.
< p > Raymond tried to sleep.</ p >
< p >< i > The ship sailed away on Thursday</ i > , he
dreamt. < i > The ship had many people aboard, including a beautiful
princess called Carey. He watched her, day-in, day-out, hoping she
would notice him, but she never did.</ i ></ p >
< p >< i > Finally one night he picked up the courage to speak with
her—</ i ></ p >
< p > Raymond woke with a start as the fire alarm rang out.</ p >
작성자는 i 요소에 class 속성을 사용하여 요소를 사용하는 이유를
식별할 수 있다. 그러면 특정 사용 방식의 스타일(예: 분류학적 용어와 대비되는 꿈의 장면)을 나중에
변경할 때 작성자가 문서 전체(또는 관련 문서 묶음)를 훑으면서 각 사용 부분에 주석을 추가할 필요가
없다.
작성자는 i 요소보다 다른 요소가
더 적절한지 고려하는 것이 권장된다. 예를 들어 강세 강조를 마크업하려면 em 요소를, 용어의 정의 인스턴스를
마크업하려면 dfn 요소를 사용한다.
다른 요소의 스타일을 변경할 수 있는 것과 마찬가지로 스타일시트를 사용하여 i 요소의 형식을 지정할 수 있다.
따라서 i 요소의 콘텐츠가
반드시 기울임꼴로 표시되는 것은 아니다.
b
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.b 요소는 추가적인 중요성을
전달하거나 대체 목소리나 분위기를 암시하지 않으면서 실용적인 목적으로 주의를 끄는 텍스트 구간을
나타낸다. 예를 들어 문서 초록의 키워드, 리뷰의
제품 이름, 대화형 텍스트 기반 소프트웨어의 실행 가능한 단어 또는 기사의 리드가 이에 해당한다.
다음 예제는 키워드를 중요하다고 마크업하지 않으면서 강조하기 위해 b 요소를 사용하는 방법을 보여 준다:
< p > The < b > frobonitor</ b > and < b > barbinator</ b > components are fried.</ p >
다음 예제에서는 텍스트 어드벤처의 객체를 b 요소를 사용하여
특별한 것으로
강조한다.
< p > You enter a small room. Your < b > sword</ b > glows
brighter. A < b > rat</ b > scurries past the corner wall.</ p >
b 요소가 적절한 또 다른 경우는
리드 문장이나 단락을 마크업할 때이다. 다음 예제는 새끼 고양이가
토끼를
어미로 받아들인 것에 관한 BBC 기사를 마크업하는 방법을 보여 준다:
< article >
< h2 > Kittens 'adopted' by pet rabbit</ h2 >
< p >< b class = "lede" > Six abandoned kittens have found an
unexpected new mother figure — a pet rabbit.</ b ></ p >
< p > Veterinary nurse Melanie Humble took the three-week-old
kittens to her Aberdeen home.</ p >
[...]
i 요소와 마찬가지로 작성자는
b 요소에 class 속성을 사용하여 요소를 사용하는 이유를
식별할 수 있다. 그러면 특정 사용 방식의 스타일을 나중에 변경할 때 작성자가 각 사용 부분에 일일이
주석을 추가할 필요가 없다.
b 요소는 더 적절한 다른 요소가
없을 때 최후의 수단으로 사용해야 한다. 특히 제목에는 h1
부터 h6
요소를 사용하고, 강세 강조에는 em 요소를 사용하며, 중요성은
strong 요소로 나타내고,
표시하거나 강조하는 텍스트에는 mark 요소를 사용해야 한다.
다른 요소의 스타일을 변경할 수 있는 것과 마찬가지로 스타일시트를 사용하여 b 요소의 형식을 지정할 수 있다.
따라서 b 요소의 콘텐츠가
반드시 굵게 표시되는 것은 아니다.
u
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.u 요소는 명확히 표현되어
렌더링되지만 말로 표현되지 않은 비텍스트 주석이 있는 텍스트 구간을 나타낸다. 예를 들어 중국어 텍스트에서
고유명사라고
표시하거나(중국어 고유명사 표시), 철자가 틀렸다고 표시하는 경우가 이에 해당한다.
대부분의 경우 다른 요소가 더 적절할 가능성이 높다. 강세 강조에는 em 요소를 사용해야 한다. 키워드나
구문을 표시할 때는 맥락에 따라 b 요소 또는 mark 요소를 사용해야 한다.
책 제목에는 cite 요소를 사용해야 한다.
명시적인 텍스트 주석으로 텍스트에 레이블을 지정할 때는 ruby
요소를 사용해야 한다.
전문 용어, 분류학적 명칭, 음역, 생각 또는 서양 문서의 선박 이름에는 i 요소를 사용해야 한다.
시각적 표현에서 u 요소의 기본 렌더링은
하이퍼링크의
관례적인 렌더링(밑줄)과 충돌한다. 작성자는 하이퍼링크로 오인될 수 있는 곳에서 u 요소를 사용하지 않는 것이
권장된다.
이 예제에서는 u 요소를
사용하여 단어의 철자가 틀렸음을 표시한다:
< p > The < u > see</ u > is full of fish.</ p >
mark
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.mark 요소는 다른 맥락에서의
관련성 때문에 한 문서에서 참조 목적으로 표시하거나
강조한 텍스트 구간을 나타낸다. 산문에서 참조하는
인용문이나 기타 텍스트 블록에 사용하면 원래는 존재하지 않았지만, 블록을 처음 작성할 때 원저자가
중요하다고 생각하지 않았을 수 있으나 이제 예상하지 못한 관점에서 검토 대상이 된 텍스트 부분에
독자의 주의를 끌기 위해 추가된 강조를 나타낸다. 문서의 본문에 사용하면 사용자의 현재 활동과 관련될
가능성이 높아 강조한 문서의 일부를 나타낸다.
이 예제는 인용문의 특정 부분에 주의를 끌기 위해 mark 요소를 사용하는 방법을
보여 준다:
< p lang = "en-US" > Consider the following quote:</ p >
< blockquote lang = "en-GB" >
< p > Look around and you will find, no-one's really
< mark > colour</ mark > blind.</ p >
</ blockquote >
< p lang = "en-US" > As we can tell from the < em > spelling</ em > of the word,
the person writing this quote is clearly not American.</ p >
(그러나 요소를 철자가 틀린 것으로 표시하는 것이 목적이라면, 클래스가 지정될 수도 있는 u 요소가 더 적절하다.)
mark 요소의 또 다른
예는 일부 검색 문자열과 일치하는 문서 부분을 강조하는 것이다. 누군가 문서를 보고 있고 서버가
사용자가 "kitten"이라는 단어를 검색 중임을 안다면, 서버는 단락 하나를 다음과 같이 수정한 문서를
반환할 수 있다:
< p > I also have some < mark > kitten</ mark > s who are visiting me
these days. They're really cute. I think they like my garden! Maybe I
should adopt a < mark > kitten</ mark > .</ p >
다음 조각에서는 텍스트 단락이 코드 조각의 특정 부분을 참조한다.
< p > The highlighted part below is where the error lies:</ p >
< pre >< code > var i: Integer;
begin
i := < mark > 1.1</ mark > ;
end.</ code ></ pre >
이는 구문 강조와는 별개이며, 구문 강조에는 span이 더 적절하다.
두 가지를 결합하면 다음과 같다:
< p > The highlighted part below is where the error lies:</ p >
< pre >< code >< span class = keyword > var</ span > < span class = ident > i</ span > : < span class = type > Integer</ span > ;
< span class = keyword > begin</ span >
< span class = ident > i</ span > := < span class = literal >< mark > 1.1</ mark ></ span > ;
< span class = keyword > end</ span > .</ code ></ pre >
이는 원래 강조되지 않았던 인용 텍스트의 일부를 강조하기 위해 mark를 사용하는 또 다른
예이다. 이 예제에서는 일반적인 조판 관례에 따라 작성자가 인용문 안의 mark 요소를 명시적으로
기울임꼴로 렌더링하도록 스타일을 지정했다.
< style >
blockquote mark , q mark {
font : inherit ; font-style : italic ;
text-decoration : none ;
background : transparent ; color : inherit ;
}
. bubble em {
font : inherit ; font-size : larger ;
text-decoration : underline ;
}
</ style >
< article >
< h1 > She knew</ h1 >
< p > Did you notice the subtle joke in the joke on panel 4?</ p >
< blockquote >
< p class = "bubble" > I didn't < em > want</ em > to believe. < mark > Of course
on some level I realized it was a known-plaintext attack.</ mark > But I
couldn't admit it until I saw for myself.</ p >
</ blockquote >
< p > (Emphasis mine.) I thought that was great. It's so pedantic, yet it
explains everything neatly.</ p >
</ article >
덧붙여 이 예제에서 원래 인용된 텍스트의 일부인 em
요소와, 설명을 위해 일부를
강조하는 mark 요소의 차이에
유의한다.
다음 예제는 텍스트 구간의 중요성(strong)을 나타내는 것과
텍스트 구간의 관련성(mark)을
나타내는 것의
차이를 보여 준다. 이는 교과서에서 발췌한 것으로, 시험과 관련된 부분을 강조했다. 안전 경고는
중요할 수 있지만 시험과는 관련이 없는 것으로 보인다.
< h3 > Wormhole Physics Introduction</ h3 >
< p >< mark > A wormhole in normal conditions can be held open for a
maximum of just under 39 minutes.</ mark > Conditions that can increase
the time include a powerful energy source coupled to one or both of
the gates connecting the wormhole, and a large gravity well (such as a
black hole).</ p >
< p >< mark > Momentum is preserved across the wormhole. Electromagnetic
radiation can travel in both directions through a wormhole,
but matter cannot.</ mark ></ p >
< p > When a wormhole is created, a vortex normally forms.
< strong > Warning: The vortex caused by the wormhole opening will
annihilate anything in its path.</ strong > Vortexes can be avoided when
using sufficiently advanced dialing technology.</ p >
< p >< mark > An obstruction in a gate will prevent it from accepting a
wormhole connection.</ mark ></ p >
bdi
요소현재의 모든 엔진에서 지원된다.
dir 전역 속성은 이 요소에서 특별한
의미 체계를 가진다.HTMLElement를 사용한다.bdi 요소는 양방향 텍스트
형식 지정의 목적으로 주변 환경에서 격리할 텍스트 구간을 나타낸다. [BIDI]
dir 전역 속성은 이 요소에서
기본값이 auto이다(다른
요소에서처럼 부모 요소로부터 상속되지 않는다).
이 요소에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.
이 요소는 방향성을 알 수 없는 사용자 생성 콘텐츠를 삽입할 때 특히 유용하다.
이 예제에서는 사용자 이름과 사용자가 제출한 게시물 수를 함께 표시한다. bdi 요소를 사용하지 않았다면
아랍어 사용자의 사용자 이름이 텍스트를 혼란스럽게 만들었을 것이다(양방향 알고리즘은 콜론과 숫자
"3"을 "posts"라는 단어 옆이 아니라 "User"라는 단어 옆에 배치했을 것이다).
< ul >
< li > User < bdi > jcranmer</ bdi > : 12 posts.
< li > User < bdi > hober</ bdi > : 5 posts.
< li > User < bdi > إيان</ bdi > : 3 posts.
</ ul >
bdi
요소를 사용하면 사용자 이름이 예상대로 동작한다.
bdi 요소를
b 요소로 바꾸면,
사용자 이름이 양방향 알고리즘을 혼란스럽게 하여 세 번째 항목은 "User 3 :"라고 표시된 뒤
아랍어 이름(오른쪽에서 왼쪽 방향), "posts" 및 마침표가 이어진다.
bdo
요소현재의 모든 엔진에서 지원된다.
dir 전역 속성은 이 요소에서 특별한
의미 체계를 가진다.HTMLElement를 사용한다.bdo 요소는 자식의 명시적인
텍스트 방향성 형식 제어를 나타낸다. 작성자는
명시적으로 방향 재정의를 지정하여 유니코드 양방향 알고리즘을 재정의할 수 있다.
[BIDI]
작성자는 이 요소에 dir 속성을 반드시
지정해야 한다. 왼쪽에서 오른쪽 방향 재정의를 지정하려면 값 ltr을
사용하고, 오른쪽에서 왼쪽 방향
재정의를 지정하려면 값 rtl을 사용한다. auto 값은 지정해서는 안 된다.
이 요소에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.
span
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
[Exposed =Window ]
interface HTMLSpanElement : HTMLElement {
[HTMLConstructor ] constructor ();
};
span 요소는 그 자체로는
아무런 의미가 없지만, 예를 들어 class,
lang 또는 dir과 같은 전역 속성과 함께 사용하면 유용할 수 있다. 이 요소는
자신의 자식을 나타낸다.
이 예제에서는 코드 조각을 span 요소와
class 속성으로 마크업하여, CSS에서
키워드와 식별자에 색상을 지정할 수 있게 한다:
< pre >< code class = "lang-c" >< span class = "keyword" > for</ span > (< span class = "ident" > j</ span > = 0; < span class = "ident" > j</ span > < 256; < span class = "ident" > j</ span > ++) {
< span class = "ident" > i_t3</ span > = (< span class = "ident" > i_t3</ span > & 0x1ffff) | (< span class = "ident" > j</ span > << 17);
< span class = "ident" > i_t6</ span > = (((((((< span class = "ident" > i_t3</ span > >> 3) ^ < span class = "ident" > i_t3</ span > ) >> 1) ^ < span class = "ident" > i_t3</ span > ) >> 8) ^ < span class = "ident" > i_t3</ span > ) >> 5) & 0xff;
< span class = "keyword" > if</ span > (< span class = "ident" > i_t6</ span > == < span class = "ident" > i_t1</ span > )
< span class = "keyword" > break</ span > ;
}</ code ></ pre >
br
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
[Exposed =Window ]
interface HTMLBRElement : HTMLElement {
[HTMLConstructor ] constructor ();
// also has obsolete members
};
줄 바꿈은 일반적으로 시각 매체에서 뒤따르는 텍스트를 물리적으로 새 줄로 이동하여 나타내지만, 스타일시트나 사용자 에이전트가 줄 바꿈을 녹색 점이나 추가 간격과 같은 다른 방식으로 렌더링해도 마찬가지로 타당하다.
br 요소는 시나 주소처럼
실제로 콘텐츠의 일부인 줄 바꿈에만 사용해야 한다.
다음 예제는 br 요소를 올바르게 사용한 것이다:
< p > P. Sherman< br >
42 Wallaby Way< br >
Sydney</ p >
br 요소는 단락 안에서 주제별
그룹을 구분하는 데 사용해서는 안 된다.
다음 예제는 br 요소를 오용하므로 적합하지 않다:
< p >< a ...> 34 comments.</ a >< br >
< a ...> Add a comment.</ a ></ p >
< p >< label > Name: < input name = "name" ></ label >< br >
< label > Address: < input name = "address" ></ label ></ p >
다음은 위 예제의 올바른 대안이다:
< p >< a ...> 34 comments.</ a ></ p >
< p >< a ...> Add a comment.</ a ></ p >
< p >< label > Name: < input name = "name" ></ label ></ p >
< p >< label > Address: < input name = "address" ></ label ></ p >
단락이 단 하나의 br 요소로만 구성된 경우,
자리표시자 빈 줄(예: 템플릿에서)을 나타낸다. 이러한 빈 줄은 표현 목적으로 사용해서는 안 된다.
br 요소 내부의 모든 콘텐츠는
주변 텍스트의 일부로 간주해서는 안 된다.
이 요소에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.
wbr
요소현재의 모든 엔진에서 지원된다.
HTMLElement를 사용한다.다음 예제에서는 효과를 위해 누군가가 말한 내용을 하나의 긴 단어로 작성했다. 그러나 텍스트를 읽기
쉬운 방식으로 줄 바꿈할 수 있도록 인용문의 각 단어를 wbr 요소로 구분한다.
< p > So then she pointed at the tiger and screamed
"there< wbr > is< wbr > no< wbr > way< wbr > you< wbr > are< wbr > ever< wbr > going< wbr > to< wbr > catch< wbr > me"!</ p >
wbr 요소 내부의 모든
콘텐츠는 주변 텍스트의 일부로 간주해서는 안 된다.
var wbr = document. createElement( "wbr" );
wbr. textContent = "This is wrong" ;
document. body. appendChild( wbr);
이 요소에는 양방향 알고리즘과 관련된 렌더링 요구 사항이 있다.
이 절은 비규범적이다.
| 요소 | 목적 | 예제 |
|---|---|---|
a
|
하이퍼링크 |
|
em
|
강세 강조 |
|
strong
|
중요성 |
|
small
|
부가 설명 |
|
s
|
부정확한 텍스트 |
|
cite
|
작품 제목 |
|
q
|
인용문 |
|
dfn
|
정의 인스턴스 |
|
abbr
|
약어 |
|
ruby, rt, rp
|
루비 주석 |
|
data
|
기계가 읽을 수 있는 등가물 |
|
time
|
날짜 또는 시간 관련 데이터의 기계가 읽을 수 있는 등가물 |
|
code
|
컴퓨터 코드 |
|
var
|
변수 |
|
samp
|
컴퓨터 출력 |
|
kbd
|
사용자 입력 |
|
sub
|
아래 첨자 |
|
sup
|
위 첨자 |
|
i
|
대체 목소리 |
|
b
|
키워드 |
|
u
|
주석 |
|
mark
|
강조 표시 |
|
bdi
|
텍스트 방향성 격리 |
|
bdo
|
텍스트 방향성 형식 지정 |
|
span
|
기타 |
|
br
|
줄 바꿈 |
|
wbr
|
줄 바꿈 기회 |
|
링크는 a, area,
form 및 link 요소가 생성하는 개념적
구성으로, 두 리소스 사이의 연결을 나타낸다. 그중 하나는 현재의 Document이다. HTML에는 세 종류의 링크가
있다:
현재 문서를 보강하는 데 사용할 리소스에 대한 링크로, 일반적으로 사용자 에이전트가 자동으로 처리한다. 모든 외부 리소스 링크에는 리소스를 가져오는 방법을 설명하는 링크된 리소스를 가져와 처리하는 알고리즘이 있다.
일반적으로 사용자 에이전트가 사용자에게 노출하여, 사용자가 브라우저에서 방문하거나 다운로드하는 등의 방식으로 사용자 에이전트가 해당 리소스로 탐색하게 할 수 있는 다른 리소스에 대한 링크이다.
현재 문서 안의 리소스에 대한 링크로, 해당 리소스에 특별한 의미나 동작을 부여하는 데 사용한다.
href 속성과 rel 속성이 있는 link 요소에서는,
링크 유형 절에서 해당 키워드에 관해 정의한 대로 rel 속성의 키워드에 대한 링크를
생성해야 한다.
마찬가지로 href
속성과 rel 속성이 있는 a 및 area 요소에서는,
링크 유형 절에서 해당 키워드에 관해 정의한 대로 rel 속성의 키워드에
대한 링크를 생성해야 한다. 그러나 link 요소와 달리,
href 속성이
있으면서 rel 속성이 없거나,
rel 속성에
하이퍼링크를 지정한다고 정의된 키워드가 없는
a 및 area 요소도 하이퍼링크를 생성해야 한다.
이 암시적 하이퍼링크는 요소의 노드 문서를
요소의 href 속성이 지정한
리소스에 연결하는 것 외에는 특별한 의미가 없다(링크 유형이 없다).
마찬가지로 rel 속성이 있는
form 요소에서는,
링크 유형 절에서 해당 키워드에 관해 정의한 대로 rel 속성의 키워드에 대한
링크를 생성해야 한다. rel 속성이 없거나,
rel 속성에 하이퍼링크를 지정한다고 정의된 키워드가 없는
form 요소도 하이퍼링크를 생성해야 한다.
하이퍼링크에는 해당 하이퍼링크의 처리 의미 체계를 변경하는 하나 이상의 하이퍼링크 주석이 있을 수 있다.
a 및 area 요소가
생성하는 링크a 및
area
요소의 href 속성 값은
공백으로 둘러싸일 수 있는
유효한 URL이어야 한다.
a
및
area
요소에는 href
속성이 필수는 아니다. 이러한 요소에 href
속성이 없으면 하이퍼링크를 생성하지 않는다.
target 속성이
존재하는 경우, 그 값은 유효한 탐색 가능 대상 이름
또는 키워드여야 한다. 이 속성은 사용할 탐색 가능 객체의
이름을 제공한다. 사용자
에이전트는 하이퍼링크를
따라갈 때 이 이름을
사용한다.
download
속성이 존재하는 경우, 작성자가 하이퍼링크를
리소스를 다운로드하는 데
사용하려
함을 나타낸다. 속성에는 값이 있을 수 있으며, 값이 있으면 로컬 파일 시스템에서 리소스에 레이블을
지정할 때 작성자가 사용하도록 권장하는 기본 파일 이름을 지정한다. 허용되는 값에는 제한이 없지만,
대부분의 파일 시스템은 파일 이름에서 지원하는 문장 부호에 제한이 있으며 사용자 에이전트가 이에
맞게 파일 이름을 조정할 가능성이 있다는 점에 작성자는 주의해야 한다.
현재의 모든 엔진에서 지원된다.
ping 속성이 존재하는
경우, 사용자가 하이퍼링크를 따라갔을 때 알림을 받는 데 관심이 있는 리소스의 URL을 제공한다.
값은 공백으로 구분된 토큰 집합이어야
하며, 각 토큰은 유효한 비어 있지 않은
URL이어야 하고,
해당 URL의 스킴은
HTTP(S) 스킴이어야 한다. 사용자 에이전트는 이 값을 하이퍼링크 감사에 사용한다.
a 및
area
요소의 rel 속성은 요소가
생성하는 링크의 종류를 제어한다.
속성 값은 고유하며 공백으로
구분된 토큰의 순서 없는 집합이어야 한다. 허용되는 키워드와 그 의미는
아래에서 정의한다.
rel의 지원되는
토큰은 a 및
area
요소에 허용되고, 처리 모델에 영향을 주며, 사용자 에이전트가 지원하는 HTML 링크
유형에 정의된 키워드이다. 가능한 지원되는 토큰은 noreferrer,
noopener
및 opener이다.
rel의 지원되는 토큰에는 이 목록에서 사용자 에이전트가 처리 모델을
구현한 토큰만 포함되어야 한다.
rel
속성에는 기본값이 없다. 속성을 생략했거나 속성의 값 중 사용자 에이전트가 인식하는 값이 없으면,
문서와 대상 리소스 사이에는 두 리소스를 연결하는 하이퍼링크가 있다는 것 외에 특별한 관계가 없다.
referrerpolicy 속성은 리퍼러 정책 속성이다. 이 속성의
목적은 하이퍼링크를
따라갈 때 사용할
리퍼러
정책을 설정하는 것이다.
[REFERRERPOLICY]
a 또는
area
요소의 활성화
동작이 호출되면, 사용자 에이전트는 사용자에게
하이퍼링크를 탐색에 사용할지 또는 하이퍼링크가 지정한
리소스를 다운로드할지에 관한 선호를 표시하도록 허용할 수 있다.
사용자 선호가 없는 경우, 요소에 download 속성이 없으면 기본값은 탐색이어야 하고,
속성이 있으면 지정된 리소스를 다운로드하는 것이어야 한다.
이벤트 event가 주어졌을 때 a 또는
area
요소 element의 활성화
동작은 다음과 같다:
element에 href 속성이 없으면 반환한다.
hyperlinkSuffix를 null로 둔다.
element가 a 요소이고,
event의 대상이 ismap
속성이 지정된 img이면:
x와 y를 0으로 둔다.
event의 isTrusted 속성이 true로
초기화되었으면, x를 이미지의 왼쪽 가장자리부터 클릭 위치까지의 CSS 픽셀 단위 거리로 설정하고,
y를 이미지의 위쪽
가장자리부터 클릭 위치까지의 CSS 픽셀 단위 거리로
설정한다.
x가 음수이면 x를 0으로 설정한다.
y가 음수이면 y를 0으로 설정한다.
hyperlinkSuffix를 U+003F (?), ASCII 숫자를 사용하여 십진 정수로 표현한 x의 값, U+002C (,), 그리고 ASCII 숫자를 사용하여 십진 정수로 표현한 y의 값을 이어 붙인 값으로 설정한다.
userInvolvement를 event의 사용자 탐색 관여로 둔다.
사용자가 하이퍼링크를 다운로드하겠다는 선호를 표시했으면, userInvolvement를
"브라우저 UI"로 설정한다.
즉, 사용자가 다운로드에 대한 명시적 선호를 표시했다면 더 이상 단순한
"활성화"로 간주하지 않는다.
element에 download 속성이 있거나 사용자가 하이퍼링크를
다운로드하겠다는 선호를 표시했으면, hyperlinkSuffix를 hyperlinkSuffix로,
userInvolvement를
userInvolvement로 설정하여 element가 생성한 하이퍼링크를 다운로드한다.
그렇지 않으면 hyperlinkSuffix를 hyperlinkSuffix로, userInvolvement를 userInvolvement로 설정하여 element가 생성한 하이퍼링크를 따라간다.
interface mixin HyperlinkElementUtils {
readonly attribute USVString origin ;
[CEReactions ] attribute USVString protocol ;
[CEReactions ] attribute USVString username ;
[CEReactions ] attribute USVString password ;
[CEReactions ] attribute USVString host ;
[CEReactions ] attribute USVString hostname ;
[CEReactions ] attribute USVString port ;
[CEReactions ] attribute USVString pathname ;
[CEReactions ] attribute USVString search ;
[CEReactions ] attribute USVString hash ;
[CEReactions , Reflect ] attribute DOMString hreflang ;
[CEReactions , Reflect ] attribute DOMString type ;
};
hyperlink.origin
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크 URL의 출처를 반환한다.
hyperlink.protocol
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크 URL의 스킴을 반환한다.
URL의 스킴을 변경하도록 설정할 수 있다.
hyperlink.username
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크 URL의 사용자 이름을 반환한다.
URL의 사용자 이름을 변경하도록 설정할 수 있다.
hyperlink.password
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크 URL의 비밀번호를 반환한다.
URL의 비밀번호를 변경하도록 설정할 수 있다.
hyperlink.host
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크 URL의 호스트와 포트(스킴의 기본 포트와 다른 경우)를 반환한다.
URL의 호스트와 포트를 변경하도록 설정할 수 있다.
hyperlink.hostname
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크 URL의 호스트를 반환한다.
URL의 호스트를 변경하도록 설정할 수 있다.
hyperlink.port
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크 URL의 포트를 반환한다.
URL의 포트를 변경하도록 설정할 수 있다.
hyperlink.pathname
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크 URL의 경로를 반환한다.
URL의 경로를 변경하도록 설정할 수 있다.
hyperlink.search
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크 URL의 쿼리를 반환한다(비어 있지 않으면 앞의 "?"를 포함한다).
URL의 쿼리를 변경하도록 설정할 수 있다(앞의 "?"는 무시한다).
hyperlink.hash
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크 URL의 조각을 반환한다(비어 있지 않으면 앞의 "#"을 포함한다).
URL의 조각을 변경하도록 설정할 수 있다(앞의 "#"은 무시한다).
HyperlinkElementUtils
믹스인을 구현하는 요소는 하이퍼링크 요소이다.
하이퍼링크 요소에는 연관된 url(null 또는 URL)이 있다. 초기값은 null이다.
하이퍼링크 요소에는 연관된 url 설정 알고리즘이 있어야 한다.
하이퍼링크 요소에는 연관된 url 다시 초기화 알고리즘이 있으며, 다음 단계를 실행한다:
하이퍼링크 요소에는 연관된
href 업데이트 알고리즘이 있어야 한다.
하이퍼링크 요소 중 하이퍼링크를 생성하는 요소에서 hreflang 속성이 존재하는 경우, 링크된 리소스의 언어를
제공한다. 이는 전적으로 참고용이다. 값은 유효한 BCP 47 언어 태그여야 한다.
[BCP47] 사용자 에이전트는 이 속성을 권위 있는 것으로 간주해서는 안 된다.
리소스를 가져온 후 사용자 에이전트는 리소스의 언어를 결정할 때 리소스에 대한 링크에 포함된
메타데이터가 아니라 리소스와 연관된 언어 정보만 사용해야 한다.
하이퍼링크 요소에서 type
속성이 존재하는 경우, 링크된 리소스의 MIME 유형을 제공한다.
이는 전적으로 참고용이다. 값은 유효한 MIME 유형
문자열이어야 한다. 사용자 에이전트는
type 속성을 권위 있는 것으로 간주해서는 안 된다. 리소스를
가져온 후 사용자 에이전트는 리소스의 유형을 결정할 때 리소스에 대한 링크에 포함된 메타데이터를
사용해서는 안 된다.
origin getter 단계는 다음과 같다:
protocol getter 단계는 다음과 같다:
protocol
setter 단계는 다음과 같다:
url을 다시 초기화한다.
주어진 값 뒤에 ":"를 붙인 값을 기본 URL
구문 분석한다. 이때 this의 url을
url로,
스킴 시작 상태를 상태 재정의로 사용한다.
URL 구문 분석기는 연속된 여러 콜론을 무시하므로 "https:" 또는
"https::::" 값을 제공하는 것은 "https" 값을 제공하는 것과 같다.
href를
업데이트한다.
username
setter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이거나 url에 사용자 이름/비밀번호/포트가 있을 수 없으면 반환한다.
url과 주어진 값을 사용하여 사용자 이름을 설정한다.
href를
업데이트한다.
password getter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이면 빈 문자열을 반환한다.
url의 비밀번호를 반환한다.
password
setter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이거나 url에 사용자 이름/비밀번호/포트가 있을 수 없으면 반환한다.
url과 주어진 값을 사용하여 비밀번호를 설정한다.
href를
업데이트한다.
host getter 단계는 다음과 같다:
host
setter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이거나 url에 불투명 경로가 있으면 반환한다.
주어진 값을 기본 URL 구문 분석한다. 이때 url을 url로, 호스트 상태를 상태 재정의로 사용한다.
href를
업데이트한다.
hostname getter 단계는 다음과 같다:
hostname
setter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이거나 url에 불투명 경로가 있으면 반환한다.
주어진 값을 기본 URL 구문 분석한다. 이때 url을 url로, 호스트 이름 상태를 상태 재정의로 사용한다.
href를
업데이트한다.
port getter 단계는 다음과 같다:
port
setter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이거나 url에 사용자 이름/비밀번호/포트가 있을 수 없으면 반환한다.
주어진 값이 빈 문자열이면 url의 포트를 null로 설정한다.
그렇지 않으면 주어진 값을 기본 URL 구문 분석한다. 이때 url을 url로, 포트 상태를 상태 재정의로 사용한다.
href를
업데이트한다.
pathname getter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이면 빈 문자열을 반환한다.
url을 URL 경로 직렬화한 결과를 반환한다.
pathname
setter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이거나 url에 불투명 경로가 있으면 반환한다.
url의 경로를 빈 목록으로 설정한다.
주어진 값을 기본 URL 구문 분석한다. 이때 url을 url로, 경로 시작 상태를 상태 재정의로 사용한다.
href를
업데이트한다.
search getter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이거나 url의 쿼리가 null 또는 빈 문자열이면 빈 문자열을 반환한다.
"?" 뒤에 url의 쿼리를 붙여 반환한다.
search
setter
단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이면 이 단계를 종료한다.
주어진 값이 빈 문자열이면 url의 쿼리를 null로 설정한다.
그렇지 않으면:
input을 주어진 값에서 맨 앞의 "?" 하나가 있으면 제거한 값으로 둔다.
url의 쿼리를 빈 문자열로 설정한다.
input을 기본 URL 구문 분석한다. 이때 url을 url로, 쿼리 상태를 상태 재정의로 사용한다.
href를
업데이트한다.
hash getter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이거나 url의 조각이 null 또는 빈 문자열이면 빈 문자열을 반환한다.
"#" 뒤에 url의 조각을 붙여
반환한다.
hash
setter 단계는 다음과 같다:
url을 다시 초기화한다.
url이 null이면 반환한다.
주어진 값이 빈 문자열이면 url의 조각을 null로 설정한다.
그렇지 않으면:
input을 주어진 값에서 맨 앞의 "#" 하나가 있으면 제거한 값으로 둔다.
url의 조각을 빈 문자열로 설정한다.
input을 기본 URL 구문 분석한다. 이때 url을 url로, 조각 상태를 상태 재정의로 사용한다.
href를
업데이트한다.
a 및 area 요소용 APIinterface mixin HTMLHyperlinkElementUtils {
[CEReactions , ReflectSetter ] stringifier attribute USVString href ;
[CEReactions , Reflect ] attribute DOMString target ;
};
hyperlink.toString()hyperlink.href
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
하이퍼링크의 URL을 반환한다.
URL을 변경하도록 설정할 수 있다.
href getter 단계는 다음과 같다:
insertedNode가 주어졌을 때 a 및 area
요소의 HTML 요소
삽입 단계는 다음과 같다:
insertedNode가 연결되어 있지 않으면 반환한다.
insertedNode의 노드 문서를 사용하여 추측적 로드를 고려한다.
removedNode, isSubtreeRoot 및 oldAncestor가 주어졌을 때 a 및 area 요소의
HTML 요소 제거
단계는 다음과 같다:
oldAncestor가 연결되어 있지 않으면 반환한다.
oldAncestor의 노드 문서를 사용하여 추측적 로드를 고려한다.
movedNode가 주어졌을 때 a 및 area 요소의
HTML 요소 이동 단계는
다음과 같다:
movedNode의 노드 문서를 사용하여 추측적 로드를 고려한다.
element, localName, oldValue, value 및
namespace가 주어졌을 때 다음 속성 변경 단계는 모든 a 및 area
요소에 사용된다:
namespace가 null이 아니면 반환한다.
oldValue가 value와 같으면 반환한다.
localName이 href이면
element를 사용하여 url을 설정한다.
이는 blob:
URL에서만 관찰할 수 있다. 이를 구문 분석할 때 Blob URL Store 조회가 포함되기 때문이다.
localName이 href,
referrerpolicy 또는 rel이면
element의 노드 문서를
사용하여 추측적
로드를 고려한다.
HTMLAnchorElement
또는 HTMLAreaElement
요소의 href를
업데이트하려면, 요소의 href
콘텐츠 속성 값을 요소의 url을
직렬화한 값으로
설정한다.
HTMLAnchorElement
및 HTMLAreaElement
요소의 url 설정
알고리즘은 다음과 같다:
이는 form 요소의 양식 제출에서도 사용된다.
a 요소에 대한 예외는
웹 콘텐츠와의 호환성을 위한 것이다.
a, area 또는
form 요소
element, URL 레코드 url 및 문자열 target이 주어졌을 때
요소의 noopener를 가져오려면 다음 단계를 수행한다. 이 단계는
불리언을 반환한다.
element의 링크 유형에 noopener 또는
noreferrer
키워드가 포함되면 true를 반환한다.
element의 링크 유형에 opener 키워드가
포함되지 않고 target이 "_blank"와 ASCII
대소문자를 구분하지 않고 일치하면 true를 반환한다.
url의 blob URL 항목이 null이 아니면:
false를 반환한다.
요소 subject가 생성한 하이퍼링크를 따라가려면,
선택적 hyperlinkSuffix(기본값 null) 및
선택적 userInvolvement(기본값 "없음")이 주어졌을 때:
subject가 탐색할 수 없으면 반환한다.
targetAttributeValue를 빈 문자열로 둔다.
subject가 a 또는
area 요소이면,
targetAttributeValue를 subject를 사용하여 요소의 대상을
가져온 결과로 설정한다.
urlRecord를 subject의 href 속성 값과
subject의 노드 문서를
기준으로 URL을 인코딩 구문 분석한
결과로 둔다.
urlRecord가 실패이면 반환한다.
noopener를 subject, urlRecord 및 targetAttributeValue를 사용하여 요소의 noopener를 가져온 결과로 둔다.
targetNavigable을 targetAttributeValue, subject의 노드 내비게이션 가능 객체 및 noopener를 사용하여 내비게이션 가능 객체를 선택하는 규칙을 적용한 첫 번째 반환 값으로 둔다.
targetNavigable이 null이면 반환한다.
urlString을 urlRecord에 URL 직렬 변환기를 적용한 결과로 둔다.
hyperlinkSuffix가 null이 아니면 이를 urlString에 추가한다.
subject의 노드 문서를 사용하여 targetNavigable을 urlString으로 탐색한다. 이때 referrerPolicy를 subject의 하이퍼링크 리퍼러 정책으로, userInvolvement를 userInvolvement로, sourceElement를 subject로 설정한다.
다른 많은 유형의 탐색과 달리 하이퍼링크 따라가기는 문서가 완전히 로드되지 않았을 때
특별한 "replace" 동작을 하지 않는다. 이는 사용자가
시작한 하이퍼링크 따라가기뿐 아니라 예를 들어 aElement.click()을 통해 스크립트가
트리거한 경우에도 해당한다.
요소 subject의 하이퍼링크 리퍼러 정책은 다음 단계가 반환하는 값이다:
subject의 링크 유형에 noreferrer
키워드가 포함되면 "no-referrer"를 반환한다.
subject의 referrerpolicy 콘텐츠 속성의 현재 상태를
반환한다.
현재의 모든 엔진에서 지원된다.
일부 경우에는 리소스를 즉시 보는 대신 나중에 사용하려는 경우가 있다. 리소스를 즉시 사용하는 대신
나중에 사용하기 위해 다운로드하려는 것임을 나타내려면, 해당 리소스에 대한 하이퍼링크를 생성하는
a 또는 area 요소에
download 속성을 지정할 수 있다.
또한 이 속성에는 사용자 에이전트가 파일 시스템에 리소스를 저장할 때 사용할 파일 이름을 지정하는
값을 부여할 수 있다. 이 값은 `Content-Disposition`
HTTP 헤더의 파일 이름 매개변수가 재정의할 수 있다.
[RFC6266]
교차 출처 상황에서는 잠재적으로 악의적인 활동에 관해 사용자에게 경고하지 않도록 download 속성을 `Content-Disposition`
HTTP 헤더, 특히 attachment disposition 유형과 함께 사용해야 한다. (이는 사용자가
충분히 이해하지 못한 상태에서 민감한 개인 정보나 기밀 정보를 다운로드하도록 만드는 상황으로부터
사용자를 보호하기 위한 것이다.)
요소 subject가 생성한 하이퍼링크를 다운로드하려면, 선택적 hyperlinkSuffix(기본값 null) 및 선택적 userInvolvement(기본값 "없음")이 주어졌을 때:
subject가 탐색할 수 없으면 반환한다.
subject의 노드 문서의 활성 샌드박싱 플래그 집합에 샌드박스된 다운로드 탐색 컨텍스트 플래그가 설정되어 있으면 반환한다.
urlString을 subject의 href 속성 값과
subject의 노드 문서를
기준으로 URL을 인코딩 구문 분석하고
직렬화한 결과로 둔다.
urlString이 실패이면 반환한다.
hyperlinkSuffix가 null이 아니면 이를 urlString에 추가한다.
userInvolvement가 "브라우저 UI"가 아니면:
filename을 subject의 download 속성 값으로 둔다.
continue를 navigation에서 다운로드 요청
navigate 이벤트를 발생시킨 결과로 둔다. 이때 destinationURL을
urlString으로, userInvolvement를
userInvolvement로, sourceElement를 subject로,
filename을 filename으로 설정한다.
continue가 false이면 반환한다.
subject의 노드 내비게이션 가능 객체를 사용하여 탐색 중단을 내비게이션 API에 알린다.
다음 단계를 병렬로 실행한다:
응답 response를 내비게이션 가능 객체 navigable 및 내비게이션 ID 또는 null인 navigationId와 함께 다운로드로 처리하려면:
suggestedFilename을 response에 대해 제안된 파일 이름을 가져온 결과로 둔다.
download behavior를 navigable 및 새 WebDriver BiDi 내비게이션 상태와 함께 WebDriver BiDi 다운로드가 시작됨을 실행한
결과로 둔다. 새 상태의 id는
navigationId, 상태는
"pending",
url은
response의 URL,
suggestedFilename은
suggestedFilename이다.
download behavior가 null이 아니고 download behavior의 allowed가 false이면:
navigable 및 새 WebDriver BiDi 내비게이션 상태와 함께 WebDriver BiDi 다운로드 종료를 호출한다. 새 상태의
id는
navigationId, 상태는
"canceled",
url은
response의 URL이다.
반환한다.
download behavior가 null이 아니면 destinationFolder를 download behavior의 destinationFolder로 둔다.
다음 단계를 병렬로 실행한다:
response를 나중에 사용하도록 저장하기 위한 구현 정의 단계를 실행한다. destinationFolder가 null이 아니면 사용자 에이전트는 파일을 해당 경로에 저장해야 한다. 사용자 에이전트에 파일 이름이 필요하면 suggestedFilename을 사용해야 한다.
다음 중 하나라도 참이면:
사용자가 다운로드를 취소했다.
사용자 에이전트가 다운로드를 취소했다.
오류가 발생했다(예: 네트워크 오류, 저장 공간 부족, 사용할 수 없는 대상 폴더).
그러면:
navigable 및 새 WebDriver BiDi 내비게이션 상태와 함께
WebDriver BiDi 다운로드 종료를 호출한다. 새
상태의 id는
navigationId, 상태는 "canceled",
url은
response의 URL이다.
반환한다.
다운로드가 성공적으로 완료되면 navigable 및 새 WebDriver BiDi 내비게이션 상태와 함께
WebDriver BiDi 다운로드 종료를 호출한다. 새
상태의 id는
navigationId, 상태는
"complete",
downloadedFilepath는 사용할 수 있으면
다운로드한 파일의 절대 경로이고, 그렇지 않으면 null이며, url은
response의 URL이다.
응답 response에 대해 제안된 파일 이름을 가져오려면:
이 알고리즘은 신뢰할 수 없는 사이트에서 파일을 다운로드할 때 발생하는 보안 위험을 완화하기 위한 것이며, 사용자 에이전트는 이를 따르는 것이 강력히 권장된다.
filename을 undefined 값으로 둔다.
response에 `Content-Disposition`
헤더가 있고, 해당 헤더가 attachment disposition 유형을 지정하며, 헤더에 파일 이름
정보가 포함되어 있으면 filename을 헤더가 지정한 값으로 두고 아래의
정제라고 표시된 단계로 이동한다. [RFC6266]
interface origin을 다운로드가 발생한 다운로드 또는 탐색 작업이 시작된 Document가 있으면 그
출처로 둔다.
response origin을 response의 URL의 출처로 둔다. 단, 해당 URL의 스킴 구성 요소가
data이면 response origin을 interface origin이 있는 경우 그와
동일하게 둔다.
interface origin이 없으면 trusted operation을 true로 둔다. 그렇지 않으면 response origin이 interface origin과 동일 출처이면 trusted operation을 true로, 그렇지 않으면 false로 둔다.
trusted operation이 true이고 response에 `Content-Disposition`
헤더가 있으며 해당 헤더에 파일 이름 정보가 포함되어 있으면 filename을 헤더가 지정한
값으로 두고 아래의 정제라고 표시된 단계로 이동한다. [RFC6266]
다운로드가 a 또는 area 요소가
생성한 하이퍼링크에서 시작되지
않았거나, 다운로드를 시작한 하이퍼링크의 요소에 다운로드가 시작될 당시 download 속성이 없었거나, 해당 속성이 있었지만
다운로드가 시작될 당시 그 값이 빈 문자열이었다면 제안된 파일 이름 없음이라고 표시된 단계로
이동한다.
proposed filename을 다운로드가 시작될 당시 다운로드를 시작한 하이퍼링크 요소의 download 속성 값으로 둔다.
trusted operation이 true이면 filename을 proposed filename의 값으로 두고 아래의 정제라고 표시된 단계로 이동한다.
response에 `Content-Disposition`
헤더가 있고 해당 헤더가 attachment disposition 유형을 지정하면
filename을 proposed filename의 값으로 두고 아래의 정제라고 표시된
단계로 이동한다.
[RFC6266]
제안된 파일 이름 없음: trusted operation이 true이거나 사용자가 해당 응답을 다운로드하겠다는 선호를 표시했다면, filename을 response의 URL에서 구현 정의 방식으로 파생한 값으로 두고 아래의 정제라고 표시된 단계로 이동한다.
filename을 사용자가 선호하는 파일 이름 또는 사용자 에이전트가 선택한 파일 이름으로 설정하고 아래의 정제라고 표시된 단계로 이동한다.
알고리즘이 이 단계에 도달했다면 response와 다른 출처에서 다운로드가 시작되었고,
해당 출처가 파일을 다운로드하기에 적합하다고 표시하지 않았으며, 사용자가 다운로드를 시작하지도
않았다는 뜻이다. 이는 download 속성을 사용하여 다운로드를 트리거했거나
response의 유형을 사용자 에이전트가 지원하지 않기 때문일 수 있다.
이는 위험할 수 있다. 예를 들어 적대적인 서버가 데이터가 해당 적대적인 서버에서 온 것이라고 사용자가 믿도록 속여, 사용자가 자신도 모르게 개인 정보를 다운로드한 다음 적대적인 서버에 다시 업로드하도록 시도할 수 있기 때문이다.
따라서 response가 상당히 다른 출처에서 왔다는 사실을 어떤 방식으로든 사용자에게 알리는 것이 사용자의 이익에 부합하며, 혼동을 방지하기 위해 잠재적으로 적대적인 interface origin에서 제안한 파일 이름은 무시해야 한다.
정제: 선택적으로 사용자가 filename에 영향을 줄 수 있도록 한다. 예를 들어 사용자 에이전트는 위에서 결정한 filename 값을 기본값으로 제시하면서 사용자에게 파일 이름을 입력하라고 요청할 수 있다.
filename을 로컬 파일 시스템에 적합하도록 조정한다.
예를 들어 파일 이름에서 허용되지 않는 문자를 제거하거나 앞뒤 공백을 잘라낼 수 있다.
플랫폼 관례가 파일 시스템의 파일 유형을 결정하는 데 확장자를 어떤 방식으로도 사용하지 않는다면, filename을 파일 이름으로 반환한다.
claimed type을 알려진 경우 response의 Content-Type 메타데이터가 지정한 유형으로 둔다. named type을 알려진 경우 filename의 확장자가 지정한 유형으로 둔다. 이 단계에서 유형은 MIME 유형과 확장자의 대응 관계이다.
named type이 사용자의 선호와 일치하면(예: 사용자에게 묻는 방식으로 filename의 값을 결정했기 때문) filename을 파일 이름으로 반환한다.
claimed type과 named type이 동일한 유형이면(즉, response의 Content-Type 메타데이터가 지정한 유형이 filename의 확장자가 지정한 유형과 일치하면) filename을 파일 이름으로 반환한다.
claimed type이 알려져 있으면 filename을 변경하여 claimed type에 대응하는 확장자를 추가한다.
그렇지 않고 named type이 잠재적으로 위험한 것으로 알려져 있으면(예: 플랫폼 관례에
따라 네이티브 실행 파일, 셸 스크립트, HTML 애플리케이션 또는 실행 가능한 매크로를 포함할 수 있는
문서로 처리되는 경우), 선택적으로 filename을 변경하여 안전한 것으로 알려진 확장자(예:
".txt")를 추가한다.
이 마지막 단계는 실행 파일을 다운로드할 수 없게 만들 수 있으며, 이는 바람직하지 않을 수 있다. 언제나 그렇듯 구현자는 이 문제에서 보안과 사용성 사이의 균형을 맞춰야 한다.
filename을 파일 이름으로 반환한다.
이 알고리즘에서 파일 확장자는 플랫폼 관례상 파일 유형을 식별하는 데
사용되는 파일 이름의 모든 부분으로 구성된다. 예를 들어 많은 운영 체제는 파일 이름에서 마지막
마침표(".") 뒤의 부분을 사용하여 파일 유형을 결정하고, 이를 통해 파일을 여는 방식이나
실행하는 방식을 결정한다.
사용자 에이전트는 결과 파일을 사용자의 파일 시스템에서 저장할 위치를 결정할 때 응답 자체, 응답의
URL 및
모든 download 속성이 제공한 디렉터리 또는 경로 정보를
무시해야 한다.
a 또는 area 요소가 생성한 하이퍼링크에
ping 속성이 있고, 사용자가 하이퍼링크를 따라가며,
요소의 href 속성 값을 요소의
노드
문서를 기준으로 실패 없이 구문 분석할 수
있으면, 사용자 에이전트는 ping 속성 값을 가져와 해당 문자열을 ASCII 공백에서 분할하고, 결과로 얻은 각 토큰을
요소의 노드 문서를
기준으로 구문 분석한 다음, 구문 분석이 실패를
반환하는 경우는
무시하고 결과로 얻은 각 URL ping URL에 대해
다음 단계를 실행해야 한다:
ping URL의 스킴이 HTTP(S) 스킴이 아니면 반환한다.
선택적으로 반환한다. (예를 들어 사용자 에이전트는 사용자가 표시한 선호에 따라 일부 또는 모든 ping URL을 무시할 수 있다.)
request를 새 요청으로 둔다. 이 요청의
URL은 ping URL, 메서드는 `POST`, 헤더
목록은 « (`Content-Type`,
`text/ping`) », 본문은 `PING`, 클라이언트는
settingsObject, 대상은 빈
문자열, 자격 증명 모드는 "include", 리퍼러는
"no-referrer"이며, URL 자격 증명 사용 플래그가 설정되고,
개시자
유형은 "ping"이다.
target URL을 요소의 href 속성 값을
요소의 노드 문서를
기준으로 URL을 인코딩 구문 분석하고
직렬화한 결과로 두고, 다음을 수행한다:
Document 객체의 URL과
ping URL이 동일 출처인 경우
Document의 URL의
스킴이
"https"가 아닌 경우
Ping-From` 헤더와,
target URL을 값으로 하는
`Ping-To` HTTP 헤더가 포함되어야
한다.
Ping-To` HTTP 헤더가 포함되어야
한다. request에는
`Ping-From` 헤더가 포함되지
않는다.
request를 가져온다.
이는 기본 가져오기와 병렬로 수행할 수 있으며, 해당 가져오기의 결과와는 독립적이다.
사용자 에이전트는 예를 들어 HTTP `Referer`
(원문 그대로)
헤더 전송을 비활성화하는 설정과 연계하여 사용자가 이 동작을 조정할 수 있게 해야 한다. 사용자의 선호에
따라 UA는 ping 속성을 완전히 무시하거나 목록에 있는 URL을 선택적으로 무시할 수
있다(예: 모든 서드 파티 URL 무시). 이는 위 단계에서 명시적으로 고려된다.
사용자 에이전트는 응답으로 반환된 모든 엔터티 본문을 무시해야 한다. 사용자 에이전트는 응답 본문을 받기 시작한 뒤 연결을 조기에 닫을 수 있다.
하이퍼링크를 생성하고
ping 속성이 있는 a 또는 area 요소가 존재하는 경우,
사용자 에이전트는 하이퍼링크를 따라가면 백그라운드에서 보조 요청도 전송되며 실제 대상 URL 목록이
포함될 수도 있음을 사용자에게 나타낼 수 있다.
예를 들어 시각적 사용자 에이전트는 상태 표시줄이나 도구 설명에서 하이퍼링크의 실제 URL과 함께 대상 ping URL의 호스트 이름을 표시할 수 있다.
ping 속성은 웹 페이지가 어떤 외부 사이트
링크가 가장 인기 있는지 추적하거나 광고주가 클릭률을 추적할 수 있게 한다는 점에서 HTTP 리디렉션이나
JavaScript 같은 기존 기술과 중복된다.
그러나 ping 속성은 이러한 대안에 비해
사용자에게 다음과 같은 이점을 제공한다:
Ping-From` 및 `Ping-To` 헤더`Ping-From` 및 `Ping-To` HTTP 요청 헤더는 하이퍼링크
감사 요청에 포함된다. 그 값은 URL을 직렬화한 값이다.
현재의 모든 엔진에서 지원된다.
다음 표는 이 명세에서 정의하는 링크 유형을 해당 키워드별로 요약한다. 이 표는 비규범적이며, 링크 유형의 실제 정의는 이어지는 여러 절에 제시되어 있다.
이 절에서 참조된 문서라는 용어는 링크를 나타내는 요소가 식별하는 리소스를 가리키며, 현재 문서라는 용어는 링크를 나타내는 요소가 위치한 리소스를 가리킨다.
link, a, area 또는
form 요소에 적용되는 링크 유형을
결정하려면 요소의 rel 속성을 ASCII 공백에서 분할해야
한다. 결과로 얻은 토큰은 해당 요소에 적용되는 링크 유형의 키워드이다.
별도로 명시되지 않는 한 키워드는 각 rel 속성에 두 번
이상 지정해서는
안 된다.
아래 표 뒤에 이어지는 일부 절에서는 특정 키워드의 동의어를 나열한다. 표시된 동의어는 사용자 에이전트가
명시된 대로 처리해야 하지만 문서에서는 사용해서는 안 된다(예: "copyright" 키워드).
키워드는 항상 ASCII 대소문자를 구분하지 않으며, 그에 따라 비교해야 한다.
따라서 rel="next"는 rel="NEXT"와 같다.
body-ok인 키워드는 link 요소가
본문에서 허용되는지에 영향을 준다.
body-ok 키워드는
dns-prefetch,
modulepreload,
pingback,
preconnect,
prefetch,
preload 및
stylesheet이다.
웹 브라우저가 구현할 새로운 링크 유형은 이 표준에 추가해야 한다. 나머지는 확장으로 등록할 수 있다.
| 링크 유형 | ...에 대한 효과 | body-ok | `Link`
처리 여부 |
간략한 설명 | ||
|---|---|---|---|---|---|---|
link |
a 및 area |
form |
||||
alternate |
하이퍼링크 | 허용되지 않음 | · | · | 현재 문서의 대체 표현을 제공한다. | |
canonical |
하이퍼링크 | 허용되지 않음 | · | · | 현재 문서의 선호 URL을 제공한다. | |
author |
하이퍼링크 | 허용되지 않음 | · | · | 현재 문서 또는 글의 작성자에 대한 링크를 제공한다. | |
bookmark |
허용되지 않음 | 하이퍼링크 | 허용되지 않음 | · | · | 가장 가까운 조상 섹션의 영구 링크를 제공한다. |
dns-prefetch |
외부 리소스 | 허용되지 않음 | 예 | · | 사용자 에이전트가 대상 리소스의 출처에 대해 선제적으로 DNS 확인을 수행해야 함을 지정한다. | |
expect |
내부 리소스 | 허용되지 않음 | · | · | 대상 ID를 가진 요소가 현재 문서에 나타날 것으로 예상한다. | |
external |
허용되지 않음 | 주석 | · | · | 참조된 문서가 현재 문서와 동일한 사이트의 일부가 아님을 나타낸다. | |
help |
하이퍼링크 | · | · | 맥락에 맞는 도움말 링크를 제공한다. | ||
icon |
외부 리소스 | 허용되지 않음 | · | · | 현재 문서를 나타낼 아이콘을 가져온다. | |
manifest |
외부 리소스 | 허용되지 않음 | · | · | 애플리케이션 매니페스트를 가져오거나 연결한다. [MANIFEST] | |
modulepreload
|
외부 리소스 | 허용되지 않음 | 예 | · | 사용자 에이전트가 선제적으로 모듈 스크립트를 가져와 나중에 평가할 수 있도록 문서의 모듈 맵에 저장해야 함을 지정한다. 선택적으로 모듈의 종속성도 가져올 수 있다. | |
license |
하이퍼링크 | · | · | 현재 문서의 주요 콘텐츠가 참조된 문서에 설명된 저작권 라이선스의 적용을 받음을 나타낸다. | ||
next |
하이퍼링크 | · | · | 현재 문서가 시리즈의 일부이며 시리즈의 다음 문서가 참조된 문서임을 나타낸다. | ||
nofollow |
허용되지 않음 | 주석 | · | · | 현재 문서의 원래 작성자 또는 게시자가 참조된 문서를 지지하지 않음을 나타낸다. | |
noopener |
허용되지 않음 | 주석 | · | · | 하이퍼링크가 그렇지 않으면 보조인 것을 생성하는 경우, 비-보조 브라우징
컨텍스트를 가진 최상위 순회 가능 객체를 생성한다(즉,
적절한 target 속성 값을
가진 경우). |
|
noreferrer |
허용되지 않음 | 주석 | · | · | `Referer`
(원문 그대로) 헤더를 포함하지 않는다.
또한 noopener와 같은 효과를
가진다. |
|
opener |
허용되지 않음 | 주석 | · | · | 하이퍼링크가 그렇지 않으면 비-보조 브라우징
컨텍스트를 가진 최상위 순회 가능 객체를 생성하는
경우,
보조
브라우징 컨텍스트를 생성한다(즉, target
속성 값으로 "_blank"를 가진 경우).
|
|
pingback |
외부 리소스 | 허용되지 않음 | 예 | · | 현재 문서에 대한 핑백을 처리하는 핑백 서버의 주소를 제공한다. | |
preconnect |
외부 리소스 | 허용되지 않음 | 예 | 예 | 사용자 에이전트가 대상 리소스의 출처에 선제적으로 연결해야 함을 지정한다. | |
prefetch |
외부 리소스 | 허용되지 않음 | 예 | · | 후속 내비게이션에 필요할 가능성이 높으므로 사용자 에이전트가 대상 리소스를 선제적으로 가져와 캐시해야 함을 지정한다. | |
preload |
외부 리소스 | 허용되지 않음 | 예 | 예 | 사용자 에이전트가 as 속성이 제공한 미리 로드 대상(및 대응하는 대상과 연관된 우선순위)에 따라 현재 내비게이션을 위해 대상 리소스를 선제적으로 가져와 캐시해야 함을 지정한다. |
|
prev |
하이퍼링크 | · | · | 현재 문서가 시리즈의 일부이며 시리즈의 이전 문서가 참조된 문서임을 나타낸다. | ||
privacy-policy
|
하이퍼링크 | 허용되지 않음 | · | · | 현재 문서에 적용되는 데이터 수집 및 사용 관행에 대한 정보의 링크를 제공한다. | |
search |
하이퍼링크 | · | · | 현재 문서와 관련 페이지를 검색하는 데 사용할 수 있는 리소스의 링크를 제공한다. | ||
stylesheet |
외부 리소스 | 허용되지 않음 | 예 | · | 스타일시트를 가져온다. | |
tag |
허용되지 않음 | 하이퍼링크 | 허용되지 않음 | · | · | 현재 문서에 적용되는 태그(주어진 주소로 식별됨)를 제공한다. |
terms-of-service
|
하이퍼링크 | 허용되지 않음 | · | · | 현재 문서의 제공자와 현재 문서를 사용하려는 사용자 사이의 계약에 관한 정보의 링크를 제공한다. | |
alternate"하나의 엔진에서만 지원된다.
alternate 키워드는
link,
a 및 area 요소와 함께 사용할 수 있다.
이 키워드의 의미는 다른 속성의 값에 따라 달라진다.
link
요소이고 rel
속성에도 stylesheet 키워드가
포함된 경우alternate 키워드는 해당
키워드에 관해 설명된 방식으로 stylesheet 키워드의
의미를 수정한다.
alternate 키워드는 자체적으로
링크를 생성하지 않는다.
여기서는 일련의 link
요소가 몇 가지 스타일시트를 제공한다:
<!-- a persistent style sheet -->
< link rel = "stylesheet" href = "default.css" >
<!-- the preferred alternate style sheet -->
< link rel = "stylesheet" href = "green.css" title = "Green styles" >
<!-- some alternate style sheets -->
< link rel = "alternate stylesheet" href = "contrast.css" title = "High contrast" >
< link rel = "alternate stylesheet" href = "big.css" title = "Big fonts" >
< link rel = "alternate stylesheet" href = "wide.css" title = "Wide screen" >
alternate 키워드를
type 속성이
application/rss+xml 또는 application/atom+xml 값으로 설정된 상태에서 사용하는
경우
이 키워드는 신디케이션 피드를 참조하는 하이퍼링크를 생성한다(현재 페이지와 정확히 같은 콘텐츠를 신디케이션하는 것은 아닐 수 있다).
피드 자동 탐색을 위해 사용자 에이전트는 문서에서 alternate 키워드가 사용되고
type
속성이 application/rss+xml 또는 application/atom+xml 값으로 설정된 모든
link
요소를 고려해야 한다. 사용자 에이전트에 기본 신디케이션 피드라는 개념이 있으면 그러한 첫 번째
요소(트리 순서상)를
기본값으로 사용해야 한다.
다음 link
요소는 블로그의 신디케이션 피드를 제공한다:
< link rel = "alternate" type = "application/atom+xml" href = "posts.xml" title = "Cool Stuff Blog" >
< link rel = "alternate" type = "application/atom+xml" href = "posts.xml?category=robots" title = "Cool Stuff Blog: robots category" >
< link rel = "alternate" type = "application/atom+xml" href = "comments.xml" title = "Cool Stuff Blog: Comments" >
이러한 link 요소는
피드 자동 탐색을 수행하는 사용자 에이전트가 사용하며, 첫 번째 요소가 기본값이 된다(해당되는
경우).
다음 예제는 a 요소를
사용하여 사용자에게 여러 신디케이션 피드를 제공한다:
< p > You can access the planets database using Atom feeds:</ p >
< ul >
< li >< a href = "recently-visited-planets.xml" rel = "alternate" type = "application/atom+xml" > Recently Visited Planets</ a ></ li >
< li >< a href = "known-bad-planets.xml" rel = "alternate" type = "application/atom+xml" > Known Bad Planets</ a ></ li >
< li >< a href = "unexplored-planets.xml" rel = "alternate" type = "application/atom+xml" > Unexplored Planets</ a ></ li >
</ ul >
이 링크들은 피드 자동 탐색에 사용되지 않는다.
이 키워드는 현재 문서의 대체 표현을 참조하는 하이퍼링크를 생성한다.
참조된 문서의 성격은 hreflang 및
type 속성으로
제공된다.
alternate 키워드를
hreflang
속성과 함께 사용하고 해당 속성 값이 문서 요소의 언어와 다르면 참조된
문서가 번역본임을 나타낸다.
alternate 키워드를
type
속성과 함께 사용하면 참조된 문서가 지정된 형식으로 현재 문서를 재구성한 것임을 나타낸다.
hreflang
및 type 속성은
alternate 키워드와 함께 지정할
때 결합할 수 있다.
다음 예제는 대체 형식을 사용하고, 다른 언어를 대상으로 하며, 다른 미디어를 위한 페이지 버전을 지정하는 방법을 보여준다:
< link rel = alternate href = "/en/html" hreflang = en type = text/html title = "English HTML" >
< link rel = alternate href = "/fr/html" hreflang = fr type = text/html title = "French HTML" >
< link rel = alternate href = "/en/html/print" hreflang = en type = text/html media = print title = "English HTML (for printing)" >
< link rel = alternate href = "/fr/html/print" hreflang = fr type = text/html media = print title = "French HTML (for printing)" >
< link rel = alternate href = "/en/pdf" hreflang = en type = application/pdf title = "English PDF" >
< link rel = alternate href = "/fr/pdf" hreflang = fr type = application/pdf title = "French PDF" >
이 관계는 추이적이다. 즉, 문서가 링크 유형 "alternate"로 다른 두 문서에
링크하면 해당 문서들이 첫 번째 문서의 대체 표현임을 암시할 뿐 아니라, 두 문서도 서로의 대체
표현임을 암시한다.
author"author 키워드는
link,
a 및 area 요소와 함께 사용할 수
있다. 이 키워드는 하이퍼링크를 생성한다.
a 및 area 요소의 경우,
author 키워드는 하이퍼링크를
정의하는 요소에서 가장 가까운 article
요소 조상이
있으면 그 작성자에 관한 추가 정보를, 그렇지 않으면 페이지 전체의 작성자에 관한 추가 정보를 참조된
문서가 제공함을 나타낸다.
link 요소의 경우,
author 키워드는 참조된
문서가 페이지 전체의 작성자에 관한 추가 정보를 제공함을 나타낸다.
"참조된 문서"는 작성자의 이메일 주소를 제공하는 mailto:
URL일 수 있으며 흔히 그러하다. [MAILTO]
동의어: 역사적인 이유로 사용자 에이전트는 값이 "made"인
rev 속성을 가진 link,
a 및 area 요소도 링크 관계로
author 키워드가 지정된
것으로 처리해야 한다.
bookmark"bookmark 키워드는
a 및
area 요소와 함께
사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.
bookmark 키워드는
해당 링크 요소에서 가장 가까운 조상 article 요소의 영구
링크를 제공하거나, 조상 article
요소가
없으면 링크 요소와 가장 밀접하게 연관된 섹션의 영구 링크를 제공한다.
다음 코드 조각에는 세 개의 영구 링크가 있다. 사용자 에이전트는 영구 링크가 제공된 위치를 살펴보아 각 영구 링크가 명세의 어느 부분에 적용되는지 결정할 수 있다.
...
< body >
< h1 > Example of permalinks</ h1 >
< div id = "a" >
< h2 > First example</ h2 >
< p >< a href = "a.html" rel = "bookmark" > This permalink applies to
only the content from the first H2 to the second H2</ a > . The DIV isn't
exactly that section, but it roughly corresponds to it.</ p >
</ div >
< h2 > Second example</ h2 >
< article id = "b" >
< p >< a href = "b.html" rel = "bookmark" > This permalink applies to
the outer ARTICLE element</ a > (which could be, e.g., a blog post).</ p >
< article id = "c" >
< p >< a href = "c.html" rel = "bookmark" > This permalink applies to
the inner ARTICLE element</ a > (which could be, e.g., a blog comment).</ p >
</ article >
</ article >
</ body >
...
canonical"canonical 키워드는
link
요소와 함께 사용할 수 있다. 이 키워드는 하이퍼링크를 생성한다.
canonical
키워드는 href 속성이 제공한 URL이 현재
문서의 선호 URL임을 나타낸다. 이는 The Canonical
Link Relation에 더 자세히 설명된 대로 검색 엔진이 중복 콘텐츠를 줄이는 데 도움이 된다.
[RFC6596]
dns-prefetch"dns-prefetch
키워드는
link 요소와 함께
사용할 수 있다. 이 키워드는 외부
리소스 링크를 생성한다. 이 키워드는 body-ok이다.
dns-prefetch
키워드는 사용자가 해당 출처에 위치한 리소스를 필요로 할 가능성이 매우
높고,
DNS 확인과 관련된 지연 비용을 선제적으로 처리하면 사용자 경험이 개선되므로, 지정된 리소스의 출처에 대해 선제적으로 DNS 확인을
수행하는 것이 유익할 가능성이 높음을 나타낸다.
dns-prefetch
키워드가 제공하는 리소스에는 기본 유형이 없다.
이 유형의 링크를 가져와 처리하기에 적절한 시점은 다음과 같다:
이미 브라우징 컨텍스트에
연결된 link 요소에
외부 리소스 링크가 생성될 때.
외부 리소스 링크의 link 요소가
브라우징 컨텍스트에
연결될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스
링크의 link
요소의 href 속성이
변경될 때.
link 요소
el이 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된 리소스를 가져와 처리하는
단계는 다음과 같다:
url을 el의 href 속성 값을
el의 노드 문서를
기준으로 URL을 인코딩 구문 분석한
결과로 둔다.
url이 실패이면 반환한다.
partitionKey를 el의 노드 문서의 관련 설정 객체를 사용하여 네트워크 파티션 키를 결정한 결과로 둔다.
사용자 에이전트는 partitionKey와 url의 출처를 사용하여 출처를 확인해야 한다.
이 알고리즘의 결과를 캐시할 수 있으므로 이후의 가져오기가 더 빨라질 수 있다.
expect"expect 키워드는
link
요소와 함께 사용할 수 있다. 이 키워드는 내부 리소스
링크를 생성한다.
expect
키워드가 생성한 내부 리소스 링크는 링크가 가리키는 요소가
문서에 연결되고 완전히 구문
분석될 때까지 렌더링을 차단하는 데
사용할 수 있다.
expect 키워드가 제공하는
리소스에는 기본 유형이 없다.
link 요소
el에 대해 다음 조건 중 하나가 발생할 때마다:
이미 브라우징 컨텍스트에 연결된
el에
expect 내부 리소스 링크가
생성된 경우;
el에 expect
내부 리소스 링크가
생성되어 있고 el이
브라우징 컨텍스트에
연결된 경우;
el에 expect
내부 리소스 링크가
생성되어 있고, el이 이미 브라우징 컨텍스트에 연결되어 있으며,
el의 href
속성이 설정, 변경 또는 제거된 경우;
또는
el에 expect
내부 리소스 링크가
생성되어 있고, el이 이미 브라우징 컨텍스트에 연결되어 있으며,
el의 media
속성이 설정, 변경 또는 제거된 경우,
그러면 el을 처리한다.
link 요소
el이 주어졌을 때 내부 리소스 링크를 처리하려면
다음 단계를 실행한다:
doc을 el의 노드 문서로 둔다.
url을 el의 href 속성 값을
doc을 기준으로 URL을 인코딩
구문 분석한 결과로 둔다.
이 작업이 실패하거나, 조각 제외를 true로 설정했을 때 url이 doc의 URL과 같지 않으면, el의 렌더링 차단을 해제하고 반환한다.
indicatedElement를 doc과 url을 사용하여 가리킨 부분을 선택한 결과로 둔다.
다음이 모두 참이면:
doc의 현재
문서 준비 상태가
"loading"이다;
el이 내부 리소스 링크를 생성한다;
el이 브라우징 컨텍스트에 연결되어 있다;
el이 잠재적으로 렌더링을 차단한다;
indicatedElement가 요소가 아니거나, 연관된 Document가 doc인
HTML 파서의
열린 요소 스택에
있다,
그러면 el의 렌더링을 차단한다.
그렇지 않으면 el의 렌더링 차단을 해제한다.
Document doc이 주어졌을 때
내부 리소스 링크를 처리하려면:
doc의 렌더링
차단 요소 집합에 있는 expect link 요소
link 각각에 대해 link를 처리한다.
element, localName, oldValue,
value 및 namespace가 주어졌을 때, 다음 속성 변경
단계는 expect link 요소가 동적인
id 및 name 변경에 응답하도록 보장하는 데
사용된다:
external"external 키워드는
a,
area 및 form 요소와 함께 사용할 수
있다. 이 키워드는 하이퍼링크를 생성하지 않지만, 요소가 생성한 다른 모든 하이퍼링크
(다른 키워드가 하이퍼링크를 생성하지 않는 경우 암시된 하이퍼링크)에 주석을 단다.
external 키워드는
링크가 현재 문서가 속한 사이트의 일부가 아닌 문서로 이어짐을 나타낸다.
help"help 키워드는
link,
a, area 및 form 요소와 함께 사용할 수 있다.
이 키워드는 하이퍼링크를 생성한다.
a, area 및 form 요소의 경우,
help 키워드는 참조된 문서가
하이퍼링크를 정의하는 요소의 부모와 그 자식에 대한 추가 도움말 정보를 제공함을 나타낸다.
다음 예제에서 양식 컨트롤에는 맥락에 맞는 도움말이 연결되어 있다. 사용자 에이전트는 예를 들어 사용자가 "Help" 또는 "F1" 키를 누르면 참조된 문서를 표시하는 데 이 정보를 사용할 수 있다.
< p >< label > Topic: < input name = topic > < a href = "help/topic.html" rel = "help" > (Help)</ a ></ label ></ p >
link 요소의 경우,
help 키워드는 참조된 문서가
페이지 전체에 대한 도움말을 제공함을 나타낸다.
a 및 area 요소의 경우 일부
브라우저에서 help 키워드로 인해 링크가
다른 커서를 사용한다.
icon"현재의 모든 엔진에서 지원된다.
icon 키워드는 link 요소와 함께 사용할 수 있다.
이 키워드는 외부 리소스
링크를 생성한다.
지정된 리소스는 페이지 또는 사이트를 나타내는 아이콘이며, 사용자 에이전트는 사용자 인터페이스에서 페이지를 나타낼 때 이를 사용해야 한다.
아이콘은 청각적 아이콘, 시각적 아이콘 또는 다른 종류의 아이콘일 수 있다. 여러 아이콘이 제공되면
사용자 에이전트는 type,
media 및 sizes 속성에 따라 가장 적절한 아이콘을
선택해야 한다. 똑같이 적절한 아이콘이 여러 개 있으면 사용자 에이전트는 아이콘 목록을 수집한 시점의
트리
순서에서 마지막으로
선언된 아이콘을 사용해야 한다. 사용자 에이전트가 아이콘을 사용하려 했지만 자세히 검사한 결과 해당
아이콘이 실제로 부적절하다고 판정되면(예: 지원되지 않는 형식을 사용하기 때문), 사용자 에이전트는
속성에 따라 결정된 다음으로 적절한 아이콘을 시도해야 한다.
아이콘 목록이 변경될 때 사용자 에이전트가 아이콘을 업데이트할 의무는 없지만 그렇게 하는 것이 권장된다.
icon 키워드가 제공하는 리소스에는 기본
유형이 없다. 그러나 리소스 유형을 결정하기 위해 사용자
에이전트는 리소스가 이미지일 것으로 예상해야 한다.
sizes 키워드는 원시 픽셀
단위의 아이콘 크기를 나타낸다(CSS
픽셀과 반대).
기기 픽셀 밀도가 CSS 픽셀당 기기 픽셀 2개인 디스플레이(2x, 192dpi)를 위해 너비가 50 CSS 픽셀인 아이콘은 너비가 원시 픽셀 100개이다. 이 기능은 작은 고해상도 아이콘과 큰 저해상도 아이콘에 서로 다른 리소스를 사용하도록 나타내는 것을 지원하지 않는다(예: 50×50 2x와 100×100 1x).
속성 값을 구문 분석하고 처리하려면 사용자 에이전트는 먼저 속성 값을 ASCII 공백에서 분할한 다음, 결과로 얻은 각 키워드를 구문 분석하여 무엇을 나타내는지 결정해야 한다.
any 키워드는 리소스에 SVG 이미지가 제공하는 것과 같은
확장 가능한 아이콘이 포함되어 있음을 나타낸다.
다른 키워드가 나타내는 것을 결정하려면 다음과 같이 추가로 구문 분석해야 한다:
키워드에 U+0078 LATIN SMALL LETTER X 또는 U+0058 LATIN CAPITAL LETTER X 문자가 정확히 하나 포함되어 있지 않으면 이 키워드는 아무것도 나타내지 않는다. 해당 키워드에 대해 반환한다.
width string을 "x" 또는 "X" 앞의 문자열로 둔다.
height string을 "x" 또는 "X" 뒤의 문자열로 둔다.
width string 또는 height string 중 하나라도 U+0030 DIGIT ZERO (0) 문자로 시작하거나 ASCII 숫자 이외의 문자를 포함하면 이 키워드는 아무것도 나타내지 않는다. 해당 키워드에 대해 반환한다.
width string에 음이 아닌 정수를 구문 분석하는 규칙을 적용하여 width를 얻는다.
height string에 음이 아닌 정수를 구문 분석하는 규칙을 적용하여 height를 얻는다.
이 키워드는 리소스에 너비가 width 기기 픽셀이고 높이가 height 기기 픽셀인 비트맵 아이콘이 포함되어 있음을 나타낸다.
sizes 속성에 지정된 키워드는
링크된 리소스에서 실제로 사용할 수 없는 아이콘 크기를 나타내서는 안 된다.
link 요소 el과
요청 request가 주어졌을 때, 이 유형의 링크된 리소스에
대한 링크된 리소스 가져오기 설정
단계는 다음과 같다:
request의 대상을
"image"로 설정한다.
true를 반환한다.
이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계에서는 아무것도 하지 않는다.
다음 코드 조각은 여러 아이콘이 있는 애플리케이션의 상단 부분을 보여준다.
<!DOCTYPE HTML>
< html lang = "en" >
< head >
< title > lsForums — Inbox</ title >
< link rel = icon href = favicon.png sizes = "16x16" type = "image/png" >
< link rel = icon href = windows.ico sizes = "32x32 48x48" type = "image/vnd.microsoft.icon" >
< link rel = icon href = mac.icns sizes = "128x128 512x512 8192x8192 32768x32768" >
< link rel = icon href = iphone.png sizes = "57x57" type = "image/png" >
< link rel = icon href = gnome.svg sizes = "any" type = "image/svg+xml" >
< link rel = stylesheet href = lsforums.css >
< script src = lsforums.js ></ script >
< meta name = application-name content = "lsForums" >
</ head >
< body >
...
역사적인 이유로 icon 키워드 앞에는
"shortcut" 키워드를 둘 수 있다. "shortcut" 키워드가 존재하면
rel 속성의 전체 값은
문자열 "shortcut icon"과 ASCII 대소문자를
구분하지 않고 일치해야 한다(토큰 사이에는
U+0020 SPACE 문자 하나만 있고 다른 ASCII 공백은 없어야 한다).
license"license 키워드는
link,
a, area 및 form 요소와 함께 사용할 수
있다. 이 키워드는
하이퍼링크를 생성한다.
license 키워드는
참조된 문서가 현재 문서의 주요 콘텐츠를 제공할 때 적용되는 저작권 라이선스 조건을 제공함을 나타낸다.
이 명세는 문서의 주요 콘텐츠와 해당 주요 콘텐츠의 일부로 간주되지 않는 콘텐츠를 구별하는 방법을 지정하지 않는다. 이 구별은 사용자에게 명확히 제시해야 한다.
사진 공유 사이트를 생각해 보자. 해당 사이트의 페이지는 사진을 설명하고 표시할 수 있으며, 페이지는 다음과 같이 마크업할 수 있다:
<!DOCTYPE HTML>
< html lang = "en" >
< head >
< title > Exampl Pictures: Kissat</ title >
< link rel = "stylesheet" href = "/style/default" >
</ head >
< body >
< h1 > Kissat</ h1 >
< nav >
< a href = "../" > Return to photo index</ a >
</ nav >
< figure >
< img src = "/pix/39627052_fd8dcd98b5.jpg" >
< figcaption > Kissat</ figcaption >
</ figure >
< p > One of them has six toes!</ p >
< p >< small >< a rel = "license" href = "http://www.opensource.org/licenses/mit-license.php" > MIT Licensed</ a ></ small ></ p >
< footer >
< a href = "/" > Home</ a > | < a href = "../" > Photo index</ a >
< p >< small > © copyright 2009 Exampl Pictures. All Rights Reserved.</ small ></ p >
</ footer >
</ body >
</ html >
이 경우 license는 문서 전체가
아니라 사진(문서의 주요 콘텐츠)에만 적용된다. 특히 문서 하단에 표시된 저작권의 적용을 받는 페이지
자체의 디자인에는 적용되지 않는다. 스타일에서 이를 더 명확히 할 수 있다(예: 라이선스 링크를 사진
가까이에 눈에 띄게 배치하면서 페이지 저작권은 페이지 하단에 옅은 작은 텍스트로 표시).
동의어: 역사적인 이유로 사용자 에이전트는 "copyright" 키워드도
license 키워드처럼
처리해야 한다.
manifest"하나의 엔진에서만 지원된다.
manifest 키워드는
link 요소와 함께 사용할
수 있다. 이 키워드는 외부
리소스 링크를 생성한다.
manifest 키워드는
현재 문서와 연관된 메타데이터를 제공하는 매니페스트 파일을 나타낸다.
manifest 키워드가 제공하는
리소스에는 기본 유형이 없다.
웹 애플리케이션이 설치되어 있지 않은 경우, 이 링크 유형의 링크된 리소스를 가져와 처리하기에 적절한 시점은 사용자 에이전트가 필요하다고 판단할 때이다. 예를 들어 사용자가 웹 애플리케이션을 설치하기로 선택할 때이다.
설치된 웹 애플리케이션의 경우, 이 링크 유형의 링크된 리소스를 가져와 처리하기에 적절한 시점은 다음과 같다:
이미 브라우징 컨텍스트에
연결된 link 요소에
외부 리소스 링크가 생성될 때.
외부 리소스 링크의 link 요소가
브라우징
컨텍스트에
연결될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스 링크의
link
요소의 href 속성이
변경될 때.
어떤 경우든 rel 속성에 manifest 토큰을
포함하는 link 요소 중 트리 순서에서 첫 번째 요소만 사용할 수 있다.
사용자 에이전트는 이 링크 유형 때문에 load 이벤트를 지연해서는 안 된다.
link 요소
el과 요청
request가 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된
리소스 가져오기 설정 단계는 다음과 같다:
navigable을 el의 노드 문서의 노드 내비게이션 가능 객체로 둔다.
navigable이 null이면 false를 반환한다.
navigable이 최상위 순회 가능 객체가 아니면 false를 반환한다.
request의 개시자를
"manifest"로 설정한다.
request의 대상을
"manifest"로 설정한다.
request의 모드를
"cors"로 설정한다.
request의 자격 증명
모드를 el의 crossorigin
콘텐츠 속성에 대한 CORS 설정 속성 자격 증명 모드로
설정한다.
true를 반환한다.
link 요소
el, 불리언 success, 응답 response 및
바이트 시퀀스
bodyBytes가 주어졌을 때 이 유형의 링크된 리소스를 처리하려면:
response의 Content-Type 메타데이터가 JSON MIME 유형이 아니면 success를 false로 설정한다.
success가 true이면:
이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계에서는 아무것도 하지 않는다.
modulepreload"modulepreload
키워드는
link 요소와 함께
사용할 수 있다. 이 키워드는 외부
리소스 링크를 생성한다. 이 키워드는 body-ok이다.
modulepreload
키워드는 모듈 스크립트를 미리 로드하는
데 맞춰진 처리 모델을 갖는 preload
키워드의 특수한
대안이다. 특히 모듈 스크립트에 특화된 가져오기 동작(예: crossorigin
속성을 다르게 해석하는 것 포함)을 사용하고, 결과를 나중에 평가할 수 있도록 적절한 모듈
맵에 배치한다. 반면 preload 키워드를
사용하는 유사한 외부
리소스 링크는 문서의 모듈 맵에 영향을 주지 않고 결과를 미리 로드
캐시에 배치한다.
또한 구현은 모듈 스크립트가 종속성을 선언한다는 사실을 활용하여
지정된 모듈의 종속성도 가져올 수 있다. 사용자 에이전트는 해당 종속성도 나중에 필요할 가능성이 매우 높음을
알고 있으므로 이는 최적화 기회를 제공하기 위한 것이다. 이는 일반적으로 서비스 워커 같은 기술을
사용하거나 서버 측에서 모니터링하지 않으면 관찰할 수 없다. 특히 적절한 load 또는
error 이벤트는 지정된
모듈을 가져온 후 발생하며 종속성을 기다리지 않는다.
사용자 에이전트는 이 링크 유형 때문에 load 이벤트를 지연해서는 안 된다.
모듈 미리 로드 대상은 "json",
"style", "text" 또는 스크립트 유사 대상이다.
이러한 링크의 링크된 리소스를 가져와 처리하기에 적절한 시점은 다음과 같다:
이미 브라우징 컨텍스트에
연결된 link
요소에
외부 리소스 링크가 생성될 때.
외부 리소스 링크의 link 요소가
브라우징 컨텍스트에
연결될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스
링크의 link
요소의 href
속성이 변경될 때.
일부 다른 링크 관계와 달리 이러한 link의 관련 속성(예:
as, crossorigin 및
referrerpolicy)을
변경해도 새 가져오기가 트리거되지 않는다. 이는 이전 가져오기로 문서의 모듈 맵이 이미 채워졌으므로 다시 가져오는
것이 무의미하기 때문이다.
link 요소
el이 주어졌을 때 modulepreload
링크에 대한 링크된 리소스를 가져와 처리하는
알고리즘은 다음과 같다:
el의 href
속성 값이
빈 문자열이면 반환한다.
destination을 el의 as 속성의 현재 상태
(대상)로 두거나, 어떤 상태에도 속하지 않으면
"script"로 둔다.
destination이 모듈 미리 로드 대상이 아니면,
el에 이름이 error인
이벤트를 발생시키도록 el을 사용하여 네트워킹 작업
소스에 요소 작업을 큐에
추가하고 반환한다.
url을 el의 href 속성 값을
el의 노드 문서를
기준으로 URL을 인코딩 구문 분석한
결과로 둔다.
url이 실패이면 반환한다.
credentials mode를 el의 crossorigin
속성에 대한 CORS 설정 속성 자격 증명
모드로 둔다.
cryptographic nonce를 el.[[CryptographicNonce]]로 둔다.
integrity metadata를 el의 integrity
속성이 지정되어 있으면 그 값으로, 그렇지 않으면 빈 문자열로 둔다.
el에 integrity
속성이 없으면 integrity metadata를 url과 settings object를 사용하여
모듈 무결성 메타데이터를
결정한 결과로 설정한다.
referrer policy를 el의 referrerpolicy
속성의 현재 상태로 둔다.
fetch priority를 el의 fetchpriority
속성의 현재 상태로 둔다.
options를 스크립트
가져오기 옵션으로 둔다. 그 암호화 nonce는
cryptographic nonce, 무결성 메타데이터는
integrity metadata, 파서
메타데이터는 "not-parser-inserted", 자격 증명 모드는
credentials mode, 리퍼러
정책은 referrer policy, 가져오기 우선순위는
fetch priority이다.
url, destination, settings object 및 options를 사용하여 modulepreload 모듈 스크립트 그래프를 가져오고, result가 주어졌을 때 다음 단계를 실행한다:
이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계에서는 아무것도 하지 않는다.
다음 코드 조각은 여러 모듈을 미리 로드한 애플리케이션의 상단 부분을 보여준다:
<!DOCTYPE html>
< html lang = "en" >
< title > IRCFog</ title >
< link rel = "modulepreload" href = "app.mjs" >
< link rel = "modulepreload" href = "helpers.mjs" >
< link rel = "modulepreload" href = "irc.mjs" >
< link rel = "modulepreload" href = "fog-machine.mjs" >
< script type = "module" src = "app.mjs" >
...
애플리케이션의 모듈 그래프가 다음과 같다고 가정한다:
여기서 애플리케이션 개발자가 모듈 그래프의 모든 모듈을 선언하는 데 modulepreload
를 사용하여 사용자 에이전트가 모든 모듈의 가져오기를 시작하도록 보장한 것을 볼 수 있다. 이러한 미리
로드가 없으면 HTTP/2 Server Push 같은 기술이 사용되지 않는 경우 사용자 에이전트가
helpers.mjs를 발견하기 전에 여러 번의 네트워크 왕복을 거쳐야 할 수 있다. 이러한 방식으로
modulepreload
link 요소를
애플리케이션 모듈의 일종의 "매니페스트"로 사용할 수 있다.
다음 코드는 네트워크 가져오기가 미리 수행되도록 modulepreload
링크를 import()
와 함께 사용하여, import()
가 호출될 때 모듈이 모듈 맵에서 이미 준비되어 있도록(단, 평가되지는 않음)
하는 방법을 보여준다:
< link rel = "modulepreload" href = "awesome-viewer.mjs" >
< button onclick = "import('./awesome-viewer.mjs').then(m => m.view())" >
View awesome thing
</ button >
nofollow"nofollow 키워드는
a,
area 및 form 요소와 함께 사용할 수
있다. 이 키워드는 하이퍼링크를 생성하지 않지만, 요소가 생성한 다른 모든 하이퍼링크
(다른 키워드가 하이퍼링크를 생성하지 않는 경우 암시된 하이퍼링크)에 주석을 단다.
nofollow 키워드는
해당 링크가 페이지의 원래 작성자 또는 게시자의 지지를 받지 않거나, 참조된 문서로 연결되는 링크가 두
페이지 관계자 사이의 상업적 관계 때문에 주로 포함되었음을 나타낸다.
noopener"현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
noopener 키워드는
a,
area 및 form 요소와 함께 사용할 수
있다. 이 키워드는 하이퍼링크를 생성하지 않지만, 요소가 생성한 다른 모든 하이퍼링크
(다른 키워드가 하이퍼링크를 생성하지 않는 경우 암시된 하이퍼링크)에 주석을 단다.
이 키워드는 하이퍼링크를 따라가면서 새로 생성된 모든 최상위 순회 가능 객체에 보조 브라우징 컨텍스트가 포함되지 않음을
나타낸다.
예를 들어 결과 Window의 opener
getter는 null을 반환한다.
처리 모델도 참조한다.
이는 일반적으로 보조 브라우징
컨텍스트를 가진 최상위 순회 가능 객체를
생성한다(대상 이름이 "example"인 기존 내비게이션 가능 객체가 없다고 가정):
< a href = help.html target = example > Help!</ a >
이는 비-보조 브라우징 컨텍스트를 가진 최상위 순회 가능 객체를 생성한다(같은 조건을 가정):
< a href = help.html target = example rel = noopener > Help!</ a >
다음은 서로 동등하며 부모 내비게이션 가능 객체만 탐색한다:
< a href = index.html target = _parent > Home</ a >
< a href = index.html target = _parent rel = noopener > Home</ a >
noreferrer"
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
noreferrer
키워드는 a,
area 및 form 요소와 함께 사용할 수
있다. 이 키워드는 하이퍼링크를 생성하지 않지만, 요소가 생성한 다른 모든 하이퍼링크
(다른 키워드가 하이퍼링크를 생성하지 않는 경우 암시된 하이퍼링크)에 주석을 단다.
이는 링크를 따라갈 때 리퍼러 정보가 유출되지 않아야 함을 나타내며, 같은 조건에서 noopener 키워드
동작도 암시한다.
리퍼러를 직접 조작하는 처리 모델도 참조한다.
<a href="..." rel="noreferrer" target="_blank">는
<a href="..." rel="noreferrer noopener" target="_blank">와 같은 동작을 한다.
opener"opener 키워드는
a,
area 및 form 요소와 함께 사용할 수
있다. 이 키워드는 하이퍼링크를 생성하지 않지만, 요소가 생성한 다른 모든 하이퍼링크
(다른 키워드가 하이퍼링크를 생성하지 않는 경우 암시된 하이퍼링크)에 주석을 단다.
이 키워드는 하이퍼링크를 따라가면서 새로 생성된 모든 최상위 순회 가능 객체에 보조 브라우징 컨텍스트가 포함됨을 나타낸다.
처리 모델도 참조한다.
다음 예제에서는 사용자가 찾는 내용을 다른 곳에서 찾을 수 있는 경우 등에 도움말 페이지 팝업이 자신을
연 페이지를 탐색할 수 있도록 opener를
사용한다.
_blank 대신 이름이 지정된 대상을 사용하는 방법도 있지만, 이는 기존 이름과 충돌할
가능성이 있다.
< a href = "..." rel = opener target = _blank > Help!</ a >
pingback"pingback 키워드는
link
요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스
링크를 생성한다. 이 키워드는 body-ok이다.
pingback 키워드의 의미
체계는 Pingback 1.0을 참조한다. [PINGBACK]
preconnect"
현재의 모든 엔진에서 지원된다.
preconnect
키워드는 link
요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스
링크를 생성한다. 이 키워드는 body-ok이다.
preconnect
키워드는 사용자가 해당 출처에 위치한 리소스를 필요로 할 가능성이 매우 높고
연결
설정과 관련된 지연 비용을 선제적으로 처리하면 사용자 경험이 개선되므로, 지정된 리소스의 출처에 선제적으로 연결을 시작하는 것이
유익할 가능성이 높음을 나타낸다.
preconnect 키워드가
제공하는 리소스에는 기본 유형이 없다.
사용자 에이전트는 이 링크 유형 때문에 load 이벤트를 지연해서는 안 된다.
이 유형의 링크를 가져와 처리하기에 적절한 시점은 다음과 같다:
이미 브라우징 컨텍스트에
연결된 link 요소에
외부 리소스 링크가 생성될 때.
외부 리소스 링크의 link 요소가
브라우징 컨텍스트에
연결될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스 링크의
link
요소의 href 속성이
변경될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스 링크의
link 요소의
crossorigin
속성이 설정, 변경 또는 제거될 때.
link 요소
el이 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된 리소스를 가져와 처리하는
단계는 el에서 링크 옵션을 생성하고 그 결과를 사용하여
미리 연결하는 것이다.
링크 처리 옵션 options이 주어졌을 때 미리 연결하려면:
options의 href가 빈 문자열이면 반환한다.
url을 options의 href를 options의 기준 URL을 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.
문서 또는 환경 대신 기준 URL을 전달하는 문제는 이슈 #9715에서 추적한다.
url이 실패이면 반환한다.
url의 스킴이 HTTP(S) 스킴이 아니면 반환한다.
partitionKey를 options의 환경을 사용하여 네트워크 파티션 키를 결정한 결과로 둔다.
useCredentials를 true로 둔다.
options의 crossorigin이 Anonymous이고 options의 출처가 url의 출처와 동일 출처가 아니면 useCredentials를 false로 설정한다.
사용자 에이전트는 partitionKey, url의 출처 및 useCredentials를 사용하여 연결을 확보해야 한다.
이 연결은 확보되지만 직접 사용되지는 않는다. 이후 사용을 위해 연결 풀에 남아 있게 된다.
사용자 에이전트는 가능할 때마다 미리 연결을 시작하고 전체 연결 핸드셰이크(HTTP의 경우 DNS+TCP, HTTPS 출처의 경우 DNS+TCP+TLS)를 수행해야 하지만, 리소스 제약 또는 다른 이유로 부분 핸드셰이크 (HTTP의 경우 DNS만, HTTPS 출처의 경우 DNS 또는 DNS+TCP)만 수행하거나 완전히 건너뛸 수 있다.
출처당 최적의 연결 수는 협상된 프로토콜, 사용자의 현재 연결 프로필, 사용 가능한 기기 리소스, 전역 연결 제한 및 기타 맥락별 변수에 따라 달라진다. 따라서 몇 개의 연결을 열지에 대한 결정은 사용자 에이전트에 맡긴다.
prefetch"prefetch 키워드는
link
요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스
링크를 생성한다. 이 키워드는 body-ok이다.
prefetch 키워드는
사용자가 향후 내비게이션에서 이 리소스를 필요로 할 가능성이 매우 높으므로 지정된 리소스 또는 동일 사이트
문서를 선제적으로 가져와 캐시하는 것이 유익할
가능성이 높음을 나타낸다.
prefetch 키워드가
제공하는 리소스에는 기본 유형이 없다.
이 유형의 링크를 가져와 처리하기에 적절한 시점은 다음과 같다:
이미 브라우징 컨텍스트에
연결된 link 요소에
외부 리소스 링크가 생성될 때.
외부 리소스 링크의 link 요소가
브라우징
컨텍스트에
연결될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스 링크의
link
요소의 href 속성이
변경될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스 링크의
link 요소의
crossorigin
속성이 설정, 변경 또는 제거될 때.
link 요소
el이 주어졌을 때 prefetch 링크에 대한
링크된 리소스를 가져와 처리하는
알고리즘은 다음과 같다:
el의 href 속성 값이
빈
문자열이면 반환한다.
options을 el에서 링크 옵션을 생성한 결과로 둔다.
request를 options을 사용하여 링크 요청을 생성한 결과로 둔다.
request가 null이면 반환한다.
request의 개시자를
"prefetch"로 설정한다.
processPrefetchResponse를 응답 response와 null, 실패 또는 바이트 시퀀스 bytesOrNull이 주어졌을 때 실행하는 다음 단계로 둔다:
사용자 에이전트는 processResponseConsumeBody를 processPrefetchResponse로 설정하여 request를 가져와야 한다. 사용자 에이전트는 현재 문서에 필요한 다른 요청을 우선 처리하기 위해 request의 가져오기를 지연할 수 있다.
이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계에서는 아무것도 하지 않는다.
preload"하나의 엔진에서만 지원된다.
preload 키워드는
link
요소와 함께 사용할 수 있다. 이 키워드는 외부 리소스
링크를 생성한다. 이 키워드는 body-ok이다.
preload 키워드는
사용자가 현재 내비게이션에서 이 리소스를 필요로 할 가능성이 매우 높으므로, 사용자 에이전트가
as 속성이 제공한 미리 로드 대상과 fetchpriority
속성이 제공한 우선순위에 따라 지정된 리소스를 선제적으로 가져와 캐시할 것임을 나타낸다.
사용자 에이전트는 리소스를 로드할 때 이미지를 선제적으로 디코딩하거나 스타일시트를 생성하는 등의 추가 작업을 수행할 수 있다. 그러나 이러한 추가 작업은 관찰 가능한 효과를 가져서는 안 된다.
preload 키워드가 제공하는
리소스에는 기본 유형이 없다.
사용자 에이전트는 이 링크 유형 때문에 load 이벤트를 지연해서는 안 된다.
이러한 링크의 링크된 리소스를 가져와 처리하기에 적절한 시점은 다음과 같다:
이미 브라우징 컨텍스트에 연결된
link 요소에
외부 리소스 링크가 생성될 때.
외부 리소스 링크의 link 요소가
브라우징
컨텍스트에
연결될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스 링크의
link
요소의 href 속성이
변경될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스 링크의
link
요소의 as 속성이
변경될 때.
이미 브라우징 컨텍스트에
연결되어 있지만 type 속성이 요청
대상에서
지원하지 않는 유형을 지정하여 이전에
가져오지 못했던 외부 리소스 링크의
link
요소의 type 속성이
설정, 제거 또는 변경될 때.
이미 브라우징 컨텍스트에
연결되어 있지만 media 속성이
환경과 일치하지 않아 이전에 가져오지 못했던
외부 리소스 링크의 link
요소의 media 속성이
변경 또는 제거될 때.
Document에는 미리 로드된 리소스 맵이 있으며, 이는 처음에 비어 있는
순서 있는 맵이다.
same-origin",
"cors" 또는 "no-cors" 중 하나
Window window에 대해,
URL
url, 문자열 destination, 문자열
mode, 문자열 credentialsMode, 문자열 integrityMetadata 및
응답을 받는 알고리즘 onResponseAvailable이 주어졌을 때
미리 로드된 리소스를 소비하려면:
key를 미리 로드 키로 둔다. 그 URL은 url, 대상은 destination, 모드는 mode, 자격 증명 모드는 credentialsMode이다.
preloads를 window의 연관된 Document의 미리 로드된 리소스 맵으로 둔다.
key가 preloads에 존재하지 않으면 false를 반환한다.
entry를 preloads[key]로 둔다.
consumerIntegrityMetadata를 integrityMetadata를 구문 분석한 결과로 둔다.
다음 조건 중 어느 것도 적용되지 않으면:
consumerIntegrityMetadata가 no metadata이다;
consumerIntegrityMetadata가 preloadIntegrityMetadata와 같다; 또는
이 비교는 알 수 없는 무결성 옵션을 무시한다. 이슈 #116을 참조한다.
그러면 false를 반환한다.
미리 로드와 소비자 사이의 무결성 메타데이터가 서로 일치하지 않으면 둘 다 데이터와 일치하더라도 네트워크에서 추가 가져오기가 발생한다.
미리 로드 요청에서 오류가 발생한 경우 잘못된 응답을 나중에 네트워크에서 다시 요청하지 않도록 네트워크 오류를 미리 로드 캐시에 추가하는 것이 중요하다. 이는 보안에도 영향을 미친다. 개발자가 미리 로드 요청에는 하위 리소스 무결성 메타데이터를 지정하지만 이후의 리소스 요청에는 지정하지 않는 경우를 생각해 보자. 미리 로드 요청이 하위 리소스 무결성 검증에 실패하여 폐기되면 리소스 요청은 무결성을 검증하지 않고 네트워크에서 잠재적으로 악의적인 응답을 가져와 소비한다. [SRI]
preloads[key]를 제거한다.
entry의 응답이 null이면 entry의 응답 사용 가능 시를 onResponseAvailable로 설정한다.
그렇지 않으면 entry의 응답을 사용하여 onResponseAvailable을 호출한다.
true를 반환한다.
이 절의 목적상 문자열 type은 다음 알고리즘이 true를 반환하면 미리 로드 대상 destination과 일치한다:
type이 빈 문자열이면 true를 반환한다.
destination이 "fetch"이면 true를 반환한다.
mimeTypeRecord를 type을 구문 분석한 결과로 둔다.
mimeTypeRecord가 실패이면 false를 반환한다.
mimeTypeRecord가 사용자 에이전트에서 지원되지 않으면 false를 반환한다.
다음 중 하나라도 참이면:
destination이 "script"이고
mimeTypeRecord가 JavaScript MIME 유형이다;
destination이 "image"이고
mimeTypeRecord가 이미지 MIME
유형이다;
destination이 "font"이고
mimeTypeRecord가 글꼴 MIME
유형이다;
그러면 true를 반환한다.
false를 반환한다.
요청 request에 대한 미리 로드 키를 생성하려면, 새 미리 로드 키를 반환한다. 그 URL은 request의 URL, 대상은 request의 대상, 모드는 request의 모드, 자격 증명 모드는 request의 자격 증명 모드이다.
미리 로드 대상은 "fetch", "font",
"image", "script", "style" 또는 "track"이다.
문자열 destination이 주어졌을 때 미리 로드 대상을 변환하려면:
링크 처리 옵션 options과 선택적 processResponse가 주어졌을 때 미리 로드하려면. 여기서 processResponse는 응답을 받는 알고리즘이다:
options의 대상이 "image"이고
options의 소스
집합이 null이 아니면
options의 href를
options의 소스
집합에서 이미지 소스를 선택한 결과로
설정한다.
request를 options을 사용하여 링크 요청을 생성한 결과로 둔다.
request가 null이면 반환한다.
unsafeEndTime을 0으로 둔다.
key를 request를 사용하여 미리 로드 키를 생성한 결과로 둔다.
controller를 null로 둔다.
Document
document가 주어졌을 때 reportTiming을, document의 관련 전역 객체를 사용하여
controller에 대해 타이밍을
보고하는 것으로 둔다.
controller를 processResponseConsumeBody를 응답 response와 null, 실패 또는 바이트 시퀀스 bodyBytes가 주어졌을 때 실행하는 다음 단계로 설정하여 request를 가져온 결과로 설정한다:
bodyBytes가 바이트 시퀀스이면 response의 본문을 bodyBytes를 본문으로 만든 것으로 설정한다.
processResponseConsumeBody를 사용하여 전체 본문을 추출했다. 이는 미리 로드가 소비될지 여부가 현재 불확실하더라도 미리 로더가 네트워크에서 전체 본문을 로드하도록 보장하는 데 필요하다. 그런 다음 이 단계에서는 요청 본문을 동일한 바이트를 포함하는 새 본문으로 재설정하여, 이미 한 번 읽었더라도 다른 명세가 실제 소비 시점에 이를 읽을 수 있도록 한다.
그렇지 않으면 response를 네트워크 오류로 설정한다.
unsafeEndTime을 안전하지 않은 공유 현재 시각으로 설정한다.
options의 문서가 null이 아니면 options의 문서를 사용하여 reportTiming을 호출한다.
entry의 응답 사용 가능 시가 null이면 entry의 응답을 response로 설정하고, 그렇지 않으면 response를 사용하여 entry의 응답 사용 가능 시를 호출한다.
processResponse가 주어졌으면 response를 사용하여 processResponse를 호출한다.
Document
document가 주어졌을 때 commit을 다음 단계로 둔다:
entry의 응답이 null이 아니면 document를 사용하여 reportTiming을 호출한다.
document의 미리 로드된 리소스 맵[key]을 entry로 설정한다.
options의 문서가 null이면 options의 문서 준비 시를 commit으로 설정한다. 그렇지 않으면 options의 문서를 사용하여 commit을 호출한다.
link 요소
el이 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된 리소스를 가져와 처리하는
단계는 다음과 같다:
el의 소스 집합을 업데이트한다.
options을 el에서 링크 옵션을 생성한 결과로 둔다.
destination이 null이면 반환한다.
options의 대상을 destination으로 설정한다.
privacy-policy"privacy-policy
키워드는
link, a 및 area 요소와 함께 사용할 수
있다. 이 키워드는
하이퍼링크를 생성한다.
privacy-policy
키워드는
Additional Link Relation Types에 더 자세히 설명된 대로 참조된 문서에 현재 문서에 적용되는
데이터 수집 및 사용 관행에 관한 정보가 포함되어 있음을 나타낸다. 참조된 문서는 독립된 개인정보 보호
정책일 수도 있고, 보다 일반적인 문서의 특정 절일 수도 있다. [RFC6903]
search"search 키워드는
link,
a, area 및 form 요소와 함께 사용할 수 있다.
이 키워드는
하이퍼링크를 생성한다.
search 키워드는 참조된
문서가 문서와 그 관련 리소스를 검색하기 위한 인터페이스를 특별히 제공함을 나타낸다.
OpenSearch 설명 문서는 link 요소 및
search 링크 유형과 함께
사용하여 사용자 에이전트가 검색 인터페이스를 자동 탐색할 수 있게 한다.
[OPENSEARCH]
stylesheet"
stylesheet
키워드는 link
요소와 함께 사용할 수 있다. 이 키워드는 스타일링 처리 모델에 기여하는 외부 리소스
링크를 생성한다. 이 키워드는
body-ok이다.
지정된 리소스는 문서를 표시하는 방법을 설명하는 CSS 스타일시트이다.
하나의 엔진에서만 지원된다.
alternate 키워드도
link 요소에
지정되면 해당 링크는 대체 스타일시트이다. 이 경우
title 속성을 비어 있지 않은 값으로
link 요소에
지정해야 한다.
stylesheet
키워드가 제공하는 리소스의 기본 유형은 text/css이다.
이 유형의 link
요소가 해당 요소의 노드 문서의
파서에 의해 생성되었다면 암시적으로 잠재적인 렌더링 차단
요소이다.
stylesheet 키워드가
있는 link
요소의 disabled 속성이
설정되면 연관된 CSS 스타일시트를 비활성화한다.
이 유형의 링크를 가져와 처리하기에 적절한 시점은 다음과 같다:
이미 브라우징 컨텍스트에
연결된 link 요소에
외부 리소스 링크가 생성될 때.
외부 리소스 링크의 link 요소가
브라우징 컨텍스트에
연결될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스 링크의
link
요소의 href 속성이
변경될 때.
이미 브라우징 컨텍스트에
연결된
외부 리소스 링크의
link 요소의
disabled 속성이
설정, 변경 또는 제거될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스 링크의
link 요소의
crossorigin
속성이 설정, 변경 또는 제거될 때.
이미 브라우징 컨텍스트에
연결된 외부 리소스 링크의
link
요소의 type 속성이
이전에 가져온 외부 리소스가 있는 경우 그 리소스의 Content-Type
메타데이터와 일치하지 않거나 더 이상
일치하지 않는 값으로 설정 또는 변경될 때.
이미 브라우징 컨텍스트에
연결되어 있지만 type 속성이
지원되지
않는 유형을 지정하여 이전에 가져오지 못했던 외부 리소스 링크의 link
요소의 type 속성이 제거 또는
변경될 때.
이미 브라우징 컨텍스트에 연결된 외부 리소스 링크가 대체 스타일시트인 상태에서 그렇지 않은 상태로 변경되거나 그 반대로 변경될 때.
쿼크: 문서가 쿼크 모드로
설정되어 있고 외부 리소스의 URL과
동일 출처이며 외부 리소스의 Content-Type 메타데이터가 지원되는
스타일시트 유형이 아닌 경우, 사용자 에이전트는 대신 이를 text/css로
간주해야 한다.
link 요소
el과 요청
request가 주어졌을 때, 이 유형의 링크된 리소스에 대한 링크된 리소스 가져오기 설정 단계는
다음과 같다:
el의 disabled 속성이
설정되어 있으면 false를 반환한다.
el이 스크립트 차단 스타일시트에 기여하면 el을 그 노드 문서의 스크립트 차단 스타일시트 집합에 추가한다.
el의 media 속성
값이
환경과
일치하고 el이
잠재적으로 렌더링을
차단하면
el의 렌더링을 차단한다.
true를 반환한다.
기본 링크된 리소스 가져오기 및 처리
알고리즘 대신 CSSOM의 CSS 스타일시트
가져오기 알고리즘을 사용할 계획은 이슈
#968을 참조한다. 그동안 모든 중요 하위
리소스 요청은 link 요소가 현재
렌더링을 차단하는지 여부에 따라
그 렌더링
차단을 설정해야 한다.
link 요소
el, 불리언 success, 응답 response
및 바이트 시퀀스
bodyBytes가 주어졌을 때 이 유형의 링크된 리소스를 처리하려면:
리소스의 Content-Type 메타데이터가
text/css가 아니면
success를 false로 설정한다.
el이 더 이상 스타일링 처리 모델에 기여하는 외부 리소스 링크를 생성하지 않거나, 해당 리소스를 가져온 후 다시 가져오는 것이 적절해진 경우:
el을 el의 노드 문서의 스크립트 차단 스타일시트 집합에서 제거한다.
반환한다.
el에 연관된 CSS 스타일시트가 있으면 CSS 스타일시트를 제거한다.
success가 true이면:
다음 속성을 사용하여 CSS 스타일시트를 생성한다:
response의 URL 목록[0]
w3c/csswg-drafts 이슈 #9316이 수정될 것이라는 가정하에 여기에서 URL을 제공한다.
el
el의 media 속성.
이는 속성의 현재 값 복사본이 아니라 현재 존재하지 않을 수도 있는 속성에 대한 참조이다. CSSOM은 속성이 동적으로 설정, 변경 또는 제거될 때 발생하는 일을 정의한다.
el이 문서
트리에 있으면 el의 title 속성,
그렇지 않으면 빈 문자열.
이 역시 속성의 현재 값 복사본이 아니라 속성에 대한 참조이다.
링크가 대체 스타일시트이고 el의 명시적으로 활성화됨이 false이면 설정하고, 그렇지 않으면 설정하지 않는다.
리소스가 CORS 동일 출처이면 설정하고, 그렇지 않으면 설정하지 않는다.
null
기본값으로 둔다.
초기화하지 않은 상태로 둔다.
이는 올바르지 않아 보인다. 아마 bodyBytes를 사용해야 할까? 이슈 #2997에서 추적한다.
CSS 환경 인코딩은 다음 단계를 실행한 결과이다: [CSSSYNTAX]
el에 charset
속성이 있으면 그 속성 값에서 인코딩을 가져온다.
성공하면 결과 인코딩을 반환한다.
[ENCODING]
그렇지 않으면 문서의 문자 인코딩을 반환한다. [DOM]
el이 스크립트 차단 스타일시트에 기여하면:
단언: el의 노드 문서의 스크립트 차단 스타일시트 집합은 el을 포함한다.
el을 그 노드 문서의 스크립트 차단 스타일시트 집합에서 제거한다.
el의 렌더링 차단을 해제한다.
이 유형의 링크된 리소스에 대한 링크 헤더 처리 단계에서는 아무것도 하지 않는다.
tag"tag 키워드는 a 및
area 요소와 함께 사용할 수
있다. 이 키워드는 하이퍼링크를 생성한다.
tag 키워드는 참조된 문서가
나타내는 태그가 현재 문서에 적용됨을 나타낸다.
태그가 현재 문서에 적용됨을 나타내므로, 여러 페이지에서 인기 있는 태그를 나열하는 태그 클라우드의 마크업에 이 키워드를 사용하는 것은 부적절하다.
이 문서는 몇 가지 보석에 관한 것이므로, 미국의 도시나 Ruby 패키지 형식 또는 스위스 기관차 등급이
아닌 "보석" 종류의 보석에 적용된다는 것을 명확하게 분류하기 위해
"https://en.wikipedia.org/wiki/Gemstone"으로 태그가 지정되어 있다:
<!DOCTYPE HTML>
< html lang = "en" >
< head >
< title > My Precious</ title >
</ head >
< body >
< header >< h1 > My precious</ h1 > < p > Summer 2012</ p ></ header >
< p > Recently I managed to dispose of a red gem that had been
bothering me. I now have a much nicer blue sapphire.</ p >
< p > The red gem had been found in a bauxite stone while I was digging
out the office level, but nobody was willing to haul it away. The
same red gem stayed there for literally years.</ p >
< footer >
Tags: < a rel = tag href = "https://en.wikipedia.org/wiki/Gemstone" > Gemstone</ a >
</ footer >
</ body >
</ html >
이 문서에는 두 개의 글이 있다. 그러나 "tag"
링크는 페이지 전체에 적용된다. 이는 article 요소 안을
포함하여 어디에 배치하더라도 마찬가지이다.
<!DOCTYPE HTML>
< html lang = "en" >
< head >
< title > Gem 4/4</ title >
</ head >
< body >
< article >
< h1 > 801: Steinbock</ h1 >
< p > The number 801 Gem 4/4 electro-diesel has an ibex and was rebuilt in 2002.</ p >
</ article >
< article >
< h1 > 802: Murmeltier</ h1 >
< figure >
< img src = "https://upload.wikimedia.org/wikipedia/commons/b/b0/Trains_de_la_Bernina_en_hiver_2.jpg"
alt = "The 802 was red with pantographs and tall vents on the side." >
< figcaption > The 802 in the 1980s, above Lago Bianco.</ figcaption >
</ figure >
< p > The number 802 Gem 4/4 electro-diesel has a marmot and was rebuilt in 2003.</ p >
</ article >
< p class = "topic" >< a rel = tag href = "https://en.wikipedia.org/wiki/Rhaetian_Railway_Gem_4/4" > Gem 4/4</ a ></ p >
</ body >
</ html >
terms-of-service"terms-of-service
키워드는
link, a 및 area 요소와 함께 사용할
수 있다. 이 키워드는
하이퍼링크를 생성한다.
terms-of-service
키워드는 Additional Link Relation Types에 더 자세히 설명된 대로 참조된 문서에 현재 문서의
제공자와 현재 문서를 사용하려는 사용자 간의 계약에 관한 정보가 포함되어 있음을 나타낸다.
[RFC6903]
일부 문서는 문서 시퀀스의 일부를 이룬다.
문서 시퀀스는 각 문서에 이전 형제와 다음 형제가 있을 수 있는 시퀀스이다. 이전 형제가 없는 문서는 시퀀스의 시작이고, 다음 형제가 없는 문서는 시퀀스의 끝이다.
문서는 여러 시퀀스의 일부일 수 있다.
next"next 키워드는
link,
a, area 및 form 요소와 함께 사용할 수 있다.
이 키워드는 하이퍼링크를 생성한다.
next 키워드는 문서가 시퀀스의
일부이며 해당 링크가 시퀀스에서 논리적으로 다음 문서로 이어짐을 나타낸다.
next 키워드를 link
요소와 함께 사용할 때 사용자 에이전트는 해당 링크를 dns-prefetch,
preconnect 또는
prefetch 키워드 중
하나를 사용한 것처럼 처리해야 한다. 사용자 에이전트가 어떤 키워드를 사용할지는 구현에 따라 달라진다.
예를 들어 사용자 에이전트는 데이터, 배터리 전력 또는 처리 능력을 절약하려 할 때 비용이 더 적게 드는
preconnect 처리 모델을
사용하거나, 유사한 상황에서 과거 사용자 행동을 휴리스틱으로 분석한 결과에 따라 키워드를 선택할 수 있다.
prev"prev 키워드는
link,
a, area 및 form 요소와 함께 사용할 수 있다.
이 키워드는 하이퍼링크를 생성한다.
prev 키워드는 문서가 시퀀스의
일부이며 해당 링크가 시퀀스에서 논리적으로 이전 문서로 이어짐을 나타낸다.
동의어: 역사적인 이유로 사용자 에이전트는 "previous" 키워드도
prev 키워드처럼 처리해야 한다.
미리 정의된 링크 유형 집합의 확장은 기존 rel 값에 대한 microformats 페이지에 등록할 수 있다. [MFREL]
누구나 언제든지 기존 rel 값에 대한 microformats 페이지를 편집하여 유형을 추가할 수 있다. 확장 유형에는 다음 정보를 지정해야 한다:
정의하는 실제 값. 이 값은 정의된 다른 값과 혼동될 정도로 비슷해서는 안 된다(예: 대소문자만 다른 경우).
값에 U+003A COLON 문자(:)가 포함되어 있으면 절대 URL이어야 한다.
link다음 중 하나:
link 요소에 지정해서는 안
된다.link 요소에 지정할 수
있으며, 하이퍼링크를 생성한다.
link 요소에 지정할 수
있으며, 외부 리소스 링크를 생성한다.
a 및 area다음 중 하나:
a 및 area 요소에 지정해서는 안
된다.a 및 area 요소에 지정할 수
있으며, 하이퍼링크를 생성한다.
a 및 area 요소에 지정할 수
있으며, 외부 리소스 링크를 생성한다.
a 및 area 요소에 지정할 수
있으며, 요소가 생성한 다른 하이퍼링크에 주석을 단다.form다음 중 하나:
form 요소에 지정해서는 안
된다.form 요소에 지정할 수
있으며, 하이퍼링크를 생성한다.
form 요소에 지정할 수
있으며, 외부 리소스 링크를 생성한다.
form 요소에 지정할 수
있으며, 요소가 생성한 다른 하이퍼링크에 주석을 단다.키워드의 의미에 대한 짧은 비규범적 설명.
키워드의 의미 체계와 요구 사항에 대한 더 자세한 설명으로 연결되는 링크. 위키의 다른 페이지일 수도 있고 외부 페이지로 연결되는 링크일 수도 있다.
처리 요구 사항이 정확히 같은 다른 키워드 값의 목록. 작성자는 동의어로 정의된 값을 사용해서는 안 되며, 이는 사용자 에이전트가 레거시 콘텐츠를 지원할 수 있도록 하기 위한 것일 뿐이다. 실제로 사용되지 않는 동의어는 누구나 제거할 수 있으며, 레거시 콘텐츠와의 호환성을 위해 동의어로 처리할 필요가 있는 이름만 이 방식으로 등록해야 한다.
다음 중 하나:
키워드가 기존 값과 중복되는 것으로 판명되면 제거하고 기존 값의 동의어로 나열해야 한다.
키워드가 "제안됨" 상태로 한 달 이상 등록되어 있지만 사용되거나 명세화되지 않았다면 레지스트리에서 제거할 수 있다.
키워드가 "제안됨" 상태로 추가된 뒤 기존 값과 중복되는 것으로 판명되면 제거하고 기존 값의 동의어로 나열해야 한다. 키워드가 "제안됨" 상태로 추가된 뒤 유해한 것으로 판명되면 상태를 "중단됨"으로 변경해야 한다.
누구나 언제든지 상태를 변경할 수 있지만 위 정의에 따라서만 변경해야 한다.
적합성 검사기는 기존 rel 값에 대한 microformats 페이지에 제공된 정보를 사용하여 값이 허용되는지 여부를 판단해야 한다. 이 명세에 정의되었거나 "제안됨" 또는 "비준됨"으로 표시된 값은 "…에 대한 효과" 필드에 설명된 대로 적용되는 요소에서 사용되면 허용해야 하지만, "중단됨"으로 표시되었거나 이 명세 또는 앞서 언급한 페이지 어디에도 나열되지 않은 값은 유효하지 않은 것으로 거부해야 한다. 적합성 검사기는 이 정보를 캐시할 수 있다(예: 성능상의 이유 또는 신뢰할 수 없는 네트워크 연결 사용을 피하기 위해).
작성자가 이 명세나 위키 페이지에 정의되지 않은 새 유형을 사용하면 적합성 검사기는 위에서 설명한 세부 정보와 함께 "제안됨" 상태로 해당 값을 위키에 추가하도록 제안해야 한다.
기존 rel 값에 대한
microformats 페이지에서 "제안됨" 또는 "비준됨" 상태의 확장으로 정의된 유형은 "…에 대한 효과"
필드에 따라 rel 속성을 link, a 및 area
요소에서 사용할 수 있다. [MFREL]
ins 및 del 요소는 문서에 대한 편집을 나타낸다.
ins
요소현재의 모든 엔진에서 지원된다.
cite — 인용문의 출처 또는
편집에 관한 추가 정보로 연결되는 링크
datetime — 변경 날짜와
선택적으로 시간
cite, datetime을 포함한 기본.HTMLModElement를 사용한다.다음은 단일 단락의 추가를 나타낸다:
< aside >
< ins >
< p > I like fruit. </ p >
</ ins >
</ aside >
다음도 마찬가지이다. 여기에서 aside 요소 안의
모든 것이
구문 콘텐츠로 간주되므로
단락이 하나뿐이기 때문이다:
< aside >
< ins >
Apples are < em > tasty</ em > .
</ ins >
< ins >
So are pears.
</ ins >
</ aside >
다음 예제는 두 단락의 추가를 나타내며, 두 번째 단락은 두 부분으로 삽입되었다. 따라서 이 예제의 첫 번째
ins 요소는 단락 경계를
가로지르며, 이는 좋지 않은 형식으로 간주된다.
< aside >
<!-- don't do this -->
< ins datetime = "2005-03-16 00:00Z" >
< p > I like fruit. </ p >
Apples are < em > tasty</ em > .
</ ins >
< ins datetime = "2007-12-19 00:00Z" >
So are pears.
</ ins >
</ aside >
다음은 이를 마크업하는 더 나은 방법이다. 더 많은 요소를 사용하지만 어떤 요소도 암시된 단락 경계를 넘지 않는다.
< aside >
< ins datetime = "2005-03-16 00:00Z" >
< p > I like fruit. </ p >
</ ins >
< ins datetime = "2005-03-16 00:00Z" >
Apples are < em > tasty</ em > .
</ ins >
< ins datetime = "2007-12-19 00:00Z" >
So are pears.
</ ins >
</ aside >
del
요소현재의 모든 엔진에서 지원된다.
cite — 인용문의 출처 또는
편집에 관한 추가 정보로 연결되는 링크
datetime — 변경 날짜와
선택적으로 시간
cite, datetime을 포함한 기본.HTMLModElement를 사용한다.다음은 완료된 항목에 완료 날짜와 시간을 함께 취소선을 표시한 "할 일" 목록이다.
< h1 > To Do</ h1 >
< ul >
< li > Empty the dishwasher</ li >
< li >< del datetime = "2009-10-11T01:25-07:00" > Watch Walter Lewin's lectures</ del ></ li >
< li >< del datetime = "2009-10-10T23:38-07:00" > Download more tracks</ del ></ li >
< li > Buy a printer</ li >
</ ul >
ins 및 del
요소에 공통인 속성cite 속성은
변경을 설명하는 문서의 URL을 지정하는 데 사용할 수 있다. 예를 들어 회의록처럼
해당 문서가 긴 경우 작성자는 변경을 논의하는 문서의 특정 부분을 가리키는 조각을
포함하는 것이 권장된다.
cite
속성이 존재하면 변경을 설명하는 공백으로 둘러싸일 수
있는 유효한 URL이어야 한다. 대응하는 출전 링크를 얻으려면 속성 값을 요소의 노드 문서를
기준으로 구문
분석해야 한다. 사용자
에이전트는 사용자가 이러한 출전 링크를 따라갈 수 있게 할 수 있지만, 이 링크는 주로 독자용이 아니라
비공개 용도(예: 사이트의 편집에 관한 통계를 수집하는 서버 측 스크립트)를 위한 것이다.
datetime
속성은 변경 날짜와 시간을 지정하는 데 사용할 수 있다.
datetime
속성이 존재하면 그 값은 선택적 시간이 포함된 유효한
날짜 문자열이어야 한다.
사용자 에이전트는 datetime
속성을 날짜 또는 시간 문자열 구문 분석
알고리즘에 따라 구문 분석해야 한다. 이 알고리즘이 날짜 또는 전역 날짜와 시간을 반환하지 않으면
해당 변경에는 연관된 타임스탬프가 없다(값이 부적합하며 선택적 시간이 포함된
유효한 날짜 문자열이 아니다). 그렇지 않으면 해당 변경은 주어진 날짜 또는 전역 날짜와 시간에 이루어진 것으로
표시된다. 주어진 값이 전역 날짜와
시간이면 사용자 에이전트는
연관된 시간대 오프셋 정보를 사용하여 주어진 날짜 및 시간을 어느 시간대로 표시할지 결정해야 한다.
이 값은 사용자에게 표시할 수 있지만 주로 비공개 용도를 위한 것이다.
ins 및
del
요소는
HTMLModElement
인터페이스를 구현해야 한다:
현재의 모든 엔진에서 지원된다.
[Exposed =Window ]
interface HTMLModElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , ReflectURL ] attribute USVString cite ;
[CEReactions , Reflect ] attribute DOMString dateTime ;
};
이 절은 비규범적이다.
ins 및 del 요소는 단락 구분에 영향을 주지 않으므로, 단락이 명시적인
p 요소 없이 암시되는 일부 경우에는
ins 또는 del 요소가 전체 단락 또는
다른 비-구문 콘텐츠 요소와 다른 단락의 일부를 모두 걸칠 수
있다.
예를 들면:
< section >
< ins >
< p >
This is a paragraph that was inserted.
</ p >
This is another paragraph whose first sentence was inserted
at the same time as the paragraph above.
</ ins >
This is a second sentence, which was there all along.
</ section >
일부 단락만 p 요소로 감싸면 한 단락의 끝,
두 번째 단락 전체 및 세 번째 단락의 시작이 동일한 ins 또는 del 요소에 포함될 수도
있다(그러나 이는 매우 혼란스럽고 좋은 관행으로 간주되지 않는다):
< section >
This is the first paragraph. < ins > This sentence was
inserted.
< p > This second paragraph was inserted.</ p >
This sentence was inserted too.</ ins > This is the
third paragraph in this example.
<!-- (don't do this) -->
</ section >
그러나 암시된 단락의 정의 방식 때문에 동일한 ins 또는 del 요소를 사용하여 한
단락의 끝과 바로 다음 단락의 시작을 마크업하는 것은 불가능하다. 대신 다음 예제처럼 하나 또는 두 개의
p 요소와 두 개의
ins 또는
del 요소를 사용해야
한다:
< section >
< p > This is the first paragraph. < del > This sentence was
deleted.</ del ></ p >
< p >< del > This sentence was deleted too.</ del > That
sentence needed a separate < del> element.</ p >
</ section >
부분적으로는 위에서 설명한 혼란 때문에 작성자는 ins 또는
del 요소가 암시된 단락 경계를 가로지르게 하는 대신, 모든
단락을 항상 p 요소로
마크업하는 것이 강력히 권장된다.
이 절은 비규범적이다.
ol 및
ul 요소의 콘텐츠 모델은
ins 및 del 요소를 자식으로 허용하지
않는다. 목록은 그렇지 않으면 삭제된 것으로 표시되었을 항목을 포함하여 항상 모든 항목을 나타낸다.
항목이 삽입되거나 삭제되었음을 나타내려면 ins 또는
del 요소로 li 요소의 콘텐츠를 감쌀 수 있다.
항목이 다른 항목으로 대체되었음을 나타내려면 단일 li 요소에
하나 이상의
del 요소를 두고 그 뒤에
하나 이상의 ins 요소를
둘 수 있다.
다음 예제에서는 처음에 비어 있던 목록에 시간이 지나면서 항목이 추가되고 제거되었다. 예제에서 강조된 부분은 목록의 "현재" 상태인 부분을 보여준다. 하지만 목록 항목 번호에는 편집 내용이 반영되지 않는다.
< h1 > Stop-ship bugs</ h1 >
< ol >
< li >< ins datetime = "2008-02-12T15:20Z" > Bug 225:
Rain detector doesn't work in snow</ ins ></ li >
< li >< del datetime = "2008-03-01T20:22Z" >< ins datetime = "2008-02-14T12:02Z" > Bug 228:
Water buffer overflows in April</ ins ></ del ></ li >
< li >< ins datetime = "2008-02-16T13:50Z" > Bug 230:
Water heater doesn't use renewable fuels</ ins ></ li >
< li >< del datetime = "2008-02-20T21:15Z" >< ins datetime = "2008-02-16T14:25Z" > Bug 232:
Carbon dioxide emissions detected after startup</ ins ></ del ></ li >
</ ol >
다음 예제에서는 처음에 과일만 있던 목록이 색상만 있는 목록으로 대체되었다.
< h1 > List of < del > fruits</ del >< ins > colors</ ins ></ h1 >
< ul >
< li >< del > Lime</ del >< ins > Green</ ins ></ li >
< li >< del > Apple</ del ></ li >
< li > Orange</ li >
< li >< del > Pear</ del ></ li >
< li >< ins > Teal</ ins ></ li >
< li >< del > Lemon</ del >< ins > Yellow</ ins ></ li >
< li > Olive</ li >
< li >< ins > Purple</ ins ></ li >
</ ul >
이 절은 비규범적이다.
표 모델의 일부를 이루는 요소는 ins 및 del 요소를 허용하지 않는 복잡한
콘텐츠 모델 요구 사항을 가지므로 표의 편집을 나타내기 어려울 수 있다.
행 전체 또는 열 전체가 추가되거나 제거되었음을 나타내려면 해당 행이나 열의 각 셀 전체 콘텐츠를 각각
ins 또는 del 요소로 감쌀 수 있다.
여기서는 표에 행이 추가되었다:
< table >
< thead >
< tr > < th > Game name < th > Game publisher < th > Verdict
< tbody >
< tr > < td > Diablo 2 < td > Blizzard < td > 8/10
< tr > < td > Portal < td > Valve < td > 10/10
< tr > < td > < ins > Portal 2</ ins > < td > < ins > Valve</ ins > < td > < ins > 10/10</ ins >
</ table >
여기서는 열이 제거되었다. 제거된 시간과 제거 이유를 설명하는 페이지로 연결되는 링크도 함께 제공된다:
< table >
< thead >
< tr > < th > Game name < th > Game publisher < th > < del cite = "/edits/r192" datetime = "2011-05-02 14:23Z" > Verdict</ del >
< tbody >
< tr > < td > Diablo 2 < td > Blizzard < td > < del cite = "/edits/r192" datetime = "2011-05-02 14:23Z" > 8/10</ del >
< tr > < td > Portal < td > Valve < td > < del cite = "/edits/r192" datetime = "2011-05-02 14:23Z" > 10/10</ del >
< tr > < td > Portal 2 < td > Valve < td > < del cite = "/edits/r192" datetime = "2011-05-02 14:23Z" > 10/10</ del >
</ table >
일반적으로 더 복잡한 편집(예: 셀 하나가 제거되어 뒤의 모든 셀이 위쪽이나 왼쪽으로 이동한 경우)을 나타내는 좋은 방법은 없다.
picture
요소
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
source
요소 뒤에 하나의 img
요소가 오며,
선택적으로 스크립트 지원
요소가 섞일 수 있다.[Exposed =Window ]
interface HTMLPictureElement : HTMLElement {
[HTMLConstructor ] constructor ();
};
picture 요소는
포함된 img 요소에 여러 소스를
제공하는 컨테이너로, 화면 픽셀 밀도, 뷰포트 크기, 이미지 형식 및
기타 요인에 따라 어떤 이미지 리소스를 사용할지 작성자가 선언적으로 제어하거나 사용자 에이전트에 힌트를
제공할 수 있게 한다.
이 요소는 자식을 나타낸다.
picture
요소는
비슷해 보이는 video
및 audio 요소와는 다소
다르다. 이들 모두 source 요소를
포함하지만, source 요소의
src 속성은 요소가
picture 요소 안에
중첩될 때 아무 의미가 없으며, 리소스 선택 알고리즘도 다르다. 또한 picture 요소
자체는 아무것도 표시하지 않는다. 이 요소는 포함된 img 요소가 여러 URL 중에서 선택할
수 있게 하는 맥락만 제공한다.
source
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
picture 요소의 자식으로,
img 요소 앞.
track 요소 앞.
type — 임베디드
리소스의 유형
media — 적용할 수 있는
미디어
src (audio 또는 video에서) — 리소스의 주소
srcset (picture에서) — 고해상도
디스플레이, 작은 모니터 등 서로 다른 상황에서 사용할 이미지
sizes (picture에서) — 서로
다른 페이지 레이아웃을 위한 이미지 크기
width (picture에서) — 수평
치수
height (picture에서) — 수직
치수
[Exposed =Window ]
interface HTMLSourceElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , ReflectURL ] attribute USVString src ;
[CEReactions , Reflect ] attribute DOMString type ;
[CEReactions , Reflect ] attribute USVString srcset ;
[CEReactions , Reflect ] attribute DOMString sizes ;
[CEReactions , Reflect ] attribute DOMString media ;
[CEReactions , Reflect ] attribute unsigned long width ;
[CEReactions , Reflect ] attribute unsigned long height ;
};
source 요소를 사용하면
작성자는 img 요소에 여러 대체
소스 집합을 지정하거나 미디어 요소에 여러 대체
미디어 리소스를 지정할 수 있다. 이 요소
자체는 아무것도 나타내지 않는다.
type 속성이
존재할 수 있다. 존재하는 경우 값은 유효한 MIME 유형
문자열이어야 한다.
media
속성도 존재할 수 있다. 존재하는 경우 값은 유효한 미디어 쿼리
목록을 포함해야 한다. 값이 환경과
일치하지 않으면 사용자 에이전트는 다음 source 요소로
건너뛴다.
media
속성은 미디어 요소의 리소스 선택 알고리즘 중 한 번만
평가된다. 반대로
picture 요소를
사용할 때 사용자 에이전트는 환경 변화에 반응한다.
나머지 요구 사항은 부모가 picture
요소인지 미디어 요소인지에 따라 달라진다:
source 요소의
부모가 picture
요소인 경우srcset
속성이 존재해야 하며, 이는 srcset 속성이다.
srcset
속성은 source
요소가 선택된 경우 이미지 소스를
소스 집합에 기여한다.
srcset
속성에 너비 설명자를 사용하는
이미지 후보 문자열이
하나라도 있으면 sizes 속성도 존재할
수 있다. 또한 뒤따르는 형제 img 요소가
자동 크기를 허용하지 않으면
sizes 속성이 반드시
존재해야 한다.
sizes
속성은 sizes 속성이며, source 요소가
선택된 경우 소스 크기를
소스 집합에 기여한다.
img
요소가 자동 크기를 허용하면 이전 형제
source
요소에서 sizes 속성을 생략할
수 있다. 이러한 경우에는 auto를 지정한
것과 같다.
source 요소는
치수 속성을 지원한다.
img 요소는 렌더링된
치수와 종횡비를 결정할 때 img 요소 자체의
속성
대신 source
요소의 width 및 height 속성을 사용할 수
있다. 이는 렌더링 절에 정의되어 있다.
type 속성은
소스 집합의 이미지 유형을 제공하여
사용자 에이전트가 주어진 유형을 지원하지 않는 경우 다음 source 요소로
건너뛸 수 있게 한다.
type 속성을
지정하지 않으면, 사용자 에이전트는 이미지를 가져온 뒤 그 이미지 형식을 지원하지 않는다는
사실을 알게 되더라도 다른 source 요소를
선택하지 않는다.
source
요소에 뒤따르는 형제 source
요소가
있거나 srcset 속성이
지정된 img 요소가
있으면, 다음 중 하나 이상을 가져야 한다:
앞뒤 ASCII 공백을 제거한 뒤 값이
빈 문자열이 아니고 문자열 "all"과 ASCII 대소문자를 구분하지 않고 일치하지 않는 값으로
지정된 media 속성.
지정된 type 속성.
src 속성이 존재해서는
안 된다.
source
요소의 부모가 미디어 요소인 경우src
속성은 미디어 리소스의 URL을
제공한다. 값은 공백으로 둘러싸일 수 있는
유효한 비어 있지 않은 URL이어야 한다. 이 속성은 반드시 존재해야 한다.
type 속성은
미디어 리소스의 유형을 제공하여
사용자 에이전트가 해당 미디어 리소스를 가져오기 전에 재생할 수 있는지
판단하는
데 도움을 준다. 특정 MIME 유형이 정의하는 codecs 매개변수는 리소스가 정확히 어떻게
인코딩되었는지 지정하는 데 필요할 수 있다.
[RFC6381]
source 요소가 이미
video 또는
audio 요소에 삽입된
상태에서 그 src 또는 type 속성을 동적으로
수정해도 아무 효과가 없다. 재생 중인 항목을 변경하려면 미디어 요소의
src 속성을 직접 사용하고,
사용 가능한 리소스 중에서 선택하기 위해 canPlayType()
메서드를 사용할 수 있다. 일반적으로 문서가 구문 분석된 뒤 source 요소를
수동으로 조작하는 것은 불필요하게 복잡한 접근 방식이다.
다음 목록은 type 속성에서
codecs= MIME 매개변수를 사용하는 몇 가지 예를 보여준다.
< source src = 'video.mp4' type = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"' >
< source src = 'video.mp4' type = 'video/mp4; codecs="avc1.58A01E, mp4a.40.2"' >
< source src = 'video.mp4' type = 'video/mp4; codecs="avc1.4D401E, mp4a.40.2"' >
< source src = 'video.mp4' type = 'video/mp4; codecs="avc1.64001E, mp4a.40.2"' >
< source src = 'video.mp4' type = 'video/mp4; codecs="mp4v.20.8, mp4a.40.2"' >
< source src = 'video.mp4' type = 'video/mp4; codecs="mp4v.20.240, mp4a.40.2"' >
< source src = 'video.3gp' type = 'video/3gpp; codecs="mp4v.20.8, samr"' >
< source src = 'video.ogv' type = 'video/ogg; codecs="theora, vorbis"' >
< source src = 'video.ogv' type = 'video/ogg; codecs="theora, speex"' >
< source src = 'audio.ogg' type = 'audio/ogg; codecs=vorbis' >
< source src = 'audio.spx' type = 'audio/ogg; codecs=speex' >
< source src = 'audio.oga' type = 'audio/ogg; codecs=flac' >
< source src = 'video.ogv' type = 'video/ogg; codecs="dirac, vorbis"' >
insertedNode가 주어졌을 때 source의 HTML 요소 삽입
단계는 다음과 같다:
parent를 insertedNode의 부모로 둔다.
parent가 src
속성이 없고 networkState가
NETWORK_EMPTY
값인 미디어 요소이면, 해당 미디어 요소의 리소스 선택 알고리즘을 호출한다.
parent가 picture 요소이면
parent의 자식 각각의 child에
대해 반복하고, child가 img 요소이면 이를
child에 대한 관련 변이로 간주한다.
movedNode, isSubtreeRoot 및 oldAncestor가 주어졌을 때 source의 HTML 요소 이동
단계는 다음과 같다:
removedNode, isSubtreeRoot 및 oldAncestor가 주어졌을 때 source의 HTML 요소 제거
단계는 다음과 같다:
제공된 미디어 리소스를 모든 사용자 에이전트가 렌더링할 수 있을지 작성자가 확신하지 못한다면, 마지막
source
요소에서 error 이벤트를 수신하고 대체 동작을
트리거할 수 있다:
< script >
function fallback( video) {
// replace <video> with its contents
while ( video. hasChildNodes()) {
if ( video. firstChild instanceof HTMLSourceElement)
video. removeChild( video. firstChild);
else
video. parentNode. insertBefore( video. firstChild, video);
}
video. parentNode. removeChild( video);
}
</ script >
< video controls autoplay >
< source src = 'video.mp4' type = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"' >
< source src = 'video.ogv' type = 'video/ogg; codecs="theora, vorbis"'
onerror = "fallback(parentNode)" >
...
</ video >
img
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
usemap 또는 controls 속성이 있는 경우:
대화형 콘텐츠.
picture
요소의 자식으로, 모든 source 요소 뒤.
alt — 이미지를 사용할 수 없을 때
사용할 대체 텍스트
src — 리소스의 주소
srcset — 고해상도 디스플레이,
작은 모니터 등 서로 다른 상황에서 사용할 이미지
sizes — 서로 다른 페이지
레이아웃을 위한 이미지 크기
crossorigin — 요소가
교차 출처 요청을 처리하는 방법
usemap — 사용할
이미지 맵의 이름
ismap — 이미지가 서버 측
이미지 맵인지 여부
controls — 사용자
에이전트 컨트롤 표시
width — 수평 치수
height — 수직 치수
referrerpolicy
— 요소가 시작한 가져오기에 대한 리퍼러
정책
decoding — 표시를 위해 이
이미지를 처리할 때 사용할 디코딩 힌트
loading — 로딩 지연을
결정할 때 사용
fetchpriority —
요소가 시작한 가져오기의 우선순위를 설정
alt 속성이 있는 경우: 작성자용; 구현자용.[Exposed =Window ,
LegacyFactoryFunction =Image (optional unsigned long width , optional unsigned long height )]
interface HTMLImageElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , Reflect ] attribute DOMString alt ;
[CEReactions , ReflectURL ] attribute USVString src ;
[CEReactions , Reflect ] attribute USVString srcset ;
[CEReactions , Reflect ] attribute DOMString sizes ;
[CEReactions ] attribute DOMString ? crossOrigin ;
[CEReactions , Reflect ] attribute DOMString useMap ;
[CEReactions , Reflect ] attribute boolean isMap ;
[CEReactions , Reflect ] attribute boolean controls ;
[CEReactions , ReflectSetter ] attribute unsigned long width ;
[CEReactions , ReflectSetter ] attribute unsigned long height ;
readonly attribute unsigned long naturalWidth ;
readonly attribute unsigned long naturalHeight ;
readonly attribute boolean complete ;
readonly attribute USVString currentSrc ;
[CEReactions ] attribute DOMString referrerPolicy ;
[CEReactions ] attribute DOMString decoding ;
[CEReactions ] attribute DOMString loading ;
[CEReactions ] attribute DOMString fetchPriority ;
Promise <undefined > decode ();
// also has obsolete members
};
img 요소는 이미지를 나타낸다.
img 요소에는 처음에 요소
자체로 설정되는 치수
속성 소스가 있다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
src 및 srcset 속성이 제공하는 이미지와, 부모가
picture 요소인 경우 모든
이전 형제 source 요소의 srcset 속성이 제공하는
이미지는 임베디드 콘텐츠이다. alt 속성의
값은 이미지를 처리할 수 없거나 이미지 로딩을
비활성화한 사람에게 동등한 콘텐츠를 제공한다. 즉, 이는 img 요소의 대체 콘텐츠이다.
alt 속성 값에 대한 요구 사항은
별도의 절에 설명되어 있다.
src 및 srcset 속성 중 하나 이상이
존재해야 한다.
src 속성이 존재하면, 페이지로
나뉘지 않고 스크립트가 적용되지 않은 비대화형 이미지 리소스를 참조하는 공백으로 둘러싸일 수 있는 유효한
비어 있지 않은 URL을 포함해야 한다. 이미지 리소스에는 선택적으로 애니메이션이 적용될 수 있다.
위 요구 사항은 이미지가 정적 비트맵(예: PNG, GIF, JPEG), 단일 페이지 벡터 문서(단일 페이지 PDF, SVG 문서 요소가 있는 XML 파일), 애니메이션 비트맵(APNG, 애니메이션 GIF), 애니메이션 벡터 그래픽(선언적 SMIL 애니메이션을 사용하는 SVG 문서 요소가 있는 XML 파일) 등이 될 수 있음을 뜻한다. 그러나 이러한 정의는 스크립트가 포함된 SVG 파일, 다중 페이지 PDF 파일, 대화형 MNG 파일, HTML 문서, 일반 텍스트 문서 등을 배제한다. [PNG] [GIF] [JPEG] [PDF] [XML] [APNG] [SVG] [MNG]
srcset 속성과 너비 설명자가 사용되지 않는 경우의
src 속성은 source 요소가 선택되지
않은 경우 이미지 소스를
소스 집합에 기여한다.
srcset 속성이 존재하고
너비 설명자를 사용하는 이미지 후보 문자열이 하나라도
있으면 sizes 속성도
존재해야 한다.
srcset 속성이 지정되지
않고 loading 속성이 지연 상태이면, sizes 속성을
"auto" 값으로 지정할 수 있다(ASCII 대소문자
구분 없음). sizes 속성은
sizes 속성이며, source 요소가 선택되지
않은 경우 소스 크기를
소스 집합에 기여한다.
img 요소는 다음 조건을
충족하면 자동 크기를 허용한다:
loading 속성이
지연 상태이고,
sizes 속성의 값이
"auto"와 ASCII
대소문자를 구분하지 않고 일치하거나,
"auto,"로 ASCII
대소문자를 구분하지 않고 시작한다.현재의 모든 엔진에서 지원된다.
crossorigin 속성은
CORS 설정 속성이다. 이
속성의 목적은 교차 출처 접근을 허용하는 타사 사이트의 이미지를 canvas와 함께 사용할 수
있게 하는 것이다.
referrerpolicy
속성은 리퍼러 정책 속성이다. 이
속성의 목적은 이미지를 가져올 때 사용할 리퍼러
정책을 설정하는 것이다.
[REFERRERPOLICY]
decoding
속성은 이 이미지를 디코딩하는 선호 방법을 나타낸다. 속성이 존재하면
이미지 디코딩 힌트여야 한다. 이
속성의 누락 값 기본값과 유효하지 않은 값 기본값은
모두 자동 상태이다.
HTMLImageElement/fetchPriority
fetchpriority
속성은 가져오기 우선순위 속성이다.
이 속성의 목적은 이미지를 가져올 때 사용할 우선순위를
설정하는 것이다.
loading 속성은
지연 로딩 속성이다. 이
속성의 목적은 뷰포트 밖에 있는 이미지를 로드하는 정책을 나타내는 것이다.
loading 속성의 상태가
즉시 로드 상태로
변경되면 사용자 에이전트는 다음 단계를 실행해야 한다:
resumptionSteps를 img 요소의 지연 로드 재개
단계로 둔다.
resumptionSteps가 null이면 반환한다.
img 요소의 지연 로드 재개
단계를 null로 설정한다.
resumptionSteps를 호출한다.
< img src = "1.jpeg" alt = "1" >
< img src = "2.jpeg" loading = eager alt = "2" >
< img src = "3.jpeg" loading = lazy alt = "3" >
< div id = very-large ></ div > <!-- Everything after this div is below the viewport -->
< img src = "4.jpeg" alt = "4" >
< img src = "5.jpeg" loading = lazy alt = "5" >
위 예제에서 이미지는 다음과 같이 로드된다:
1.jpeg, 2.jpeg,
4.jpeg
이미지는 즉시 로드되며 창의 load 이벤트를 지연시킨다.
3.jpeg이미지가 뷰포트 안에 있으므로 레이아웃이 알려지면 로드되지만, 창의 load 이벤트를 지연시키지는 않는다.
5.jpeg이미지는 스크롤되어 뷰포트 안으로 들어온 뒤에만 로드되며, 창의 load 이벤트를 지연시키지 않는다.
개발자는 CSS가 이미지의 너비 및 높이 속성을 설정하더라도, 이미지가 로드된 뒤 페이지
레이아웃이 이동하는 것을 방지하기 위해 지연 로드 이미지에 width 및 height 속성으로 선호 종횡비를
지정하는 것이 권장된다.
insertedNode가 주어졌을 때 img의 HTML 요소 삽입
단계는 다음과 같다:
movedNode, isSubtreeRoot 및 oldAncestor가 주어졌을 때 img의 HTML 요소 이동 단계는
다음과 같다:
removedNode, oldAncestor 및 isSubtreeRoot가 주어졌을 때 img의 HTML 요소 제거
단계는 다음과 같다:
img 요소를 레이아웃 도구로
사용해서는 안 된다. 특히 투명 이미지는 의미를 전달하는 경우가 드물고 문서에 유용한 내용을 추가하는 경우도
드물기 때문에 img 요소를 사용하여 투명
이미지를 표시해서는 안 된다.
img 요소가 나타내는 것은
src 속성과 alt 속성에 따라 달라진다.
src 속성이 설정되어 있고
alt 속성이 빈 문자열로
설정된 경우
이미지는 장식용이거나 나머지 콘텐츠를 보완하며, 문서의 다른 정보와 중복된다.
이미지를 사용할 수 있고 사용자 에이전트가 해당 이미지를 표시하도록 구성되어 있으면 요소는 요소의 이미지 데이터를 나타낸다.
그렇지 않으면 요소는 아무것도 나타내지 않으며 렌더링에서 완전히 생략할 수 있다. 사용자 에이전트는 이미지가 있지만 렌더링에서 생략되었다는 알림을 사용자에게 제공할 수 있다.
src 속성이 설정되어 있고
alt 속성이 비어 있지 않은
값으로 설정된 경우
이미지는 콘텐츠의 핵심 부분이며, alt 속성은 이미지에
대한 텍스트
등가물 또는 대체물을 제공한다.
이미지를 사용할 수 있고 사용자 에이전트가 해당 이미지를 표시하도록 구성되어 있으면 요소는 요소의 이미지 데이터를 나타낸다.
그렇지 않으면 요소는 alt 속성이 제공하는 텍스트를
나타낸다. 사용자 에이전트는 이미지가
있지만 렌더링에서 생략되었다는 알림을 사용자에게 제공할 수 있다.
src 속성이 설정되어 있고
alt 속성이 설정되지 않은
경우
이미지는 콘텐츠의 핵심 부분일 수 있으며, 사용할 수 있는 이미지의 텍스트 등가물이 없다.
적합한 문서에서 alt 속성이
없다는 것은 이미지가
콘텐츠의 핵심 부분이지만 이미지가 생성될 때 이미지의 텍스트 대체물을 사용할 수 없었음을 나타낸다.
이미지를 사용할 수 있고 사용자 에이전트가 해당 이미지를 표시하도록 구성되어 있으면 요소는 요소의 이미지 데이터를 나타낸다.
이미지에 값이 빈 문자열인 src 속성이 있으면 요소는
아무것도 나타내지 않는다.
그렇지 않으면 사용자 에이전트는 렌더링되지 않는 이미지가 있음을 나타내는 일종의 표시기를 보여줘야 하며, 사용자가 요청하거나 그렇게 구성되었거나 내비게이션에 대한 응답으로 맥락 정보를 제공해야 하는 경우 다음과 같이 파생된 이미지 캡션 정보를 제공할 수 있다:
이미지에 값이 빈 문자열이 아닌 title 속성이 있으면 해당
속성의
값을 반환한다.
이미지가 자식 figcaption
요소를 가진 figure 요소의
자손이고, figcaption
요소와 그 자손을 무시했을 때 figure 요소에
요소 간 공백 및 img 요소 이외의
플로 콘텐츠 자손이 없다면, 첫
번째 해당 figcaption
요소의 콘텐츠를 반환한다.
아무것도 반환하지 않는다. 캡션 정보가 없다.
src 속성이 설정되지 않았고
alt 속성이 빈 문자열로
설정되었거나 alt 속성이 전혀 설정되지 않은
경우
요소는 아무것도 나타내지 않는다.
alt 속성은 참고 정보를 나타내지
않는다.
사용자 에이전트는 alt 속성의 콘텐츠를 title 속성의 콘텐츠와 같은 방식으로
표시해서는 안 된다.
사용자 에이전트는 언제든지 사용자가 모든 이미지를 표시하거나 모든 이미지가 표시되지 않도록 하는 옵션을 제공할 수 있다. 또한 시각 장애가 있거나 그래픽 기능이 없는 텍스트 터미널을 사용하는 등의 이유로 사용자가 이미지를 볼 수 없는 경우 이미지를 활용할 수 있도록 휴리스틱을 적용할 수 있다. 이러한 휴리스틱에는 예를 들어 이미지에서 발견된 텍스트에 대한 광학 문자 인식(OCR)이 포함될 수 있다.
사용자 에이전트가 누락된 alt 속성을
복구하는 것이 권장되지만,
작성자는 이러한 동작에 의존해서는 안 된다. 이미지의 대체물로 사용할 텍스트를 제공하기 위한
요구 사항은 아래에 자세히 설명되어 있다.
img 요소의
콘텐츠가 있는 경우에도 렌더링 목적에서는 무시된다.
usemap
속성이 존재하면 이미지에 연관된 이미지 맵이 있음을 나타낼 수 있다.
ismap 속성을
href 속성이 있는
a 요소의 자손인 요소에
사용하면, 이 속성의 존재는 요소가 서버 측 이미지 맵에 대한 접근을 제공함을 나타낸다. 이는 해당 a 요소에서 이벤트를 처리하는
방식에 영향을 준다.
ismap 속성은 불리언 속성이다. href 속성이 있는
조상 a 요소가 없는 요소에는 이 속성을
지정해서는 안 된다.
usemap
및 ismap 속성을 picture 요소 안에서
media 속성이 지정된
source 요소와 함께
사용하면 혼란스러운 동작이 발생할 수 있다.
controls
속성은 불리언 속성이다. 속성이
존재하면 사용자 에이전트가 사용자에게 사용자 인터페이스를 노출할 수 있음을 나타낸다. alt 속성이 없거나 alt 속성 값이 빈 문자열인 요소에는
이 속성을 지정해서는 안 된다.
controls 속성이
존재하면 사용자 에이전트는 이미지에 대한 컨트롤을 노출할 수 있다(예: 전체 화면 보기 컨트롤). 제공되는
구체적인 컨트롤은 구현 정의이며
플랫폼별이거나 사용자의 환경설정에 기반할 수
있다.
사용자 에이전트가 img 요소 위에 컨트롤을
표시하여 사용자 인터페이스를 노출하는 경우, 사용자 에이전트는 사용자가 이 인터페이스와 상호작용하는 동안
모든 사용자 상호작용 이벤트를 억제해야 한다.
이슈 #12318에서는 이미지 컨트롤과 애니메이션 이미지 사이의 상호작용을 추적한다. 이 이슈가 해결되기 전에는 사용자 에이전트가 이미지에 대한 애니메이션 컨트롤을 노출해서는 안 된다.
현재의 모든 엔진에서 지원된다.
crossOrigin IDL 속성은 crossorigin 콘텐츠
속성을 알려진 값으로만 제한하여 반영해야 한다.
HTMLImageElement/referrerPolicy
현재의 모든 엔진에서 지원된다.
referrerPolicy IDL 속성은 referrerpolicy
콘텐츠 속성을 알려진 값으로만
제한하여 반영해야 한다.
현재의 모든 엔진에서 지원된다.
decoding
IDL 속성은 decoding 콘텐츠 속성을
알려진 값으로만 제한하여 반영해야 한다.
현재의 모든 엔진에서 지원된다.
loading
IDL 속성은 loading 콘텐츠 속성을
알려진 값으로만 제한하여 반영해야 한다.
fetchPriority IDL 속성은 fetchpriority 콘텐츠
속성을 알려진 값으로만 제한하여
반영해야 한다.
image.width [ = value ]
현재의 모든 엔진에서 지원된다.
image.height [ = value ]
현재의 모든 엔진에서 지원된다.
이 속성들은 이미지의 실제 렌더링된 치수를 반환하며, 치수를 알 수 없으면 0을 반환한다.
이 속성들을 설정하여 대응하는 콘텐츠 속성을 변경할 수 있다.
image.naturalWidth
현재의 모든 엔진에서 지원된다.
image.naturalHeight
HTMLImageElement/naturalHeight
현재의 모든 엔진에서 지원된다.
이 속성들은 이미지의 밀도 보정 자연 너비와 높이를 반환하며, 이미지를 사용할 수 없으면 0을 반환한다.
image.complete
현재의 모든 엔진에서 지원된다.
이미지가 완전히 다운로드되었거나 이미지가 지정되지 않은 경우 true를 반환하고, 그렇지 않으면 false를 반환한다.
image.currentSrc
현재의 모든 엔진에서 지원된다.
이미지의 절대 URL을 반환한다.
image.decode()
현재의 모든 엔진에서 지원된다.
이 메서드는 사용자 에이전트가 이미지를 병렬로 디코딩하게 하며, 디코딩이 완료되면 이행되는 프로미스를 반환한다.
이미지를 디코딩할 수 없는 경우 프로미스는 "EncodingError"
DOMException으로
거부된다.
image = new Image([ width [, height ] ])
현재의 모든 엔진에서 지원된다.
해당하는 경우 관련 인수로 전달된 값으로 width 및
height 속성이 설정된 새로운
img 요소를 반환한다.
img 요소 image의
치수를 결정하려면:
image를 사용할 수 있고 밀도 보정 자연 너비와 높이가 있으면, 밀도 보정 자연 너비와 높이를 CSS 픽셀 단위로 반환한다.
너비 0과 높이 0을 반환한다.
naturalWidth 및 naturalHeight getter 단계는
다음과 같다:
이미지를 사용할 수 없으면 0을 반환한다.
이미지의 밀도 보정 자연 너비와 높이에서 각각 해당하는 구성 요소를 CSS 픽셀 단위로 반환한다. [CSS]
이미지의 밀도 보정 자연 너비와 높이는 메타데이터에
지정된 모든 방향을 고려하므로, naturalWidth 및
naturalHeight는
'image-orientation' 속성 값과 관계없이 이미지를 올바르게 배치하는
데 필요한 회전을 적용한 후의 치수를 반영한다.
complete
getter 단계는 다음과 같다:
decode() 메서드는
호출되면 다음 단계를 수행해야 한다:
promise를 새 프로미스로 둔다.
다음 단계를 수행하도록 마이크로태스크를 큐에 넣는다:
이미지 데이터 업데이트도 마이크로태스크에서 이루어지기 때문에 이렇게 한다. 따라서 다음과 같은 코드가
img. src = "stars.jpg" ;
img. decode();
stars.jpg를 올바르게 디코딩하도록 하려면 모든 처리를 마이크로태스크 하나만큼
지연해야 한다.
다음 중 하나라도 true이면:
그러면 promise를 "EncodingError"
DOMException으로
거부한다.
그렇지 않으면 병렬로 다음 사례 중 하나가 발생할 때까지 기다린 후 해당하는 동작을 수행한다:
img 요소의
노드 문서가 완전히 활성 상태가 아니게 된다
img 요소의
현재 요청이 변경되거나
변이된다
img 요소의
현재 요청의 상태가 손상됨이 된다
global을 사용해 DOM 조작 태스크 소스에 전역 태스크를 큐에
넣어 promise를
"EncodingError" DOMException으로
거부한다.
img 요소의
현재 요청의 상태가 완전히 사용
가능이 된다
이미지를 디코딩한다.
이 이미지에 디코딩을 수행할 필요가 없거나(예: 벡터 그래픽이기 때문) 디코딩 과정이 성공적으로 완료되면 global을 사용해 DOM 조작 태스크 소스에 전역 태스크를 큐에 넣어 promise를 undefined로 이행한다.
디코딩이 실패하면(예: 유효하지 않은 이미지 데이터로 인해) global을 사용해
DOM 조작 태스크
소스에 전역 태스크를 큐에 넣어
promise를 "EncodingError"
DOMException으로
거부한다.
사용자 에이전트는 디코딩된 미디어 데이터가 적어도 이벤트 루프의 다음 성공적인 렌더링 업데이트 단계가 끝날 때까지 즉시 사용할 수 있는 상태로 유지되도록 해야 한다. 이는 API 계약의 중요한 부분이며 가능한 한 위반해서는 안 된다. 일반적으로 이는 디코딩된 이미지 데이터를 제거해야 하는 메모리 부족 상황이나, 이미지가 이 기간 동안 디코딩된 형태로 유지하기에 너무 큰 경우에만 위반된다.
애니메이션 이미지는 모든 프레임이 로드된 뒤에만 완전히 사용 가능하게 된다. 따라서 구현이 그 시점 전에 첫 번째 프레임을 디코딩할 수 있더라도 위 단계에서는 그렇게 하지 않고 모든 프레임을 사용할 수 있을 때까지 기다린다.
promise를 반환한다.
decode() 메서드가 없다면
img 요소를 로드한 뒤
표시하는 과정은 다음과 같을 수 있다:
const img = new Image();
img. src = "nebula.jpg" ;
img. onload = () => {
document. body. appendChild( img);
};
img. onerror = () => {
document. body. appendChild( new Text( "Could not load the nebula :(" ));
};
그러나 이미지를 DOM에 삽입한 뒤 발생하는 페인트가 메인 스레드에서 동기 디코딩을 유발하므로 눈에 띄게 프레임이 누락될 수 있다.
대신 decode() 메서드를 사용하여
다음과 같이 다시 작성할 수 있다:
const img = new Image();
img. src = "nebula.jpg" ;
img. decode(). then(() => {
document. body. appendChild( img);
}). catch (() => {
document. body. appendChild( new Text( "Could not load the nebula :(" ));
});
후자의 형식은 사용자 에이전트가 이미지를 병렬로 디코딩하고 디코딩 과정이 완료된 뒤에만 DOM에 삽입하여 페인트가 발생하게 함으로써 원래 형식의 프레임 누락을 방지한다.
decode() 메서드는 디코딩된
이미지 데이터를 적어도 한 프레임 동안 사용할 수 있도록 보장하려 하므로 requestAnimationFrame()
API와 결합할 수 있다.
즉, 모든 DOM 수정 사항을 애니메이션 프레임 콜백으로 함께 일괄 처리하도록
보장하는 코딩 스타일이나 프레임워크와 함께 사용할 수 있다:
const container = document. querySelector( "#container" );
const { containerWidth, containerHeight } = computeDesiredSize();
requestAnimationFrame(() => {
container. style. width = containerWidth;
container. style. height = containerHeight;
});
// ...
const img = new Image();
img. src = "supernova.jpg" ;
img. decode(). then(() => {
requestAnimationFrame(() => container. appendChild( img));
});
DOM의 createElement()과
같은 팩터리 메서드 외에 HTMLImageElement
객체를
생성하기 위한 레거시 팩터리 함수 Image(width, height)가 제공된다. 레거시
팩터리
함수는 호출되면 다음 단계를 수행해야 한다:
document를 현재 전역
객체의 연관된
Document로 둔다.
img를 document, "img" 및 HTML 네임스페이스가
주어졌을 때 요소를 생성한 결과로
둔다.
img를 반환한다.
하나의 이미지라도 맥락에 따라 적절한 대체 텍스트가 달라질 수 있다.
다음 각 사례에서는 동일한 이미지를 사용하지만 alt 텍스트는
매번 다르다. 이미지는
스위스 제네바주 카루주 지방 자치체의 문장이다.
여기에서는 보조 아이콘으로 사용한다:
< p > I lived in < img src = "carouge.svg" alt = "" > Carouge.</ p >
여기에서는 도시를 나타내는 아이콘으로 사용한다:
< p > Home town: < img src = "carouge.svg" alt = "Carouge" ></ p >
여기에서는 도시에 관한 텍스트의 일부로 사용한다:
< p > Carouge has a coat of arms.</ p >
< p >< img src = "carouge.svg" alt = "The coat of arms depicts a lion, sitting in front of a tree." ></ p >
< p > It is used as decoration all over the town.</ p >
여기에서는 이미지의 대체물로 설명을 제공하는 대신 이미지와 함께 설명도 제공하는 유사한 텍스트를 지원하는 데 사용한다:
< p > Carouge has a coat of arms.</ p >
< p >< img src = "carouge.svg" alt = "" ></ p >
< p > The coat of arms depicts a lion, sitting in front of a tree.
It is used as decoration all over the town.</ p >
여기에서는 이야기의 일부로 사용한다:
< p > She picked up the folder and a piece of paper fell out.</ p >
< p >< img src = "carouge.svg" alt = "Shaped like a shield, the paper had a
red background, a green tree, and a yellow lion with its tongue
hanging out and whose tail was shaped like an S." ></ p >
< p > She stared at the folder. S! The answer she had been looking for all
this time was simply the letter S! How had she not seen that before? It all
came together now. The phone call where Hector had referred to a lion's tail,
the time Maria had stuck her tongue out...</ p >
여기에서는 게시 시점에 이미지가 무엇이 될지 알 수 없고 어떤 종류의 문장이라는 것만 알 수 있으므로
대체 텍스트를 제공할 수 없다. 대신 이미지의 간략한 캡션만 title
속성에 제공한다:
< p > The last user to have uploaded a coat of arms uploaded this one:</ p >
< p >< img src = "last-uploaded-coat-of-arms.cgi" title = "User-uploaded coat of arms." ></ p >
이상적으로는 작성자가 이전 사용자에게 묻는 등의 방법으로 이 경우에도 실제 대체 텍스트를 제공할 방법을 찾아야 한다. 대체 텍스트를 제공하지 않으면 시각 장애인, 대역폭이 매우 낮은 연결을 사용하는 사용자, 바이트 단위로 요금을 지불하는 사용자 또는 텍스트 전용 웹 브라우저를 사용해야 하는 사용자처럼 이미지를 볼 수 없는 사람이 문서를 사용하기 더 어려워진다.
다음은 같은 그림을 서로 다른 맥락에서 사용하고 매번 적절한 대체 텍스트를 다르게 제공하는 몇 가지 추가 예제이다.
< article >
< h1 > My cats</ h1 >
< h2 > Fluffy</ h2 >
< p > Fluffy is my favorite.</ p >
< img src = "fluffy.jpg" alt = "She likes playing with a ball of yarn." >
< p > She's just too cute.</ p >
< h2 > Miles</ h2 >
< p > My other cat, Miles just eats and sleeps.</ p >
</ article >
< article >
< h1 > Photography</ h1 >
< h2 > Shooting moving targets indoors</ h2 >
< p > The trick here is to know how to anticipate; to know at what speed and
what distance the subject will pass by.</ p >
< img src = "fluffy.jpg" alt = "A cat flying by, chasing a ball of yarn, can be
photographed quite nicely using this technique." >
< h2 > Nature by night</ h2 >
< p > To achieve this, you'll need either an extremely sensitive film, or
immense flash lights.</ p >
</ article >
< article >
< h1 > About me</ h1 >
< h2 > My pets</ h2 >
< p > I've got a cat named Fluffy and a dog named Miles.</ p >
< img src = "fluffy.jpg" alt = "Fluffy, my cat, tends to keep itself busy." >
< p > My dog Miles and I like go on long walks together.</ p >
< h2 > music</ h2 >
< p > After our walks, having emptied my mind, I like listening to Bach.</ p >
</ article >
< article >
< h1 > Fluffy and the Yarn</ h1 >
< p > Fluffy was a cat who liked to play with yarn. She also liked to jump.</ p >
< aside >< img src = "fluffy.jpg" alt = "" title = "Fluffy" ></ aside >
< p > She would play in the morning, she would play in the evening.</ p >
</ article >
이 절은 비규범적이다.
HTML에 이미지를 임베드할 때 이미지 리소스가 하나뿐이면 img
요소와 그 src 속성을 사용한다.
< h2 > From today's featured article</ h2 >
< img src = "/uploads/100-marie-lloyd.jpg" alt = "" width = "100" height = "150" >
< p >< b >< a href = "/wiki/Marie_Lloyd" > Marie Lloyd</ a ></ b > (1870–1922)
was an English < a href = "/wiki/Music_hall" > music hall</ a > singer, ...
그러나 작성자가 사용자 에이전트가 선택할 수 있는 여러 이미지 리소스를 사용하려는 상황이 여러 가지 있다:
사용자마다 환경 특성이 다를 수 있다:
사용자의 물리적 화면 크기가 서로 다를 수 있다.
휴대전화 화면의 대각선 길이는 4인치일 수 있는 반면, 노트북 화면의 대각선 길이는 14 인치일 수 있다.
이는 이미지의 렌더링 크기가 뷰포트 크기에 따라 달라지는 경우에만 관련이 있다.
사용자의 화면 픽셀 밀도가 서로 다를 수 있다.
물리적 화면 크기와 관계없이 한 휴대전화의 화면에는 다른 휴대전화 화면보다 인치당 물리적 픽셀이 세 배 더 많을 수 있다.
사용자의 확대/축소 수준이 서로 다르거나, 한 사용자의 확대/축소 수준이 시간에 따라 달라질 수 있다.
사용자가 특정 이미지를 더 자세히 보기 위해 확대할 수 있다.
확대/축소 수준과 화면 픽셀 밀도(앞의 항목)는 모두 CSS 픽셀당 물리적 화면 픽셀 수에 영향을 줄 수 있다. 이 비율은 일반적으로 기기 픽셀 비율이라고 한다.
사용자의 화면 방향이 서로 다르거나, 한 사용자의 화면 방향이 시간에 따라 달라질 수 있다.
태블릿은 세로로 들거나 90도 회전할 수 있으므로 화면이 "세로 방향" 또는 "가로 방향"이 될 수 있다.
사용자의 네트워크 속도, 네트워크 지연 시간 및 대역폭 비용이 서로 다르거나, 한 사용자에게서 시간에 따라 달라질 수 있다.
사용자는 직장에서는 빠르고 지연 시간이 짧으며 비용이 일정한 연결을 사용하고, 집에서는 느리고 지연 시간이 짧으며 비용이 일정한 연결을 사용하며, 그 밖의 장소에서는 속도와 비용이 가변적이고 지연 시간이 긴 연결을 사용할 수 있다.
작성자는 일반적으로 뷰포트 너비에 따라 동일한 이미지 콘텐츠를 서로 다른 렌더링 크기로 표시하려 할 수 있다. 이를 일반적으로 뷰포트 기반 선택이라고 한다.
웹 페이지 상단에는 항상 전체 뷰포트 너비에 걸치는 배너가 있을 수 있다. 이 경우 이미지의 렌더링 크기는 화면의 물리적 크기에 따라 달라진다 (브라우저 창이 최대화되었다고 가정).
또 다른 웹 페이지에는 열에 이미지가 배치될 수 있다. 물리적 크기가 작은 화면에서는 한 열, 중간 크기 화면에서는 두 열, 큰 화면에서는 세 열을 사용하고, 각 경우 이미지의 렌더링 크기를 달리하여 뷰포트를 채울 수 있다. 이 경우 화면이 더 작더라도 한 열 레이아웃에서 이미지의 렌더링 크기가 두 열 레이아웃보다 더 클 수 있다.
작성자는 이미지의 렌더링 크기에 따라 서로 다른 이미지 콘텐츠를 표시하려 할 수 있다. 이를 일반적으로 아트 디렉션이라고 한다.
물리적 크기가 큰 화면에서 웹 페이지를 볼 때(브라우저 창이 최대화되었다고 가정), 작성자는 이미지의 핵심 부분 주변에 관련성이 낮은 일부 영역을 포함하려 할 수 있다. 동일한 웹 페이지를 물리적 크기가 작은 화면에서 볼 때는 이미지의 핵심 부분만 표시하려 할 수 있다.
작성자는 사용자 에이전트가 지원하는 이미지 형식에 따라 동일한 이미지 콘텐츠를 서로 다른 이미지 형식으로 표시하려 할 수 있다. 이를 일반적으로 이미지 형식 기반 선택이라고 한다.
웹 페이지에는 JPEG, WebP 및 JPEG XR 이미지 형식의 이미지가 있을 수 있으며, 후자의 두 형식은 JPEG보다 압축 능력이 더 우수하다. 사용자 에이전트마다 지원하는 이미지 형식이 다르고 일부 형식은 더 나은 압축률을 제공하므로, 작성자는 이를 지원하는 사용자 에이전트에는 더 나은 형식을 제공하고 그렇지 않은 사용자 에이전트에는 JPEG 대체 항목을 제공하려 한다.
위 상황들은 서로 배타적이지 않다. 예를 들어 서로 다른 기기 픽셀 비율에 대한 서로 다른 리소스와 아트 디렉션에 대한 서로 다른 리소스를 결합하는 것은 합리적이다.
스크립팅을 사용하여 이러한 문제를 해결할 수 있지만, 그렇게 하면 다른 문제들이 발생한다:
일부 사용자 에이전트는 웹 페이지의 로딩을 더 빨리 완료하기 위해 스크립트가 실행될 기회를 얻기 전에 HTML 마크업에 지정된 이미지를 적극적으로 다운로드한다. 스크립트가 다운로드할 이미지를 변경하면 사용자 에이전트가 별도의 다운로드 두 개를 시작할 수 있으며, 이로 인해 오히려 페이지 로딩 성능이 저하될 수 있다.
작성자가 HTML 마크업에 이미지를 전혀 지정하지 않고 스크립트에서 단일 다운로드를 생성하면 위의 이중 다운로드 문제는 피할 수 있지만, 스크립팅이 비활성화된 사용자는 이미지를 전혀 다운로드하지 못하고 적극적인 이미지 다운로드 최적화도 비활성화된다.
이를 고려하여 이 명세는 위 문제를 선언적인 방식으로 해결하기 위한 여러 기능을 도입한다.
img 요소의 src 및 srcset
속성은 x
설명자를 사용하여 크기만 다른 여러 이미지(작은 이미지는 큰 이미지를 축소한 버전)를 제공하는 데 사용할 수
있다.
x 설명자는 이미지의 렌더링
크기가 뷰포트 너비에 따라
달라지는 경우(뷰포트 기반 선택)에는 적절하지
않지만,
아트 디렉션과 함께 사용할 수 있다.
< h2 > From today's featured article</ h2 >
< img src = "/uploads/100-marie-lloyd.jpg"
srcset = "/uploads/150-marie-lloyd.jpg 1.5x, /uploads/200-marie-lloyd.jpg 2x"
alt = "" width = "100" height = "150" >
< p >< b >< a href = "/wiki/Marie_Lloyd" > Marie Lloyd</ a ></ b > (1870–1922)
was an English < a href = "/wiki/Music_hall" > music hall</ a > singer, ...
사용자 에이전트는 사용자의 화면 픽셀 밀도, 확대/축소 수준 및 사용자의 네트워크 상태와 같은 다른 요인에 따라 주어진 리소스 중 어느 것이든 선택할 수 있다.
srcset 속성을 아직 이해하지
못하는 이전 사용자 에이전트와의 하위 호환성을 위해 URL 중 하나를
img 요소의 src 속성에 지정한다. 그러면 이전
사용자 에이전트에서도 유용한 항목이 표시된다(사용자가 원하는 것보다 해상도가 낮을 수는 있다). 새로운
사용자 에이전트에서는 src
속성이 srcset에 1x
설명자와 함께 지정된 것처럼 리소스 선택에 참여한다.
이미지의 렌더링 크기는 width 및
height 속성에 주어지며,
사용자 에이전트는 이를 통해 이미지가 다운로드되기 전에 이미지 공간을 할당할 수 있다.
srcset 및 sizes 속성은
w
설명자를 사용하여 크기만 다른 여러 이미지(작은 이미지는 큰 이미지를 축소한 버전)를 제공하는 데 사용할 수
있다.
이 예제에서는 배너 이미지가 적절한 CSS를 사용하여 전체 뷰포트 너비를 차지한다.
< h1 >< img sizes = "100vw" srcset = "wolf-400.jpg 400w, wolf-800.jpg 800w, wolf-1600.jpg 1600w"
src = "wolf-400.jpg" alt = "The rad wolf" ></ h1 >
사용자 에이전트는 지정된 w 설명자와 sizes 속성에 지정된 렌더링
크기로 각 이미지의 유효 픽셀 밀도를 계산한다. 그런 다음 사용자의 화면 픽셀 밀도, 확대/축소 수준 및
사용자의 네트워크 상태와 같은 다른 요인에 따라 주어진 리소스 중 어느 것이든 선택할 수 있다.
사용자의 화면 너비가 320 CSS 픽셀이면 이는
wolf-400.jpg 1.25x, wolf-800.jpg 2.5x, wolf-1600.jpg 5x를 지정한 것과 같다.
반면 사용자의 화면 너비가 1200 CSS 픽셀이면
이는 wolf-400.jpg 0.33x, wolf-800.jpg 0.67x, wolf-1600.jpg 1.33x를 지정한 것과 같다.
w 설명자와 sizes
속성을 사용하면 사용자 에이전트는 사용자 기기의 크기에 관계없이 다운로드할 올바른 이미지 소스를
선택할 수 있다.
하위 호환성을 위해 URL 중 하나를 img
요소의
src 속성에 지정한다. 새로운
사용자 에이전트에서는 src
속성이 srcset 속성에서
w 설명자를 사용할 때 무시된다.
이 예제에서 웹 페이지에는
뷰포트 너비에 따른 세 가지 레이아웃이 있다. 좁은 레이아웃에는 이미지가
한 열로 배치되고(각 이미지 너비는 약 100%), 중간 레이아웃에는 이미지가 두 열로 배치되며(각 이미지
너비는 약 50%), 가장 넓은 레이아웃에는 이미지가 세 열로 배치되고 페이지 여백도 있다(각 이미지 너비는
약 33%). 이러한 레이아웃은 뷰포트 너비가
각각 30em 및 50em일 때 전환된다.
< img sizes = "(max-width: 30em) 100vw, (max-width: 50em) 50vw, calc(33vw - 100px)"
srcset = "swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
src = "swing-400.jpg" alt = "Kettlebell Swing" >
sizes 속성은
30em 및 50em에 레이아웃 중단점을 설정하고, 이 중단점 사이의 이미지 크기를
100vw, 50vw 또는
calc(33vw - 100px)로 선언한다. 이러한 크기가 CSS에 지정된 실제 이미지 너비와 반드시
정확히 일치할 필요는 없다.
사용자 에이전트는 sizes
속성에서 true로 평가되는 <media-condition>(괄호 안 부분)이 있는 첫 번째 항목을
사용하거나, 모두 false로 평가되는 경우 마지막 항목(calc(33vw -
100px))을 사용하여 너비를 선택한다.
예를 들어 뷰포트 너비가 29em이면 (max-width: 30em)이
true로 평가되고 100vw가 사용되므로 리소스 선택을 위한 이미지 크기는
29em이다. 반대로 뷰포트 너비가 32em이면
(max-width: 30em)은 false로 평가되지만
(max-width: 50em)은 true로 평가되고
50vw가 사용되므로 리소스 선택을 위한 이미지 크기는 16em(뷰포트 너비의 절반)이다.
약간 더 넓은 뷰포트가 다른 레이아웃 때문에 더 작은 이미지를 생성한다는 점에
유의한다.
그런 다음 사용자 에이전트는 앞의 예제와 유사하게 유효 픽셀 밀도를 계산하고 적절한 리소스를 선택할 수 있다.
이 예제는 앞의 예제와 같지만 이미지가 지연
로드된다. 이 경우 sizes 속성에서
auto 키워드를 사용할 수
있으며, 사용자 에이전트는 width
속성(또는 CSS에 지정된 너비)을
소스 크기로 사용한다.
< img loading = "lazy" width = "200" height = "200" sizes = "auto"
srcset = "swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
src = "swing-400.jpg" alt = "Kettlebell Swing" >
auto 키워드를 지원하지
않는 레거시 사용자 에이전트와 더 나은 하위 호환성을 제공하기 위해 필요한 경우 대체 크기를 지정할 수
있다.
< img loading = "lazy" width = "200" height = "200"
sizes = "auto, (max-width: 30em) 100vw, (max-width: 50em) 50vw, calc(33vw - 100px)"
srcset = "swing-200.jpg 200w, swing-400.jpg 400w, swing-800.jpg 800w, swing-1600.jpg 1600w"
src = "swing-400.jpg" alt = "Kettlebell Swing" >
picture 요소와
source 요소를
media
속성과 함께 사용하여 이미지 콘텐츠가 서로 다른 여러 이미지(예를 들어 작은 이미지는 큰 이미지를 자른
버전일 수 있음)를 제공할 수 있다.
< picture >
< source media = "(min-width: 45em)" srcset = "large.jpg" >
< source media = "(min-width: 32em)" srcset = "med.jpg" >
< img src = "small.jpg" alt = "The wolf runs through the snow." >
</ picture >
사용자 에이전트는 media 속성의 미디어
쿼리가 일치하는 첫 번째 source
요소를 선택한
다음, 해당 요소의 srcset 속성에서
적절한
URL을 선택한다.
이미지의 렌더링 크기는 선택된 리소스에 따라 달라진다. 이미지가 다운로드되기 전에 사용자 에이전트가 사용할 수 있는 치수를 지정하려면 CSS를 사용할 수 있다.
img { width : 300 px ; height : 300 px }
@media ( min-width: 32em) { img { width: 500px; height:300px } }
@media (min-width: 45em) { img { width: 700px; height:400px } }
source 요소의
type 속성을 사용하여
서로 다른 형식의 여러 이미지를 제공할 수 있다.
< h2 > From today's featured article</ h2 >
< picture >
< source srcset = "/uploads/100-marie-lloyd.webp" type = "image/webp" >
< source srcset = "/uploads/100-marie-lloyd.jxr" type = "image/vnd.ms-photo" >
< img src = "/uploads/100-marie-lloyd.jpg" alt = "" width = "100" height = "150" >
</ picture >
< p >< b >< a href = "/wiki/Marie_Lloyd" > Marie Lloyd</ a ></ b > (1870–1922)
was an English < a href = "/wiki/Music_hall" > music hall</ a > singer, ...
이 예제에서 사용자 에이전트는 지원되는 MIME 유형을 가진 type 속성이 있는 첫 번째
소스를 선택한다. 사용자 에이전트가 WebP 이미지를 지원하면 첫 번째 source 요소가
선택된다. 지원하지 않지만 JPEG XR 이미지를 지원하면 두 번째 source 요소가
선택된다.
두 형식 모두 지원하지 않으면 img 요소가
선택된다.
이 절은 비규범적이다.
CSS와 미디어 쿼리를 사용하여 사용자 환경, 특히 서로 다른 뷰포트 치수와 픽셀
밀도에 동적으로 적응하는 그래픽 페이지 레이아웃을 구성할 수 있다. 그러나 콘텐츠에는 CSS가 도움이 되지
않는다. 대신 img 요소의
srcset 속성과 picture 요소를 사용한다.
이 절에서는 이러한 기능을 사용하는 방법을 보여주는 예제 사례를 단계별로 살펴본다.
넓은 화면(600 CSS
픽셀보다 넓음)에서는 a-rectangle.png라는 이름의 300×150 이미지를 사용하고,
더 작은 화면(600 CSS
픽셀 이하)에서는
a-square.png라는 이름의 더 작은 100×100 이미지를 사용하는 상황을 생각해 보자. 이에 대한
마크업은 다음과 같다:
< figure >
< picture >
< source srcset = "a-square.png" media = "(max-width: 600px)" >
< img src = "a-rectangle.png" alt = "Barney Frank wears a suit and glasses." >
</ picture >
< figcaption > Barney Frank, 2011</ figcaption >
</ figure >
alt
속성에 넣을 내용에 대한 자세한 내용은 이미지의 대체물로 사용할 텍스트를 제공하기 위한
요구 사항 절을 참조한다.
이 방식의 문제점은 이미지가 로드되는 동안 사용자 에이전트가 이미지에 사용할 치수를 반드시 알 수 있는 것은 아니라는 점이다. 페이지가 로드되는 동안 레이아웃을 여러 번 리플로해야 하는 상황을 피하기 위해 CSS와 CSS 미디어 쿼리를 사용하여 치수를 제공할 수 있다:
< style >
# a { width : 300 px ; height : 150 px ; }
@ media ( max-width : 600px ) { # a { width : 100 px ; height : 100 px ; } }
</ style >
< figure >
< picture >
< source srcset = "a-square.png" media = "(max-width: 600px)" >
< img src = "a-rectangle.png" alt = "Barney Frank wears a suit and glasses." id = "a" >
</ picture >
< figcaption > Barney Frank, 2011</ figcaption >
</ figure >
또는 source 및
img 요소에서 width 및 height 속성을 사용하여 너비와
높이를 제공할 수 있다:
< figure >
< picture >
< source srcset = "a-square.png" media = "(max-width: 600px)" width = "100" height = "100" >
< img src = "a-rectangle.png" width = "300" height = "150"
alt = "Barney Frank wears a suit and glasses." >
</ picture >
< figcaption > Barney Frank, 2011</ figcaption >
</ figure >
img 요소는
picture 요소를
지원하지 않는 레거시 사용자 에이전트에서 사용할 이미지의 URL을 제공하는
src 속성과 함께 사용된다. 이로 인해
src 속성에 어떤 이미지를 제공해야
하는지에 대한 의문이 생긴다.
작성자가 레거시 사용자 에이전트에서 가장 큰 이미지를 사용하려 한다면 마크업은 다음과 같을 수 있다:
< picture >
< source srcset = "pear-mobile.jpeg" media = "(max-width: 720px)" >
< source srcset = "pear-tablet.jpeg" media = "(max-width: 1280px)" >
< img src = "pear-desktop.jpeg" alt = "The pear is juicy." >
</ picture >
그러나 레거시 모바일 사용자 에이전트가 더 중요하다면 세 이미지를 모두
source 요소에
나열하여 src 속성을 완전히
재정의할 수 있다.
< picture >
< source srcset = "pear-mobile.jpeg" media = "(max-width: 720px)" >
< source srcset = "pear-tablet.jpeg" media = "(max-width: 1280px)" >
< source srcset = "pear-desktop.jpeg" >
< img src = "pear-mobile.jpeg" alt = "The pear is juicy." >
</ picture >
이 시점에는 src 속성이 실제로
picture를 지원하는 사용자
에이전트에서 완전히 무시되므로, src 속성의 기본값은 가장 작거나
가장 큰 이미지가 아닌 이미지를 포함하여 어떤 이미지든 될 수 있다:
< picture >
< source srcset = "pear-mobile.jpeg" media = "(max-width: 720px)" >
< source srcset = "pear-tablet.jpeg" media = "(max-width: 1280px)" >
< source srcset = "pear-desktop.jpeg" >
< img src = "pear-tablet.jpeg" alt = "The pear is juicy." >
</ picture >
위에서는 이미지가 사용될 최대
(뷰포트) 치수를 제공하는 max-width 미디어 기능을 사용했다.
대신 min-width를 사용할 수도 있다.
< picture >
< source srcset = "pear-desktop.jpeg" media = "(min-width: 1281px)" >
< source srcset = "pear-tablet.jpeg" media = "(min-width: 721px)" >
< img src = "pear-mobile.jpeg" alt = "The pear is juicy." >
</ picture >
source,
img
및 link
요소에 공통인 속성
srcset 속성은 이 절에 정의된 요구 사항을 가진 속성이다.
존재하는 경우 그 값은 하나 이상의 이미지 후보 문자열로 구성되어야 하며, 각 문자열은 다음 문자열과 U+002C COMMA 문자(,)로 구분된다. 이미지 후보 문자열에 설명자가 없고 URL 뒤에 ASCII 공백이 없으면, 뒤따르는 이미지 후보 문자열이 있는 경우 하나 이상의 ASCII 공백으로 시작해야 한다.
이미지 후보 문자열은 아래 목록에 설명된 추가 제한을 따르며 다음 구성 요소로 순서대로 이루어진다:
0개 이상의 ASCII 공백.
U+002C COMMA 문자(,)로 시작하거나 끝나지 않으며, 페이지로 나뉘지 않고 스크립트가 적용되지 않은 비대화형 이미지 리소스를 참조하는 유효한 비어 있지 않은 URL. 이미지 리소스에는 선택적으로 애니메이션이 적용될 수 있다.
0개 이상의 ASCII 공백.
다음 중 0개 또는 1개:
너비 설명자. 다음으로 구성된다: ASCII 공백, 0보다 큰 수를 제공하고 너비 설명자 값을 나타내는 유효한 음이 아닌 정수, U+0077 LATIN SMALL LETTER W 문자.
픽셀 밀도 설명자. 다음으로 구성된다: ASCII 공백, 0보다 큰 수를 제공하고 픽셀 밀도 설명자 값을 나타내는 유효한 부동 소수점 수, U+0078 LATIN SMALL LETTER X 문자.
0개 이상의 ASCII 공백.
한 요소에 대해 다른 이미지 후보 문자열의 너비 설명자 값과 동일한 너비 설명자 값을 가진 이미지 후보 문자열이 있어서는 안 된다.
한 요소에 대해 다른 이미지 후보 문자열의
픽셀 밀도
설명자 값과 동일한 픽셀
밀도
설명자 값을 가진 이미지
후보 문자열이 있어서는 안 된다. 이 요구 사항의 목적상 설명자가 없는 이미지 후보
문자열은 1x 설명자가 있는
이미지 후보 문자열과
같다.
한 요소의 이미지 후보 문자열에 너비 설명자가 지정되면 해당 요소의 다른 모든 이미지 후보 문자열에도 너비 설명자가 지정되어야 한다.
이미지 후보 문자열의 너비 설명자에 지정된 너비는 이미지 후보 문자열의 URL이 제공하는 리소스에 자연 너비가 있는 경우 그 리소스의 자연 너비와 일치해야 한다.
요소에 sizes 속성이 존재하면 해당 요소의 모든 이미지 후보 문자열에 너비 설명자가 지정되어야 한다.
sizes 속성은 이 절에 정의된 요구 사항을 가진 속성이다.
존재하는 경우 그 값은 유효한 소스 크기 목록이어야 한다.
유효한 소스 크기 목록은 다음 문법과 일치하는 문자열이다: [CSSVALUES] [MQ]
< source-size-list > = < source-size > #? , < source-size-value >
< source-size > = < media-condition > < source-size-value > | auto
< source-size-value > = < length > | auto
<source-size-value>가 <length>인 경우 음수여서는 안 되며, 수학 함수 이외의 CSS 함수를 사용해서는 안 된다.
auto 키워드는 sizes 속성 구문 분석에서
계산되는 너비이다. 존재하는 경우 첫 번째 항목이어야 하며 전체 <source-size-list> 값은
문자열 "auto"와 ASCII
대소문자를 구분하지 않고 일치하거나 문자열 "auto,"로 ASCII 대소문자를
구분하지 않고 시작해야 한다.
이미지 데이터
업데이트 또는 환경
변화에 반응 알고리즘으로 이미지 로딩을 시작한 img 요소가
자동 크기를 허용하고 렌더링 중이면, auto는 구체적 객체 크기의 너비이다.
그렇지 않으면 auto 값이 무시되고, 다음
소스 크기가 있으면 대신 사용된다.
다음 조건을 충족하는 경우 source 요소의
sizes 속성과 img 요소의 sizes 속성에 auto 키워드를 지정할 수
있다. 그렇지 않으면 auto를 지정해서는 안
된다.
요소가 img 요소이다.
위 조건 중 하나에서 참조된 img 요소가 자동 크기를 허용한다.
또한 width 및 height 속성이나 CSS를 사용하여
치수를 지정하는 것이 강력히 권장된다. 치수가 지정되지 않으면 sizes="auto"가 렌더링 절에서 contain-intrinsic-size: 300px
150px를 의미하므로 이미지가 300x150 치수로 렌더링될 가능성이 높다.
<source-size-value>는 이미지의 의도된 레이아웃 너비를 제공한다. 작성자는 <media-condition>을 사용하여 서로 다른 환경에 서로 다른 너비를 지정할 수 있다.
무엇을 기준으로 한 백분율인지에 관한 혼동을 피하기 위해 <source-size-value>에는 백분율을 사용할 수 없다. 'vw' 단위는 뷰포트 너비에 상대적인 크기에 사용할 수 있다.
img 요소에는 현재 요청과 대기 중인 요청이 있다.
현재 요청은 처음에 새로운
이미지 요청으로 설정된다.
대기 중인 요청은 처음에
null로 설정된다.
이미지 요청에는 상태, 현재 URL 및 이미지 데이터가 있다.
이미지 요청의 이미지 데이터는 디코딩된 이미지 데이터이다.
이미지 요청의 상태가 부분적으로 사용 가능 또는 완전히 사용 가능이면, 해당 이미지 요청을 사용 가능하다고 한다.
img 요소의 현재 요청을 사용할 수 있으면, img 요소는 너비가
이미지의 밀도 보정 자연 너비(있는
경우)이고, 높이가 이미지의 밀도 보정 자연 높이(있는
경우)이며, 외형이 이미지의 자연스러운 외형인 페인트
소스를 제공한다.
각 img 요소에는
마지막으로 선택된 소스가 있으며, 처음에는 null이어야 한다.
각 이미지 요청에는 현재 픽셀 밀도가 있으며, 처음에는 1이어야 한다.
각 이미지 요청에는 선호 밀도 보정 치수가 있으며, 이는 너비와 높이로 구성된 구조체 또는 null이다. 처음에는 null이어야 한다.
img 요소
img의 밀도 보정
자연 너비와 높이를 결정하려면:
dimensions를 img의 현재 요청의 선호 밀도 보정 치수로 둔다.
선호 밀도 보정 치수는 이미지의 메타 정보를 기반으로 표시할 이미지 준비 알고리즘에서 설정된다.
dimensions가 null이 아니면 dimensions의 너비를 dimensions의 너비를 density로 나눈 값으로 설정하고, dimensions의 높이를 dimensions의 높이를 density로 나눈 값으로 설정한 다음 dimensions를 반환한다.
intrinsicWidth, intrinsicHeight 및 intrinsicRatio를 각각 img의 자연 너비, 자연 높이 및 자연 종횡비가 있는 경우 그 값으로 둔다.
intrinsicWidth가 부재하지 않으면 intrinsicWidth를 intrinsicWidth를 density로 나눈 값으로 설정한다.
intrinsicHeight가 부재하지 않으면 intrinsicHeight를 intrinsicHeight를 density로 나눈 값으로 설정한다.
intrinsicWidth, intrinsicHeight 및 intrinsicRatio를 사용하고 300×150의 기본 객체 크기를 사용하여 기본 크기 조정 알고리즘을 적용한 결과를 반환한다.
예를 들어 현재 픽셀 밀도가 3.125이면 이는 CSS 인치당 기기 픽셀이 300개 있다는 의미이므로, 이미지 데이터가 300x600이면 밀도 보정 자연 너비와 높이는 96 CSS 픽셀×192 CSS 픽셀이다.
모든 img 및 link 요소는 소스 집합과 연관된다.
소스 집합은 0개 이상의 이미지 소스로 구성된 순서 있는 집합과 소스 크기이다.
이미지 소스는 URL이며, 선택적으로 픽셀 밀도 설명자 또는 너비 설명자 중 하나를 가진다.
소스 크기는 <source-size-value>이다.
소스 크기에 뷰포트에 상대적인 단위가 있으면
img 요소의 노드 문서의
뷰포트에 상대적으로 해석해야 한다. 다른 단위는 미디어 쿼리에서와 동일하게
해석해야 한다.
[MQ]
이 절의 알고리즘에서 구문 분석 오류는 입력과 요구 사항 간의 치명적이지 않은 불일치를 나타낸다. 사용자 에이전트는 어떤 방식으로든 구문 분석 오류를 노출하는 것이 권장된다.
이미지의 유형과 유효한 이미지인지 여부를 결정할 때 이미지 가져오기의 성공 여부(예: 응답 상태가 정상 상태였는지 여부)는 무시해야 한다.
이를 통해 서버가 오류 응답과 함께 이미지를 반환해도 해당 이미지가 표시될 수 있다.
사용자 에이전트는 이미지의 유형을 결정하기 위해 이미지 스니핑 규칙을 적용해야 하며, 이미지의 연관된 Content-Type 헤더가 공식 유형을 제공한다. 이 규칙을 적용하지 않으면 이미지 유형은 이미지의 연관된 Content-Type 헤더가 제공하는 유형이어야 한다.
사용자 에이전트는 img 요소에서 이미지가
아닌 리소스(예: 문서 요소가 HTML 요소인 XML 파일)를 지원해서는 안 된다. 사용자
에이전트는 이미지 리소스에 임베드된 실행 가능한 코드(예: 스크립트)를 실행해서는 안 된다. 사용자 에이전트는
여러 페이지로 구성된 리소스(예: PDF 파일)의 첫 번째 페이지만 표시해야 한다. 사용자 에이전트는 리소스가
대화형으로 동작하도록 허용해서는 안 되지만 리소스의 애니메이션은 존중해야 한다.
이 명세는 어떤 이미지 유형을 지원해야 하는지 지정하지 않는다.
기본적으로 이미지는 즉시 가져온다. 사용자 에이전트는 사용자에게 필요할 때 대신 가져오도록 하는 옵션을 제공할 수 있다. (예를 들어 대역폭에 제약이 있는 사용자가 필요할 때 가져오기 옵션을 사용할 수 있다.)
이미지를 즉시 가져올 때 사용자 에이전트는 해당 요소가 생성되거나 관련 변이를 겪을 때마다, 그렇게
명시된 경우 애니메이션 재시작 플래그를 설정하여 img
요소의 이미지
데이터를 업데이트해야 한다.
이미지를 필요할 때 가져올 때 사용자 에이전트는 이미지 데이터가 필요할 때마다(즉, 필요할 때)
img 요소의
이미지 데이터를 업데이트해야 하지만, 이는
img 요소의 현재 요청의 상태가 사용
불가인 경우에만 해당한다. img
요소가
관련 변이를 겪었고,
사용자 에이전트가 이미지를 필요할 때만 가져오는 경우 img 요소의 현재 요청의 상태는 사용
불가로 돌아가야 한다.
img 요소에 대한
관련 변이는 다음과 같다:
요소의 src
속성이 이전 값과 동일한 값으로 설정된 경우.
이는 이미지 데이터 업데이트
알고리즘에 대해
애니메이션 재시작 플래그를 설정해야 한다.
요소의 crossorigin
속성의 상태가 변경된 경우.
요소의 referrerpolicy
속성의
상태가 변경된 경우.
img 또는 source의 HTML
요소 삽입 단계,
HTML 요소
제거 단계 및 HTML 요소 이동 단계가 해당 변이를
관련
변이로 간주하는 경우.
요소의 부모가 picture 요소이고,
이전 형제인 source 요소의
srcset, sizes, media, type, width 또는 height 속성이 설정,
변경 또는 제거된 경우.
요소의 입양 단계가 실행된 경우.
요소가 자동 크기를 허용하는 경우: 요소가 렌더링되기 시작하거나 중지되거나, 요소의 구체적 객체 크기 너비가 변경된 경우. 이는 이미지 데이터 업데이트 알고리즘에 대해 이벤트를 생략할 수 있음 플래그를 설정해야 한다.
각 Document 객체에는
사용 가능한 이미지 목록이 있어야 한다. 이 목록의 각 이미지는
절대 URL,
CORS
설정 속성 모드, 그리고 모드가 CORS
없음이 아닌 경우 출처로 구성된 튜플로 식별된다.
또한 각 이미지에는 상위 계층 캐싱 무시 플래그가 있다.
사용자 에이전트는 언제든지 한 Document
객체의 사용 가능한
이미지 목록에서 다른 객체로 항목을 복사할 수 있다(예: Document가 생성될 때 사용자
에이전트는 다른 Document들에 로드된 모든
이미지를 추가할 수 있다). 그러나 이렇게 복사할 때 복사된 항목의 키를 변경해서는 안 되며,
복사된 항목의 상위 계층
캐싱 무시 플래그를 해제해야 한다.
사용자 에이전트는 언제든지 이러한 목록에서 이미지를 제거할 수도 있다(예: 메모리를 절약하기 위해).
사용자 에이전트는 상위
계층 캐싱 무시 플래그가 해제된 경우 리소스에 대한 상위 계층 캐싱 의미 체계(예: HTTP `Cache-Control`
응답 헤더)에 따라 적절하게 사용
가능한 이미지 목록의 항목을
제거해야 한다.
사용
가능한 이미지 목록은 이전에 로드한
URL로 src 속성을 변경할 때
동기적으로 전환할 수 있도록 하고, HTTP에 따라 캐싱을 허용하지 않더라도 같은 문서에서 이미지를 다시
다운로드하지 않도록 하기 위한 것이다. 이전 이미지가 아직 로드 중인 동안 동일한 이미지를 다시 다운로드하지
않도록 하기 위해 사용되는 것은 아니다.
사용자 에이전트는 이미지 데이터를 사용 가능한 이미지 목록과 별도로 저장할 수도 있다.
예를 들어 리소스에 HTTP 응답 헤더
`Cache-Control: must-revalidate`가 있고 상위 계층
캐싱 무시 플래그가 해제되어 있으면 사용자 에이전트는 해당 리소스를 사용 가능한
이미지 목록에서 제거하지만 이미지 데이터는 별도로 유지할 수 있으며, 서버가
304 Not Modified 상태로 응답하면 이를 사용할 수 있다.
이미지 데이터는 일반적으로 파일 크기를 줄이기 위해 인코딩된다. 이는 사용자 에이전트가 이미지를 화면에 표시하려면 데이터를 디코딩해야 한다는 뜻이다. 디코딩은 이미지의 미디어 데이터를 화면에 표시하기에 적합한 비트맵 형태로 변환하는 과정이다. 이 과정은 콘텐츠 표시와 관련된 다른 과정에 비해 느릴 수 있다는 점에 유의한다. 따라서 사용자 에이전트는 최상의 사용자 경험을 만들기 위해 디코딩을 수행할 시점을 선택할 수 있다.
이미지 디코딩이 완료될 때까지 다른 콘텐츠의 표시를 막으면 동기식이라고 한다. 일반적으로 이는 이미지와 다른 콘텐츠를 동시에 원자적으로 표시하는 효과가 있다. 그러나 이러한 표시는 디코딩에 걸리는 시간만큼 지연된다.
이미지 디코딩이 다른 콘텐츠의 표시를 막지 않으면 비동기식이라고 한다. 이는 이미지가 아닌 콘텐츠를 더 빠르게 표시하는 효과가 있다. 그러나 디코딩이 완료될 때까지 화면에는 이미지 콘텐츠가 없다. 디코딩이 완료되면 이미지로 화면이 업데이트된다.
동기 및 비동기 디코딩 모드 모두에서 같은 시간이 경과한 뒤 최종 콘텐츠가 화면에 표시된다. 주요 차이점은 사용자 에이전트가 최종 콘텐츠를 표시하기 전에 이미지가 아닌 콘텐츠를 먼저 표시하는지 여부이다.
사용자 에이전트가 동기 또는 비동기 디코딩을 수행할지 결정하는 데 도움을 주기 위해 img 요소에 decoding 속성을 설정할 수
있다. decoding 속성에 사용할 수
있는 값은 다음 이미지 디코딩
힌트 키워드이다:
| 키워드 | 상태 | 설명 |
|---|---|---|
sync
|
동기 | 다른 콘텐츠와 원자적으로 표시하기 위해 이 이미지를 동기적으로 디코딩하는 것을 선호함을 나타낸다. |
async
|
비동기 | 다른 콘텐츠의 표시가 지연되는 것을 피하기 위해 이 이미지를 비동기적으로 디코딩하는 것을 선호함을 나타낸다. |
auto
|
자동 | 디코딩 모드에 대한 선호가 없음을 나타낸다(기본값). |
이미지를 디코딩할 때 사용자
에이전트는 decoding
속성의 상태가 나타내는 선호를 존중해야 한다. 표시된 상태가 자동이면 사용자 에이전트는 어떤 디코딩 동작이든
자유롭게 선택할 수 있다.
decode() 메서드를 사용하여 디코딩
동작을 제어할 수도 있다. decode() 메서드는 콘텐츠를
화면에 표시하는 과정과 독립적으로 디코딩을 수행하므로 decoding 속성의 영향을
받지 않는다.
이 알고리즘은 병렬로 실행 중인 단계에서 호출할 수 없다. 사용자 에이전트가 병렬로 실행 중인 단계에서 이 알고리즘을 호출해야 하는 경우, 이를 수행하도록 태스크를 큐에 넣어야 한다.
사용자 에이전트가 img 요소의
이미지 데이터를 업데이트할 때, 선택적으로
애니메이션 재시작 플래그를 설정하고 선택적으로 이벤트를 생략할 수 있음 플래그를
설정하여 다음 단계를 실행해야 한다:
이 알고리즘을 병렬로 계속 실행한다.
이 img 요소에 대한
이 알고리즘의 다른 인스턴스가 이 인스턴스보다 나중에 시작되었으면
(중단되어 더 이상 실행 중이 아니더라도) 반환한다.
이 알고리즘을 계속하도록 마이크로태스크를 큐에 넣는다.
사용자 에이전트가 이미지를 지원할 수 없거나 이미지 지원이 비활성화되었으면 현재 요청과 대기 중인 요청에 대한 이미지 요청을 중단하고, 현재 요청의 상태를 사용 불가로 설정하고, 대기 중인 요청을 null로 설정한 뒤 반환한다.
selected source를 null로, selected pixel density를 undefined로 둔다.
요소가 srcset
또는 picture를
사용하지 않고, 값이 빈 문자열이 아닌 src 속성이 지정되어 있으면
selected source를 요소의 src 속성 값으로
설정하고 selected pixel density를 1.0으로 설정한다.
요소의 마지막으로 선택된 소스를 selected source로 설정한다.
selected source가 null이 아니면:
urlString을 selected source와 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석하고 직렬화한 결과로 둔다.
urlString이 실패이면 이 내부 단계 집합을 중단한다.
key를 urlString, img
요소의 crossorigin
속성 모드, 그리고 해당 모드가 CORS
없음이 아닌 경우 노드
문서의 출처로
구성된 튜플로 둔다.
사용 가능한 이미지 목록에 key에 대한 항목이 있으면:
해당 항목의 상위 계층 캐싱 무시 플래그를 설정한다.
현재 요청과 대기 중인 요청에 대한 이미지 요청을 중단한다.
대기 중인 요청을 null로 설정한다.
현재 요청을 이미지 데이터가 해당 항목의 이미지 데이터이고 상태가 완전히 사용 가능인 새로운 이미지 요청으로 설정한다.
img 요소가
주어졌을 때 현재
요청을 표시하도록 준비한다.
img 요소와
다음 단계가 주어졌을 때 DOM 조작 태스크 소스에
요소 태스크를 큐에
넣는다:
이미지 데이터 업데이트 알고리즘을 중단한다.
이 알고리즘을 호출한 태스크가 계속될 수 있도록 이 알고리즘의 나머지 부분을 수행할 마이크로태스크를 큐에 넣는다.
이 img 요소에 대한
이 알고리즘의 다른 인스턴스가 이 인스턴스보다 나중에 시작되었으면
(중단되어 더 이상 실행 중이 아니더라도) 반환한다.
예를 들어 src,
srcset
및 crossorigin
속성이 연속해서 모두 설정될 때 여러 요청이 발생하지 않도록 마지막 인스턴스만 적용된다.
selected source와 selected pixel density를 각각 이미지 소스를 선택한 결과인 URL과 픽셀 밀도로 둔다.
selected source가 null이면:
현재 요청의 상태를 손상됨으로 설정하고, 현재 요청과 대기 중인 요청에 대한 이미지 요청을 중단한 뒤, 대기 중인 요청을 null로 설정한다.
img 요소와
다음 단계가 주어졌을 때 DOM 조작 태스크 소스에
요소 태스크를 큐에 넣는다:
반환한다.
urlString을 selected source와 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석하고 직렬화한 결과로 둔다.
urlString이 실패이면:
현재 요청과 대기 중인 요청에 대한 이미지 요청을 중단한다.
대기 중인 요청을 null로 설정한다.
img 요소와
다음 단계가 주어졌을 때 DOM 조작 태스크
소스에 요소 태스크를 큐에
넣는다:
반환한다.
urlString이 현재 요청의 현재 URL과 같고 현재 요청의 상태가 부분적으로 사용 가능이면:
대기 중인 요청에 대한 이미지 요청을 중단한다.
애니메이션 재시작이 설정되어 있으면 img 요소가
주어졌을 때 DOM
조작 태스크 소스에 요소
태스크를 큐에 넣어 애니메이션을
재시작한다.
반환한다.
대기 중인 요청에 대한 이미지 요청을 중단한다.
현재 요청의 상태가 사용 불가 또는 손상됨이면 현재 요청을 image request로 설정한다. 그렇지 않으면 대기 중인 요청을 image request로 설정한다.
request를 urlString, "image" 및 요소의 crossorigin
콘텐츠 속성의 현재 상태가 주어졌을 때 잠재적 CORS 요청을 생성한 결과로
둔다.
요소가 srcset
또는
picture를 사용하면 request의 개시자를
"imageset"으로 설정한다.
request의 리퍼러
정책을 요소의 referrerpolicy
속성의 현재 상태로 설정한다.
request의 우선순위를
요소의 fetchpriority
속성의 현재 상태로 설정한다.
delay load event를 img의 지연 로딩
속성이 즉시 로드
상태이거나, img에 대해
스크립팅이 비활성화되어 있으면 true로, 그렇지
않으면 false로 둔다.
img가 주어졌을 때
요소를 지연 로드할지
결정하는 단계가
true를 반환하면:
img의
지연 로드
재개 단계를 이미지 가져오기라고 표시된 단계부터 시작하는 이 알고리즘의 나머지 부분으로
설정한다.
img 요소에
대해 지연 로딩 요소의
교차 관찰을 시작한다.
반환한다.
이미지 가져오기: request를 가져온다. 이 알고리즘에서 반환하고, 나머지 단계를 응답 response에 대한 가져오기의 processResponse의 일부로 실행한다.
이 방식으로 얻은 리소스가 있는 경우 이는 image request의 이미지 데이터이다. 이는 CORS 동일 출처 또는
CORS 교차 출처일 수
있으며, 이는 이미지가 다른 API와 상호작용하는 방식에 영향을 준다(예:
canvas에서
사용될 때).
delay load event가 true이면 이미지 가져오기는 리소스를 가져온 뒤 (아래에 정의됨) 네트워킹 태스크 소스가 큐에 넣은 태스크가 실행될 때까지 요소의 노드 문서의 load 이벤트를 지연해야 한다.
안타깝게도 이를 사용하여 사용자의 로컬 네트워크에 대한 기초적인 포트 스캔을 수행할 수 있다(특히 스크립팅과 함께 사용할 때이지만, 실제로 이러한 공격을 수행하는 데 스크립팅이 필요한 것은 아니다). 사용자 에이전트는 이 공격을 완화하기 위해 위에 설명된 것보다 더 엄격한 교차 출처 접근 제어 정책을 구현할 수 있지만, 안타깝게도 이러한 정책은 일반적으로 기존 웹 콘텐츠와 호환되지 않는다.
가능한 한 빨리 다음 목록에서 처음으로 적용되는 항목으로 이동한다:
multipart/x-mixed-replace인
경우
이미지를 가져오는 동안 네트워킹 태스크 소스가 다음으로 큐에 넣는 태스크는 다음 단계를 실행해야 한다:
image request가 대기 중인 요청이고 본문 부분 하나 이상이 완전히 디코딩되었으면 현재 요청에 대한 이미지 요청을 중단하고 대기 중인 요청을 현재 요청으로 승격한다.
그렇지 않고 image request가 대기 중인 요청이며 사용자 에이전트가 image request의 이미지가 이미지 치수를 얻을 수 없을 정도로 치명적으로 손상되었다고 판단할 수 있으면 현재 요청에 대한 이미지 요청을 중단하고, 대기 중인 요청을 현재 요청으로 승격한 뒤, 현재 요청의 상태를 손상됨으로 설정한다.
그렇지 않고 image request가 현재 요청이며, 그 상태가 사용 불가이고, 사용자 에이전트가 image request 이미지의 너비와 높이를 결정할 수 있으면 현재 요청의 상태를 부분적으로 사용 가능으로 설정한다.
그렇지 않고 image request가 현재 요청이며, 그 상태가 사용 불가이고, 사용자 에이전트가 image request의 이미지가 이미지 치수를 얻을 수 없을 정도로 치명적으로 손상되었다고 판단할 수 있으면 현재 요청의 상태를 손상됨으로 설정한다.
이미지를 가져오는 동안 네트워킹
태스크
소스가 큐에 넣는 각 태스크는 이미지 표시를
업데이트해야 한다. 새 본문 부분이 들어올 때마다 사용자 에이전트가 이미지의 너비와 높이를 결정할
수 있으면 img 요소가
주어졌을 때 img 요소의
현재 요청을 표시하도록 준비하고 이전 이미지를 대체해야 한다.
본문 부분 하나가 완전히 디코딩되면 다음 단계를 수행한다:
이벤트를 생략할 수 있음이 설정되어 있지 않거나 previousURL이
urlString과 같지 않으면 img
요소가 주어졌을 때 DOM
조작 태스크 소스에 요소 태스크를 큐에 넣어 img
요소에 load라는
이름의 이벤트를
발생시킨다.
이미지를 가져오는 동안 네트워킹 태스크 소스가 다음으로 큐에 넣는 태스크는 다음 단계를 실행해야 한다:
사용자 에이전트가 image request 이미지의 너비와 높이를 결정할 수 있고 image request가 대기 중인 요청이면 image request의 상태를 부분적으로 사용 가능으로 설정한다.
그렇지 않고 사용자 에이전트가 image request 이미지의 너비와 높이를 결정할 수
있으며 image request가 현재 요청이면, img 요소가
주어졌을 때 image request를
표시하도록 준비하고 image request의
상태를 부분적으로
사용 가능으로 설정한다.
그렇지 않고 사용자 에이전트가 image request의 이미지가 이미지 치수를 얻을 수 없을 정도로 치명적으로 손상되었다고 판단할 수 있으며 image request가 대기 중인 요청이면:
현재 요청과 대기 중인 요청에 대한 이미지 요청을 중단한다.
그렇지 않고 사용자 에이전트가 image request의 이미지가 이미지 치수를 얻을 수 없을 정도로 치명적으로 손상되었다고 판단할 수 있으며 image request가 현재 요청이면:
image request에 대한 이미지 요청을 중단한다.
이벤트를 생략할 수 있음이 설정되어 있지 않거나 previousURL이
urlString과 같지 않으면 img
요소에 error라는 이름의
이벤트를
발생시킨다.
해당 태스크와 이미지를 가져오는 동안 네트워킹 태스크 소스가 이후 큐에 넣는 각 태스크는 image request가 현재 요청인 경우 이미지 표시를 적절하게 업데이트해야 한다(예: 이미지가 프로그레시브 JPEG이면 각 패킷이 이미지 해상도를 향상시킬 수 있다).
또한 리소스를 가져온 뒤 네트워킹 태스크 소스가 마지막으로 큐에 넣는 태스크는 다음 단계도 추가로 실행해야 한다:
image request가 대기 중인 요청이면
현재 요청에 대한
이미지 요청을
중단하고,
대기 중인
요청을 현재 요청으로 승격한 뒤, img 요소가
주어졌을 때 image request를
표시하도록 준비한다.
image request를 완전히 사용 가능 상태로 설정한다.
상위 계층 캐싱 무시 플래그를 설정하여 key를 사용해 이미지를 사용 가능한 이미지 목록에 추가한다.
이벤트를 생략할 수 있음이 설정되어 있지 않거나 previousURL이
urlString과 같지 않으면 img
요소에 load라는 이름의
이벤트를
발생시킨다.
이미지 데이터가 지원되는 파일 형식이 아니다. 사용자 에이전트는 image
request의 상태를 손상됨으로 설정하고,
현재
요청과 대기 중인 요청에 대한
이미지 요청을
중단하고,
image request가 대기 중인
요청이면
대기 중인 요청을
현재 요청으로 승격한다. 그런 다음 이벤트를 생략할 수 있음이 설정되어 있지 않거나
previousURL이 urlString과 같지 않으면 img 요소가
주어졌을 때 DOM
조작 태스크 소스에 요소
태스크를 큐에 넣어 img 요소에
error라는 이름의
이벤트를 발생시킨다.
이미지 요청 또는 null인 image request에 대한 이미지 요청을 중단한다는 것은 다음 단계를 실행하는 것을 의미한다:
img 요소에 대해
대기 중인 요청을 현재
요청으로 승격한다는 것은 다음 단계를 실행하는 것을 의미한다:
이미지 요소 img가 주어졌을 때 이미지 요청 req에 대해 표시할 이미지를 준비하려면:
exifTagMap을 관련 코덱에서 정의한 대로 req의 이미지 데이터에서 얻은 EXIF 태그로 둔다. [EXIF]
physicalWidth와 physicalHeight를 관련 코덱에서 정의한 대로 req의 이미지 데이터에서 얻은 너비와 높이로 둔다.
dimX를 exifTagMap의 태그 0xA002
(PixelXDimension) 값으로 둔다.
dimY를 exifTagMap의 태그 0xA003
(PixelYDimension) 값으로 둔다.
resX를 exifTagMap의 태그 0x011A
(XResolution) 값으로 둔다.
resY를 exifTagMap의 태그 0x011B
(YResolution) 값으로 둔다.
resUnit을 exifTagMap의 태그 0x0128
(ResolutionUnit) 값으로 둔다.
다음이 모두 true이면:
dimX가 양의 정수이다.
dimY가 양의 정수이다.
resX가 양의 부동 소수점 수이다.
resY가 양의 부동 소수점 수이다.
physicalWidth × 72 / resX가 dimX이다.
physicalHeight × 72 / resY가 dimY이다.
resUnit이 2(Inch)이다.
그러면:
req의 이미지 데이터가 CORS 교차 출처이면, img의 자연 치수를 dimX와 dimY로 설정하고 img의 픽셀 데이터를 그에 따라 조정한다.
그렇지 않으면 req의 선호 밀도 보정 치수를 너비가 dimX로 설정되고 높이가 dimY로 설정된 구조체로 설정한다.
req의 img 요소의
표시를 적절히 업데이트한다.
EXIF의 해상도는 인치당 CSS 포인트와 같으므로 해상도에서 크기를 계산할 때 72를 기준으로 사용한다.
이미지가 이미 표시된 뒤 EXIF가 도착하는 경우 어떻게 처리할지는 아직 지정되지 않았다. 이슈 #4929를 참조한다.
img 요소 el이
주어졌을 때 이미지 소스를 선택하려면:
el의 소스 집합을 업데이트한다.
el의 소스 집합이 비어 있으면 URL로 null을, 픽셀 밀도로 undefined를 반환한다.
소스 집합 sourceSet이 주어졌을 때 소스 집합에서 이미지 소스를 선택하려면:
문자열 default source, 문자열 srcset, 문자열 sizes, 요소 또는 null인 img가 주어졌을 때 소스 집합을 생성하라는 요청을 받으면:
주어진 img 또는
link 요소
el의 소스 집합을 업데이트하라는 요청을 받으면 사용자 에이전트는 다음을 수행해야 한다:
elements를 « el »로 둔다.
el이 부모 노드가
picture
요소인 img 요소이면,
상대적 순서를 유지하면서 elements의 내용을
el의 부모 노드의 자식 요소로 대체한다.
el이 img
요소이면
img를 el로, 그렇지 않으면 null로 둔다.
elements의 각 child에 대해 반복한다:
child가 el이면:
default source를 빈 문자열로 둔다.
srcset을 빈 문자열로 둔다.
sizes를 빈 문자열로 둔다.
그렇지 않고 el이 imagesrcset
속성을 가진 link 요소이면
srcset을 해당
속성의 값으로 설정한다.
그렇지 않고 el이 imagesizes
속성을 가진 link 요소이면
sizes를 해당
속성의 값으로 설정한다.
그렇지 않고 el이 href 속성을
가진 link
요소이면
default source를 해당
속성의 값으로 설정한다.
el의 소스 집합을 default source, srcset, sizes, img가 주어졌을 때 소스 집합을 생성한 결과로 설정한다.
반환한다.
el이 link 요소이면
elements에는
el만 포함되므로 이 단계에 즉시 도달하고 알고리즘의 나머지는 실행되지 않는다.
child의 srcset 속성을 구문 분석하고 반환된 소스 집합을 source set으로 둔다.
child에 media 속성이
있고 그 값이 환경과 일치하지
않으면
다음 자식으로 계속한다.
img와 함께 child의 sizes 속성을 구문 분석하고 반환된 값을 source set의 소스 크기로 둔다.
child에 type 속성이 있고
그 값이 알 수 없거나 지원되지 않는 MIME 유형이면
다음 자식으로 계속한다.
child에 width 또는 height 속성이 있으면
el의 치수 속성 소스를
child로 설정한다. 그렇지 않으면 el의 치수 속성 소스를
el로 설정한다.
source set의 소스 밀도를 정규화한다.
el의 소스 집합을 source set으로 설정한다.
반환한다.
각 img
요소는 이전 형제인
source 요소와
img 요소 자체를
독립적으로 고려하여 이미지
소스를 선택하며, 같은 picture 요소의
다른 img 요소나
관련 img
요소의 뒤따르는 형제인 source
요소를
포함한 다른 모든 유효하지 않은 요소는 무시한다.
요소에서 srcset 속성을 구문 분석하라는 요청을 받으면 요소의 srcset 속성 값을 다음과 같이 구문 분석한다:
input을 이 알고리즘에 전달된 값으로 둔다.
position을 처음에는 문자열의 시작을 가리키는 input 내부의 포인터로 둔다.
candidates를 처음에는 비어 있는 소스 집합으로 둔다.
분할 루프: position이 주어졌을 때 input에서 ASCII 공백 또는 U+002C COMMA 문자인 코드 포인트 시퀀스를 수집한다. U+002C COMMA 문자가 하나라도 수집되면 구문 분석 오류이다.
position이 input의 끝을 지났으면 candidates를 반환한다.
position이 주어졌을 때 input에서 ASCII 공백이 아닌 코드 포인트 시퀀스를 수집하고 그 결과를 url로 둔다.
descriptors를 새로운 빈 목록으로 둔다.
url이 U+002C(,)로 끝나면:
url 끝의 모든 U+002C COMMA 문자를 제거한다. 두 개 이상의 문자를 제거한 경우 구문 분석 오류이다.
그렇지 않으면:
설명자 토크나이저: position이 주어졌을 때 input 안의 ASCII 공백을 건너뛴다.
current descriptor를 빈 문자열로 둔다.
state를 설명자 내부로 둔다.
c를 position의 문자로 둔다. state의 값에 따라 다음을 수행한다. 이 단계에서 "EOF"는 position이 input의 끝을 지났음을 나타내는 특수 문자이다.
c의 값에 따라 다음을 수행한다:
current descriptor가 비어 있지 않으면 current descriptor를 descriptors에 추가하고 current descriptor를 빈 문자열로 둔다. state를 설명자 뒤로 설정한다.
position을 input의 다음 문자로 이동한다. current descriptor가 비어 있지 않으면 current descriptor를 descriptors에 추가한다. 설명자 파서라고 표시된 단계로 이동한다.
c를 current descriptor에 추가한다. state를 괄호 내부로 설정한다.
current descriptor가 비어 있지 않으면 current descriptor를 descriptors에 추가한다. 설명자 파서라고 표시된 단계로 이동한다.
c를 current descriptor에 추가한다.
c의 값에 따라 다음을 수행한다:
c를 current descriptor에 추가한다. state를 설명자 내부로 설정한다.
current descriptor를 descriptors에 추가한다. 설명자 파서라고 표시된 단계로 이동한다.
c를 current descriptor에 추가한다.
c의 값에 따라 다음을 수행한다:
이 상태를 유지한다.
설명자 파서라고 표시된 단계로 이동한다.
state를 설명자 내부로 설정한다. position을 input의 이전 문자로 설정한다.
position을 input의 다음 문자로 이동한다. 이 단계를 반복한다.
향후 추가 사항과 호환되도록 이 알고리즘은 여러 설명자와 괄호가 있는 설명자를 지원한다.
설명자 파서: error를 아니요로 둔다.
width를 부재로 둔다.
density를 부재로 둔다.
future-compat-h를 부재로 둔다.
descriptors의 각 설명자에 대해 다음 목록에서 적절한 단계 집합을 실행한다:
사용자 에이전트가 sizes 속성을
지원하지 않으면 error를 예로 둔다.
준수하는 사용자 에이전트는 sizes
속성을 지원한다.
그러나 실제로 사용자 에이전트는 일반적으로 기능을 점진적으로 구현하고 출시한다.
width와 density가 모두 부재인 것이 아니면 error를 예로 둔다.
설명자에 음이 아닌 정수 구문 분석 규칙을 적용한다. 결과가 0이면 error를 예로 둔다. 그렇지 않으면 width를 결과로 둔다.
width, density 및 future-compat-h가 모두 부재인 것이 아니면 error를 예로 둔다.
설명자에 부동 소수점 수 값 구문 분석 규칙을 적용한다. 결과가 0보다 작으면 error를 예로 둔다. 그렇지 않으면 density를 결과로 둔다.
density가 0이면 자연 치수는 무한대가 된다. 사용자 에이전트는 이미지가 렌더링될 수 있는 크기에 제한을 둘 것으로 예상된다.
이는 구문 분석 오류이다.
future-compat-h와 density가 모두 부재인 것이 아니면 error를 예로 둔다.
설명자에 음이 아닌 정수 구문 분석 규칙을 적용한다. 결과가 0이면 error를 예로 둔다. 그렇지 않으면 future-compat-h를 결과로 둔다.
error를 예로 둔다.
future-compat-h가 부재가 아니고 width가 부재이면 error를 예로 둔다.
error가 여전히 아니요이면 URL이 url이고, width가 부재가 아니면 너비 width와 연결되고, density가 부재가 아니면 픽셀 밀도 density와 연결된 새로운 이미지 소스를 candidates에 추가한다. 그렇지 않으면 구문 분석 오류이다.
분할 루프라고 표시된 단계로 돌아간다.
img 요소 또는 null인
img와 함께 요소 element에서 sizes 속성을 구문 분석하라는 요청을 받으면:
unparsed sizes list를 element의 sizes 속성 값(속성이 없으면 빈 문자열)에서 쉼표로 구분된 구성 요소 값 목록을 구문 분석한 결과로 둔다. [CSSSYNTAX]
size를 null로 둔다.
unparsed sizes list의 각 unparsed size에 대해:
unparsed size 끝의 연속된 모든 <whitespace-token>을 제거한다. 이제 unparsed size가 비어 있으면 구문 분석 오류이며, 계속한다.
unparsed size의 마지막 구성 요소 값이 유효한 음이 아닌 <source-size-value>이면 size를 그 값으로 설정하고 unparsed size에서 구성 요소 값을 제거한다. 수학 함수 이외의 CSS 함수는 모두 유효하지 않다. 그렇지 않으면 구문 분석 오류이며, 계속한다.
size가 auto이고,
img가 null이 아니며, img가 렌더링 중이고, img가
자동 크기를 허용하면
size를 img의 구체적 객체
크기 너비로 설정하며, 단위는 CSS 픽셀이다.
size가 여전히 auto이면
무시된다.
unparsed size 끝의 연속된 모든 <whitespace-token>을 제거한다. 이제 unparsed size가 비어 있으면:
unparsed size에 남아 있는 구성 요소 값을 <media-condition>으로 구문 분석한다. 올바르게 구문 분석되지 않거나, 올바르게 구문 분석되었지만 <media-condition>이 false로 평가되면 계속한다. [MQ]
size가 auto가
아니면 size를 반환한다. 그렇지 않으면 계속한다.
100vw를 반환한다.
<media-condition>이 함께하지 않는 <length>인 단독 <source-size-value>를
<source-size-list>의 마지막 항목이 아닌
항목으로
사용하는 것은 유효하지 않다.
그러나 구문 분석 알고리즘은 <source-size-list>의 어느 위치에서든 이를 허용하며,
목록의 이전 항목이 사용되지 않았다면 즉시 크기로 받아들인다.
이는 향후 확장을 가능하게 하고
마지막에 쉼표를 추가하는 것과 같은 단순한 작성자 오류로부터 보호하기 위함이다.
단독 auto 키워드
뒤에는 레거시 사용자 에이전트에 대한 대체 항목을 제공하기 위해 다른 항목이
올 수 있다.
이미지 소스에는 URL과 함께 픽셀 밀도 설명자, 너비 설명자 또는 설명자가 전혀 없을 수 있다. 소스 집합을 정규화하면 모든 이미지 소스에 픽셀 밀도 설명자가 부여된다.
소스 집합 source set의 소스 밀도를 정규화하라는 요청을 받으면 사용자 에이전트는 다음을 수행해야 한다:
사용자 에이전트는 환경 변화에
반응하기 위해 언제든지 다음 알고리즘을 실행하여 img
요소의 이미지를 업데이트할 수 있다. (사용자 에이전트는 이 알고리즘을 실행할 필요가 없다.
예를 들어 사용자가 더 이상 페이지를 보고 있지 않으면 그동안 환경이 다시 변경될 경우를 고려하여
어떤 이미지를 사용할지 결정하기 전에 사용자가 페이지로 돌아올 때까지 기다릴 수 있다.)
특히 사용자가 뷰포트의 크기를 변경할 때(예: 창 크기를 조정하거나 페이지
확대/축소를 변경할 때),
그리고 img 요소가
문서에
삽입될 때 사용자 에이전트가 이 알고리즘을 실행하는 것이 권장된다. 그러면 밀도 보정 자연
너비와 높이가 새 뷰포트와 일치하고, 아트 디렉션이
관련될 때 올바른 이미지가 선택된다.
안정 상태를 기다린다. 동기 구간은 알고리즘에서 동기 구간이 종료되었다고 할 때까지 이 알고리즘의 남은 모든 단계로 구성된다. (동기 구간의 단계에는 ⌛ 표시가 있다.)
⌛ img 요소가
srcset
또는 picture를 사용하지 않고, 그 노드 문서가
완전히 활성 상태가 아니거나,
리소스 유형이 multipart/x-mixed-replace인
이미지 데이터가 있거나, 그 대기 중인
요청이 null이 아니면 반환한다.
⌛ selected source와 selected pixel density를 각각 이미지 소스를 선택한 결과인 URL과 픽셀 밀도로 둔다.
⌛ selected source가 null이면 반환한다.
⌛ selected source와 selected pixel density가 각각 요소의 마지막으로 선택된 소스 및 현재 픽셀 밀도와 같으면 반환한다.
⌛ urlString을 selected source와 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석하고 직렬화한 결과로 둔다.
⌛ urlString이 실패이면 반환한다.
⌛ corsAttributeState를 요소의 crossorigin
콘텐츠 속성의 상태로 둔다.
⌛ key를 urlString, corsAttributeState, 그리고 corsAttributeState가 CORS 없음이 아닌 경우 origin으로 구성된 튜플로 둔다.
⌛ 요소의 대기 중인 요청을 image request로 설정한다.
사용 가능한 이미지 목록에 key에 대한 항목이 있으면 image request의 이미지 데이터를 해당 항목의 이미지 데이터로 설정한다. 다음 단계로 계속한다.
그렇지 않으면:
request를
urlString, "image", corsAttributeState가 주어졌을 때
잠재적 CORS
요청을 생성한 결과로 둔다.
request의 클라이언트를
client로 설정하고, request의 개시자를 "imageset"으로 설정하며,
request의 동기
플래그를 설정한다.
request의
리퍼러 정책을 요소의 referrerpolicy
속성의 현재 상태로 설정한다.
request의 우선순위를 요소의 fetchpriority
속성의 현재 상태로 설정한다.
response를 request를 가져온 결과로 둔다.
response의 안전하지
않은 응답이 네트워크
오류이거나, 이미지 형식이 지원되지 않거나(앞에서 언급한 대로 이미지 스니핑 규칙을 적용하여 결정),
사용자 에이전트가 image request의 이미지가 이미지 치수를 얻을 수 없을 정도로
치명적으로 손상되었다고 판단할 수 있거나, 리소스 유형이
multipart/x-mixed-replace이면
대기 중인
요청을 null로 설정하고
이 단계를 중단한다.
그렇지 않으면 response의 안전하지 않은 응답은
image request의 이미지
데이터이다. 이는
CORS 동일 출처
또는
CORS 교차 출처일
수 있으며, 이는 이미지가 다른 API와
상호작용하는 방식에 영향을 준다(예: canvas에서
사용될 때).
img
요소와 다음 단계가 주어졌을 때 DOM 조작 태스크 소스에
요소 태스크를 큐에
넣는다:
img
요소가
이 알고리즘이 시작된 이후 관련
변이를 겪었으면
대기 중인 요청을 null로 설정하고
이
단계를 중단한다.
img
요소의 마지막으로
선택된 소스를 selected source로 설정하고, img
요소의 현재 픽셀
밀도를
selected pixel density로 설정한다.
상위 계층 캐싱 무시 플래그를 설정하여 키 key를 사용해 이미지를 사용 가능한 이미지 목록에 추가한다.
img
요소가 주어졌을 때 image request를
표시하도록 준비한다.
달리 지정된 경우를 제외하고 alt 속성을
지정해야 하며 그 값은 비어 있어서는 안 된다. 그 값은 이미지의 적절한 대체물이어야 한다.
alt 속성에 대한 구체적인 요구 사항은
다음 절에서 설명하는 것처럼 이미지가 나타내려는 대상에 따라 달라진다.
대체 텍스트를 작성할 때 고려해야 할 가장 일반적인 규칙은 다음과 같다: 모든 이미지를 해당
alt
속성의 텍스트로 대체해도 페이지의 의미가 바뀌지 않도록 하는 것이 목적이다.
따라서 일반적으로 이미지를 포함할 수 없었다면 무엇을 작성했을지 고려하여 대체 텍스트를 작성할 수 있다.
이에 따른 한 가지 결과는 alt
속성의 값에 이미지의 캡션, 제목 또는 범례로 간주될 수 있는 텍스트를
절대로 포함해서는 안 된다는 것이다. 이 속성은 사용자가 이미지 대신 사용할 수 있는
대체 텍스트를 포함해야 하며 이미지를 보충하기 위한 것이 아니다. title
속성은 보충 정보에 사용할 수
있다.
또 다른 결과는 alt
속성의 값이 이미지 옆의 산문에 이미 제공된 정보를
반복해서는 안 된다는 것이다.
대체 텍스트를 생각하는 한 가지 방법은 이미지가 있다는 사실을 언급하지 않고 해당 이미지가 포함된 페이지를 전화로 누군가에게 어떻게 읽어 줄지 생각하는 것이다. 이미지 대신 말하는 내용은 일반적으로 대체 텍스트를 작성하기 위한 좋은 출발점이다.
하이퍼링크를
생성하는 a 요소
또는 button
요소에 텍스트 콘텐츠가 없고 하나 이상의 이미지가 포함되어 있으면 alt
속성에는 함께 링크 또는 버튼의 목적을 전달하는 텍스트가 포함되어야 한다.
이 예제에서는 사용자에게 세 가지 색상 목록에서 선호하는 색상을 선택하도록 요청한다. 각 색상은 이미지로 제공되지만 이미지를 표시하지 않도록 사용자 에이전트를 구성한 사용자에게는 색상 이름이 대신 사용된다:
< h1 > Pick your color</ h1 >
< ul >
< li >< a href = "green.html" > < img src = "green.jpeg" alt = "Green" > </ a ></ li >
< li >< a href = "blue.html" > < img src = "blue.jpeg" alt = "Blue" > </ a ></ li >
< li >< a href = "red.html" > < img src = "red.jpeg" alt = "Red" > </ a ></ li >
</ ul >
이 예제에서는 각 버튼에 사용자가 원하는 색상 출력의 종류를 나타내는 이미지 집합이 있다. 각 경우 첫 번째 이미지를 사용하여 대체 텍스트를 제공한다.
< button name = "rgb" > < img src = "red" alt = "RGB" >< img src = "green" alt = "" >< img src = "blue" alt = "" > </ button >
< button name = "cmyk" > < img src = "cyan" alt = "CMYK" >< img src = "magenta" alt = "" >< img src = "yellow" alt = "" >< img src = "black" alt = "" > </ button >
각 이미지가 텍스트의 한 부분을 나타내므로 다음과 같이 작성할 수도 있다:
< button name = "rgb" > < img src = "red" alt = "R" >< img src = "green" alt = "G" >< img src = "blue" alt = "B" > </ button >
< button name = "cmyk" > < img src = "cyan" alt = "C" >< img src = "magenta" alt = "M" >< img src = "yellow" alt = "Y" >< img src = "black" alt = "K" > </ button >
그러나 다른 대체 텍스트에서는 이 방식이 적합하지 않을 수 있으며 각 경우 모든 대체 텍스트를 하나의 이미지에 넣는 것이 더 타당할 수 있다:
< button name = "rgb" > < img src = "red" alt = "sRGB profile" >< img src = "green" alt = "" >< img src = "blue" alt = "" > </ button >
< button name = "cmyk" > < img src = "cyan" alt = "CMYK profile" >< img src = "magenta" alt = "" >< img src = "yellow" alt = "" >< img src = "black" alt = "" > </ button >
때로는 어떤 내용을 순서도, 다이어그램, 그래프 또는 길 안내를 보여 주는 간단한 지도와 같은
그래픽 형태로 더 명확하게 표현할 수 있다. 이러한 경우 img
요소를 사용하여 이미지를 제공할 수 있지만, 이미지를 볼 수 없는 사용자(예: 연결이 매우 느리거나,
텍스트 전용 브라우저를 사용하거나, 핸즈프리 자동차 음성 웹 브라우저가 페이지를 읽어 주는 내용을
듣고 있거나, 단순히 시각 장애가 있는 사용자)도 전달되는 메시지를 이해할 수 있도록 덜 효과적인
텍스트 버전도 여전히 제공해야 한다.
텍스트는 alt
속성에 제공해야 하며
src
속성에 지정된 이미지와 동일한 메시지를 전달해야 한다.
대체 텍스트는 이미지의 설명이 아니라 이미지의 대체물이라는 점을 이해하는 것이 중요하다.
다음 예제에는 이미지 형태의 순서도가 있으며,
alt
속성의 텍스트는 순서도를 산문 형태로 바꾸어 표현한다:
< p > In the common case, the data handled by the tokenization stage
comes from the network, but it can also come from script.</ p >
< p > < img src = "images/parsing-model-overview.svg" alt = "The Network
passes data to the Input Stream Preprocessor, which passes it to the
Tokenizer, which passes it to the Tree Construction stage. From there,
data goes to both the DOM and to Script Execution. Script Execution is
linked to the DOM, and, using document.write(), passes data to the
Tokenizer." > </ p >
다음은 설명에 이미지를 포함하는 문제에 대한 좋은 해결책과 나쁜 해결책을 보여 주는 또 다른 예제이다.
먼저 좋은 해결책이다. 이 예제는 이미지가 애초에 존재하지 않았다면 산문에 넣었을 내용을 대체 텍스트로 그대로 사용해야 함을 보여 준다.
<!-- This is the correct way to do things. -->
< p >
You are standing in an open field west of a house.
< img src = "house.jpeg" alt = "The house is white, with a boarded front door." >
There is a small mailbox here.
</ p >
두 번째는 나쁜 해결책이다. 이 잘못된 방식에서는 대체 텍스트가 이미지의 텍스트 대체물이 아니라 단순히 이미지의 설명이다. 이미지가 표시되지 않을 때 텍스트의 흐름이 첫 번째 예제만큼 자연스럽지 않으므로 좋지 않다.
<!-- This is the wrong way to do things. -->
< p >
You are standing in an open field west of a house.
< img src = "house.jpeg" alt = "A white house, with a boarded front door." >
There is a small mailbox here.
</ p >
"판자로 막힌 문이 있는 흰색 주택의 사진"과 같은 텍스트도 마찬가지로 나쁜 대체 텍스트이다
(다만 이 이미지가 있는 figure의
figcaption
요소나 title
속성에는 적합할 수 있다).
문서에는 아이콘 형태의 정보가 포함될 수 있다. 아이콘은 시각적 브라우저 사용자가 기능을 한눈에 알아볼 수 있도록 돕기 위한 것이다.
어떤 경우에는 아이콘이 같은 의미를 전달하는 텍스트 레이블을 보충한다. 이러한 경우
alt
속성이 존재해야 하지만 비어 있어야 한다.
여기서 아이콘은 같은 의미를 전달하는 텍스트 옆에 있으므로 빈 alt
속성을 가진다:
< nav >
< p >< a href = "/help/" > < img src = "/icons/help.png" alt = "" > Help</ a ></ p >
< p >< a href = "/configure/" > < img src = "/icons/configuration.png" alt = "" >
Configuration Tools</ a ></ p >
</ nav >
다른 경우에는 아이콘 옆에 그 의미를 설명하는 텍스트가 없으며 아이콘 자체로 의미가 명확해야 한다.
이러한 경우 동등한 텍스트 레이블을 alt
속성에 제공해야 한다.
여기서는 뉴스 사이트의 게시물에 주제를 나타내는 아이콘으로 레이블을 지정한다.
< body >
< article >
< header >
< h1 > Ratatouille wins < i > Best Movie of the Year</ i > award</ h1 >
< p > < img src = "movies.png" alt = "Movies" > </ p >
</ header >
< p > Pixar has won yet another < i > Best Movie of the Year</ i > award,
making this its 8th win in the last 12 years.</ p >
</ article >
< article >
< header >
< h1 > Latest TWiT episode is online</ h1 >
< p > < img src = "podcasts.png" alt = "Podcasts" > </ p >
</ header >
< p > The latest TWiT episode has been posted, in which we hear
several tech news stories as well as learning much more about the
iPhone. This week, the panelists compare how reflective their
iPhones' Apple logos are.</ p >
</ article >
</ body >
많은 페이지에는 회사, 조직, 프로젝트, 밴드, 소프트웨어 패키지, 국가 등 특정 대상을 나타내는 로고, 휘장, 깃발 또는 문장이 포함된다.
로고가 페이지 제목 등에서 대상을 나타내기 위해 사용되면 alt
속성에는 로고가 나타내는 대상의 이름이 포함되어야 한다.
alt
속성에는 "로고"라는 단어와 같은 텍스트가 포함되어서는 안 된다.
전달되는 것은 로고라는 사실이 아니라 대상 자체이기 때문이다.
로고가 나타내는 대상의 이름 옆에 사용되면 로고는 보충적인 것이므로
alt
속성은 비어 있어야 한다.
로고가 단순한 장식 자료로 사용되는 경우(브랜딩 또는 로고가 속한 대상을 언급하는 기사 옆의 이미지 등) 아래의 순수 장식 이미지에 관한 항목이 적용된다. 실제로 로고 자체를 논의하는 경우에는 대체 그래픽 표현 (로고 자체)이 있는 구 또는 문단(로고에 대한 설명)으로 사용되는 것이므로 위의 첫 번째 항목이 적용된다.
다음 코드 조각에는 위의 네 가지 경우가 모두 나타난다. 먼저 회사를 나타내기 위해 사용되는 로고를 볼 수 있다:
< h1 > < img src = "XYZ.gif" alt = "The XYZ company" > </ h1 >
다음으로 회사 이름 바로 옆에 로고를 사용하는 문단을 볼 수 있으며 따라서 대체 텍스트가 없다:
< article >
< h2 > News</ h2 >
< p > We have recently been looking at buying the < img src = "alpha.gif"
alt = "" > ΑΒΓ company, a small Greek company
specializing in our type of product.</ p >
세 번째 코드 조각에서는 인수에 관해 논의하는 더 큰 기사의 일부로 로고가 별도 콘텐츠에서 사용된다:
< aside >< p >< img src = "alpha-large.gif" alt = "" ></ p ></ aside >
< p > The ΑΒΓ company has had a good quarter, and our
pie chart studies of their accounts suggest a much bigger blue slice
than its green and orange slices, which is always a good sign.</ p >
</ article >
마지막으로 로고에 관해 이야기하는 의견 기사가 있으므로 로고는 대체 텍스트에서 자세히 설명된다.
< p > Consider for a moment their logo:</ p >
< p >< img src = "/images/logo" alt = "It consists of a green circle with a
green question mark centered inside it." ></ p >
< p > How unoriginal can you get? I mean, oooooh, a question mark, how
< em > revolutionary</ em > , how utterly < em > ground-breaking</ em > , I'm
sure everyone will rush to adopt those specifications now! They could
at least have tried for some sort of, I don't know, sequence of
rounded squares with varying shades of green and bold white outlines,
at least that would look good on the cover of a blue book.</ p >
이 예제는 이미지가 사용 가능하지 않아 텍스트가 대신 사용되는 경우에도 이미지가 처음부터 없었던 것처럼 텍스트가 주변 텍스트에 자연스럽게 이어지도록 대체 텍스트를 작성해야 함을 보여 준다.
때로는 이미지가 단순히 텍스트로 구성되며 이미지의 목적은 텍스트를 렌더링하는 데 사용된 실제 타이포그래피 효과를 강조하는 것이 아니라 텍스트 자체를 전달하는 것이다.
이러한 경우 alt
속성이 존재해야 하며 이미지 자체에 작성된 것과 동일한 텍스트로
구성되어야 한다.
글자가 모두 꽃과 식물로 장식되어 있지만 "Earth Day"라는 텍스트가 포함된 그래픽을 생각해 보자. 텍스트가 단순히 제목으로 사용되어 그래픽 사용자에게 페이지를 꾸미기 위한 것이라면 올바른 대체 텍스트는 동일한 "Earth Day"이며 장식에 관해서는 언급할 필요가 없다:
< h1 > < img src = "earthdayheading.png" alt = "Earth Day" > </ h1 >
채색 필사본은 일부 문자에 그래픽을 사용할 수 있다. 이러한 상황에서 대체 텍스트는 이미지가 나타내는 문자 자체이다.
< p >< img src = "initials/o.svg" alt = "O" > nce upon a time and a long long time ago, late at
night, when it was dark, over the hills, through the woods, across a great ocean, in a land far
away, in a small house, on a hill, under a full moon...
가이지, 이타이지 또는 새로운 통화 기호와 같은 새 문자처럼 Unicode로 나타낼 수 없는 문자를 이미지로 나타낼 때 대체 텍스트는 같은 내용을 작성하는 더 일반적인 방법이어야 한다. 예를 들어 음성적 히라가나나 가타카나를 사용하여 문자의 발음을 제공할 수 있다.
1997년의 이 예제에서는 가운데 가로줄이 하나가 아니라 두 개인 굽은 E처럼 보이는 새로운 통화 기호를 이미지로 나타낸다. 대체 텍스트는 문자의 발음을 제공한다.
< p > Only < img src = "euro.png" alt = "euro " > 5.99!
문자가 동일한 목적을 수행할 수 있다면 이미지를 사용해서는 안 된다. 장식 때문에 또는 적절한 문자가 없기 때문에(가이지의 경우처럼) 텍스트를 직접 나타낼 수 없는 경우에만 이미지가 적절하다.
작성자가 기본 시스템 글꼴이 특정 문자를 지원하지 않기 때문에 이미지를 사용하고 싶다면 이미지보다 웹 글꼴이 더 나은 해결책이다.
많은 경우 이미지는 실제로 단지 보충적인 것이며 그 존재는 주변 텍스트를 강화할 뿐이다.
이러한 경우 alt
속성이 존재해야 하지만 그 값은 빈 문자열이어야 한다.
일반적으로 이미지를 제거해도 페이지의 유용성이 줄어들지 않지만 이미지를 포함하면 시각적 브라우저 사용자가 개념을 훨씬 쉽게 이해할 수 있는 경우 이미지가 이 범주에 속한다.
앞의 문단을 그래픽 형태로 반복하는 순서도:
< p > The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</ p >
< p >< img src = "images/parsing-model-overview.svg" alt = "" ></ p >
이러한 경우 단순히 캡션으로 구성된 대체 텍스트를 포함하는 것은 잘못이다.
캡션을 포함하려면 title
속성을 사용하거나
figure
및 figcaption
요소를 사용할 수 있다.
후자의 경우 이미지는 실제로 대체 그래픽 표현이 있는 구 또는 문단이므로 대체 텍스트가 필요하다.
<!-- Using the title="" attribute -->
< p > The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</ p >
< p > < img src = "images/parsing-model-overview.svg" alt = ""
title = "Flowchart representation of the parsing model." > </ p >
<!-- Using <figure> and <figcaption> -->
< p > The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</ p >
< figure >
< img src = "images/parsing-model-overview.svg" alt = "The Network leads to
the Input Stream Preprocessor, which leads to the Tokenizer, which
leads to the Tree Construction stage. The Tree Construction stage
leads to two items. The first is Script Execution, which leads via
document.write() back to the Tokenizer. The second item from which
Tree Construction leads is the DOM. The DOM is related to the Script
Execution." >
< figcaption > Flowchart representation of the parsing model.</ figcaption >
</ figure >
<!-- This is WRONG. Do not do this. Instead, do what the above examples do. -->
< p > The Network passes data to the Input Stream Preprocessor, which
passes it to the Tokenizer, which passes it to the Tree Construction
stage. From there, data goes to both the DOM and to Script Execution.
Script Execution is linked to the DOM, and, using document.write(),
passes data to the Tokenizer.</ p >
< p >< img src = "images/parsing-model-overview.svg"
alt = "Flowchart representation of the parsing model." ></ p >
<!-- Never put the image's caption in the alt="" attribute! -->
앞의 문단을 그래픽 형태로 반복하는 그래프:
< p > According to a study covering several billion pages,
about 62% of documents on the web in 2007 triggered the Quirks
rendering mode of web browsers, about 30% triggered the Almost
Standards mode, and about 9% triggered the Standards mode.</ p >
< p >< img src = "rendering-mode-pie-chart.png" alt = "" ></ p >
때로는 이미지가 콘텐츠에 필수적이지 않지만 순수한 장식도 아니며 텍스트와 완전히 중복되지도 않는다.
이러한 경우 alt 속성이 존재해야 하며 그 값은
빈 문자열 또는 이미지가 전달하는 정보의 텍스트 표현이어야 한다. 이미지의 제목을 제공하는 캡션이
있으면 alt
속성의 값은 비어 있어서는 안 된다(그렇게 하면 비시각적 독자가 상당히 혼란스러울 수 있다).
정치 인물에 관한 뉴스 기사에서 해당 인물의 얼굴이 이미지로 표시되는 경우를 생각해 보자. 이미지는 기사와 관련이 있으므로 순수한 장식이 아니다. 정치인의 외모를 보여 주므로 기사와 완전히 중복되지도 않는다. 대체 텍스트를 제공할 필요가 있는지는 이미지가 산문의 해석에 영향을 미치는지에 따라 작성자가 결정한다.
이 첫 번째 변형에서는 이미지가 맥락 없이 표시되며 대체 텍스트가 제공되지 않는다:
< p > < img src = "president.jpeg" alt = "" > Ahead of today's referendum,
the President wrote an open letter to all registered voters. In it, she admitted that the country was
divided.</ p >
사진이 단순한 얼굴이라면 이를 설명하는 데 가치가 없을 수 있다. 해당 인물이 붉은 머리인지 금발인지, 피부가 흰색인지 검은색인지, 눈이 하나인지 두 개인지는 독자에게 중요하지 않다.
그러나 사진이 정치인이 화가 났거나, 특히 행복하거나, 절망한 모습처럼 더 역동적이라면 기사의 분위기를 설정하는 데 대체 텍스트가 유용하다. 그렇지 않으면 그 분위기를 놓칠 수 있다:
< p > < img src = "president.jpeg" alt = "The President is sad." >
Ahead of today's referendum, the President wrote an open letter to all
registered voters. In it, she admitted that the country was divided.
</ p >
< p > < img src = "president.jpeg" alt = "The President is happy!" >
Ahead of today's referendum, the President wrote an open letter to all
registered voters. In it, she admitted that the country was divided.
</ p >
인물이 "슬픈지" 또는 "행복한지"는 문단의 나머지를 해석하는 방식에 차이를 만든다. 나라가 분열된 것에 불만이 있다고 말하는 것일 가능성이 큰가, 아니면 분열된 나라의 전망이 자신의 정치 경력에 도움이 된다고 말하는 것인가? 해석은 이미지에 따라 달라진다.
이미지에 캡션이 있으면 대체 텍스트를 포함하여 비시각적 사용자가 캡션이 무엇을 가리키는지 혼란스러워하지 않도록 할 수 있다.
< p > Ahead of today's referendum, the President wrote an open letter to
all registered voters. In it, she admitted that the country was divided.</ p >
< figure >
< img src = "president.jpeg"
alt = "A high forehead, cheerful disposition, and dark hair round out the President's face." >
< figcaption > The President of Ruritania. Photo © 2014 PolitiPhoto. </ figcaption >
</ figure >
이미지가 장식용이지만 특정 페이지에 특별히 한정되지 않는 경우(예: 사이트 전체 디자인 체계의 일부를 구성하는 이미지) 이미지는 문서의 마크업이 아니라 사이트의 CSS에 지정해야 한다.
그러나 주변 텍스트에서 논의되지 않지만 여전히 어느 정도 관련성이 있는 장식 이미지는 img
요소를 사용하여 페이지에 포함할 수 있다. 이러한 이미지는 장식적이지만 여전히 콘텐츠의 일부를 구성한다.
이러한 경우 alt
속성이 존재해야 하지만 그 값은 빈 문자열이어야 한다.
관련성이 있음에도 이미지가 순수 장식인 예로는 Burning Man의 행사에 관한 블로그 게시물에 있는 Black Rock City 풍경 사진이나, 시를 낭송하는 페이지에 있는 그 시에서 영감을 받은 그림 등이 있다. 다음 코드 조각은 후자의 예를 보여 준다(이 코드 조각에는 첫 번째 연만 포함됨):
< h1 > The Lady of Shalott</ h1 >
< p >< img src = "shalott.jpeg" alt = "" ></ p >
< p > On either side the river lie< br >
Long fields of barley and of rye,< br >
That clothe the wold and meet the sky;< br >
And through the field the road run by< br >
To many-tower'd Camelot;< br >
And up and down the people go,< br >
Gazing where the lilies blow< br >
Round an island there below,< br >
The island of Shalott.</ p >
그림을 더 작은 이미지 파일로 나눈 다음 다시 완전한 그림을 구성하도록 함께 표시하는 경우,
이미지 중 하나의 alt
속성을 그림 전체에 적합한 관련 규칙에 따라 설정해야 하며,
나머지 모든 이미지의 alt
속성은 빈 문자열로 설정해야 한다.
다음 예제에서는 XYZ Corp의 회사 로고를 나타내는 그림을 두 조각으로 나누었으며, 첫 번째 조각에는 "XYZ"라는 글자가, 두 번째 조각에는 "Corp"라는 단어가 들어 있다. 대체 텍스트("XYZ Corp")는 모두 첫 번째 이미지에 있다.
< h1 > < img src = "logo1.png" alt = "XYZ Corp" >< img src = "logo2.png" alt = "" > </ h1 >
다음 예제에서는 채워진 별 세 개와 빈 별 두 개로 평점이 표시된다. 대체 텍스트를 "★★★☆☆"로 할 수도 있었지만 작성자는 대신 "5점 만점에 3점" 형식으로 평점을 제공하는 것이 더 유용하다고 결정했다. 이것이 첫 번째 이미지의 대체 텍스트이며 나머지는 빈 대체 텍스트를 가진다.
< p > Rating: < meter max = 5 value = 3 > < img src = "1" alt = "3 out of 5"
>< img src = "1" alt = "" >< img src = "1" alt = "" >< img src = "0" alt = ""
>< img src = "0" alt = "" > </ meter ></ p >
일반적으로 링크를 위해 이미지를 조각내는 대신 이미지 맵을 사용해야 한다.
그러나 실제로 이미지가 조각나 있고 조각난 그림의 구성 요소 중 하나라도
링크의 유일한 콘텐츠라면 링크마다 이미지 하나의 alt
속성에 링크의 목적을 나타내는 대체 텍스트가 있어야 한다.
다음 예제에서는 날아다니는 스파게티 괴물의 문장을 나타내는 그림에서 왼쪽의 면발 모양 부속지와 오른쪽의 면발 모양 부속지가 서로 다른 이미지에 있으므로 사용자가 모험에서 왼쪽 또는 오른쪽을 선택할 수 있다.
< h1 > The Church</ h1 >
< p > You come across a flying spaghetti monster. Which side of His
Noodliness do you wish to reach out for?</ p >
< p >< a href = "?go=left" >< img src = "fsm-left.png" alt = "Left side. " ></ a
>< img src = "fsm-middle.png" alt = ""
>< a href = "?go=right" >< img src = "fsm-right.png" alt = "Right side." ></ a ></ p >
어떤 경우에는 이미지가 콘텐츠의 핵심 부분이다. 예를 들어 사진 갤러리의 일부인 페이지가 이에 해당할 수 있다. 이미지는 이를 포함하는 페이지의 전체 핵심이다.
콘텐츠의 핵심 부분인 이미지에 대체 텍스트를 제공하는 방법은 이미지의 출처에 따라 달라진다.
자세한 대체 텍스트를 제공할 수 있는 경우, 예를 들어 이미지가
잡지 리뷰의 스크린샷 시리즈 일부이거나, 만화의 일부이거나,
해당 사진을 다루는 블로그 글의 사진인 경우 이미지의 대체물로 사용할 수 있는 텍스트를
alt 속성의 콘텐츠로 제공해야 한다.
새 OS의 스크린샷 갤러리에 있는 대체 텍스트가 포함된 스크린샷:
< figure >
< img src = "KDE%20Light%20desktop.png"
alt = "The desktop is blue, with icons along the left hand side in
two columns, reading System, Home, K-Mail, etc. A window is
open showing that menus wrap to a second line if they
cannot fit in the window. The window has a list of icons
along the top, with an address bar below it, a list of
icons for tabs along the left edge, a status bar on the
bottom, and two panes in the middle. The desktop has a bar
at the bottom of the screen with a few buttons, a pager, a
list of open applications, and a clock." >
< figcaption > Screenshot of a KDE desktop.</ figcaption >
</ figure >
재무 보고서의 그래프:
< img src = "sales.gif"
title = "Sales graph"
alt = "From 1998 to 2005, sales increased by the following percentages
with each year: 624%, 75%, 138%, 40%, 35%, 9%, 21%" >
"판매 그래프"는 판매 그래프의 대체 텍스트로 충분하지 않다는 점에 유의한다. 좋은 캡션이 될 텍스트가 일반적으로 대체 텍스트로 적합한 것은 아니다.
어떤 경우에는 이미지의 특성상 철저한 대체 텍스트를 제공하는 것이 비현실적일 수 있다. 예를 들어 이미지가 불분명하거나, 복잡한 프랙탈이거나, 상세한 지형도일 수 있다.
이러한 경우 alt
속성에는 적절한 대체 텍스트가 어느 정도
포함되어야 하지만 다소 간략할 수 있다.
때로는 이미지의 가치를 제대로 전달할 수 있는 텍스트가 전혀 없다. 예를 들어 로르샤흐 잉크 얼룩 검사를 유용하게 설명할 수 있는 내용은 거의 없다. 그러나 설명이 간략하더라도 아무것도 없는 것보다는 낫다:
< figure >
< img src = "/commons/a/a7/Rorschach1.jpg" alt = "A shape with left-right
symmetry with indistinct edges, with a small gap in the center, two
larger gaps offset slightly from the center, with two similar gaps
under them. The outline is wider in the top half than the bottom
half, with the sides extending upwards higher than the center, and
the center extending below the sides." >
< figcaption > A black outline of the first of the ten cards
in the Rorschach inkblot test.</ figcaption >
</ figure >
다음은 대체 텍스트를 매우 잘못 사용한 예이다:
<!-- This example is wrong. Do not copy it. -->
< figure >
< img src = "/commons/a/a7/Rorschach1.jpg" alt = "A black outline
of the first of the ten cards in the Rorschach inkblot test." >
< figcaption > A black outline of the first of the ten cards
in the Rorschach inkblot test.</ figcaption >
</ figure >
이처럼 대체 텍스트에 캡션을 포함하는 것은 이미지가 없는 사용자에게 캡션을 사실상 중복해서 제공하여 두 번 조롱할 뿐, 캡션을 한 번 읽거나 들었을 때보다 더 도움을 주지 않으므로 유용하지 않다.
완전한 설명이 불가능한 이미지의 또 다른 예는 정의상 세부 사항이 무한한 프랙탈이다.
다음 예제는 만델브로 집합 이미지의 전체 보기에 대체 텍스트를 제공하는 한 가지 가능한 방법을 보여 준다.
< img src = "ms1.jpeg" alt = "The Mandelbrot set appears as a cardioid with
its cusp on the real axis in the positive direction, with a smaller
bulb aligned along the same center line, touching it in the negative
direction, and with these two shapes being surrounded by smaller bulbs
of various sizes." >
마찬가지로 예를 들어 전기에 포함된 사람 얼굴 사진은 콘텐츠와 상당히 관련 있고 핵심적인 것으로 간주될 수 있지만 텍스트로 완전히 대체하기는 어려울 수 있다:
< section class = "bio" >
< h1 > A Biography of Isaac Asimov</ h1 >
< p > Born < b > Isaak Yudovich Ozimov</ b > in 1920, Isaac was a prolific author.</ p >
< p >< img src = "headpics/asimov.jpeg" alt = "Isaac Asimov had dark hair, a tall forehead, and wore glasses.
Later in life, he wore long white sideburns." ></ p >
< p > Asimov was born in Russia, and moved to the US when he was three years old.</ p >
< p > ...</ p >
</ section >
이러한 경우 대체 텍스트에 이미지 자체가 존재한다는 언급을 포함하는 것은 필요하지 않으며 실제로 권장되지 않는다. 그러한 텍스트는 브라우저 자체가 이미지의 존재를 알리는 것과 중복되기 때문이다. 예를 들어 대체 텍스트가 "아이작 아시모프의 사진"이면 준수하는 사용자 에이전트는 더 유용한 "(이미지) 아이작 아시모프는 검은 머리와 높은 이마를 가졌고 안경을 썼다..." 대신 "(이미지) 아이작 아시모프의 사진"으로 읽을 수 있다.
안타깝게도 어떤 경우에는 전혀 이용 가능한 대체 텍스트가 없을 수 있다. 이미지가 관련 대체 텍스트 없이 자동화된 방식으로 얻어졌거나 (예: 웹캠), 사용자가 적합하거나 사용할 수 있는 대체 텍스트를 제공하지 않은 사용자 제공 이미지를 사용하는 스크립트로 페이지가 생성되거나(예: 사진 공유 사이트), 작성자 자신도 이미지가 무엇을 나타내는지 알지 못하기 때문일 수 있다(예: 시각 장애가 있는 사진작가가 블로그에 이미지를 공유하는 경우).
이러한 경우 alt
속성을 생략할 수 있지만 다음 조건 중
하나도 충족해야 한다:
img 요소가
요소 간 공백 이외의
콘텐츠를 포함하는
figcaption
요소를 포함하는
figure
요소 안에 있고,
figcaption
요소와 그 자손을 무시할 때 figure
요소에 요소 간
공백과
img 요소 이외의
플로 콘텐츠 자손이 없다.
title 속성이
존재하고 비어 있지 않은 값을 가진다.
현재는 title
속성에 의존하는 것이
권장되지 않는다. 많은 사용자 에이전트가 이 명세에서 요구하는 접근 가능한 방식으로
속성을 노출하지 않기 때문이다(예: 툴팁이 나타나게 하려면 마우스 같은 포인팅 장치가 필요하므로
키보드만 사용하는 사용자와 최신 휴대전화 또는 태블릿 사용자 같은 터치만 사용하는 사용자가 제외됨).
이러한 경우는 절대적인 최소한으로 유지해야 한다. 작성자가 실제 대체 텍스트를
제공할 수 있을 가능성이 조금이라도 있다면 alt 속성을 생략하는 것은
허용되지 않는다.
사진 공유 사이트가 캡션 외에는 메타데이터가 없는 이미지를 받은 경우 해당 사진을 다음과 같이 마크업할 수 있다:
< figure >
< img src = "1100670787_6a7c664aef.jpg" >
< figcaption > Bubbles traveled everywhere with us.</ figcaption >
</ figure >
그러나 사용자에게서 이미지의 중요한 부분에 대한 자세한 설명을 얻어 페이지에 포함하는 것이 더 좋다.
시각 장애가 있는 사용자가 촬영한 사진을 보여 주는 블로그이다. 처음에는 사용자가 자신이 찍은 사진에 무엇이 나타나는지 전혀 알지 못할 수 있다:
< article >
< h1 > I took a photo</ h1 >
< p > I went out today and took a photo!</ p >
< figure >
< img src = "photo2.jpeg" >
< figcaption > A photograph taken blindly from my front porch.</ figcaption >
</ figure >
</ article >
하지만 결국 사용자는 친구에게서 이미지에 대한 설명을 얻고 대체 텍스트를 포함할 수 있다:
< article >
< h1 > I took a photo</ h1 >
< p > I went out today and took a photo!</ p >
< figure >
< img src = "photo2.jpeg" alt = "The photograph shows my squirrel
feeder hanging from the edge of my roof. It is half full, but there
are no squirrels around. In the background, out-of-focus trees fill the
shot. The feeder is made of wood with a metal grate, and it contains
peanuts. The edge of the roof is wooden too, and is painted white
with light blue streaks." >
< figcaption > A photograph taken blindly from my front porch.</ figcaption >
</ figure >
</ article >
때로는 텍스트 설명을 사용할 수 없고 사용자가 설명을 제공해야 한다는 사실 자체가 이미지의
전체 목적이다. 예를 들어 CAPTCHA 이미지의 목적은 사용자가 그래픽을 실제로 읽을 수 있는지
확인하는 것이다. 다음은 CAPTCHA를 마크업하는 한 가지 방법이다(title 속성에 유의한다):
< p >< label > What does this image say?
< img src = "captcha.cgi?id=8934" title = "CAPTCHA" >
< input type = text name = captcha ></ label >
(If you cannot see the image, you can use an < a
href = "?audio" > audio</ a > test instead.)</ p >
또 다른 예로는 올바른 대체 텍스트가 있는 페이지를 작성하려는 바로 그 목적으로 이미지를 표시하고 대체 텍스트를 요청하는 소프트웨어가 있다. 이러한 페이지에는 다음과 같은 이미지 표가 있을 수 있다:
< table >
< thead >
< tr > < th > Image < th > Description
< tbody >
< tr >
< td > < img src = "2421.png" title = "Image 640 by 100, filename 'banner.gif'" >
< td > < input name = "alt2421" >
< tr >
< td > < img src = "2422.png" title = "Image 200 by 480, filename 'ad3.gif'" >
< td > < input name = "alt2422" >
</ table >
이 예제에서도 가능한 한 많은 유용한 정보가 여전히
title 속성에 포함된다는 점에 유의한다.
일부 사용자는 이미지를 전혀 사용할 수 없으므로(예: 연결이 매우 느리거나,
텍스트 전용 브라우저를 사용하거나, 핸즈프리 자동차 음성 웹 브라우저가 읽어 주는 페이지를
듣고 있거나, 단순히 시각 장애가 있기 때문에), 위 예제처럼 대체 텍스트가 없고
제공할 수도 없는 경우에만 alt
속성을 대체 텍스트와 함께 제공하지 않고 생략할 수 있다.
작성자가 노력을 기울이지 않았다는 것은 alt
속성을 생략할 수 있는
허용 가능한 이유가 아니다.
일반적으로 작성자는 이미지를 표시하는 것 이외의 목적으로 img 요소를
사용하는 것을 피해야 한다.
img
요소가 페이지 조회 수를 계산하는 서비스의 일부와 같이 이미지를 표시하는 것 이외의 목적으로
사용되는 경우 alt 속성은
빈 문자열이어야 한다.
이러한 경우 width 및
height 속성을
모두 0으로 설정해야 한다.
이 절은 공개적으로 접근 가능한 문서 또는 웹사이트의 문서, 공개 메일링 리스트로 전송된 이메일, 소프트웨어 문서처럼 대상 독자를 작성자가 반드시 개인적으로 알지 못하는 문서에는 적용되지 않는다.
이미지를 볼 수 있다고 알려진 특정인을 대상으로 하는 비공개 통신
(예: HTML 이메일)에 이미지가 포함된 경우 alt
속성을 생략할 수 있다. 그러나 이러한 경우에도 이미지 종류에 따라 적절한
대체 텍스트(위 항목에서 설명한 대로)를 포함할 것을 작성자에게 강력히 권장한다.
그러면 사용자가 이미지를 지원하지 않는 메일 클라이언트를 사용하거나 문서가 이미지를 쉽게 볼 수 없는
다른 사용자에게 전달되더라도 이메일을 계속 사용할 수 있다.
마크업 생성기(WYSIWYG 작성 도구 등)는 가능한 모든 경우 사용자에게서 대체 텍스트를 받아야 한다. 그러나 많은 경우 이것이 가능하지 않다는 점은 인정된다.
링크의 유일한 콘텐츠인 이미지의 경우 마크업 생성기는 링크 대상을 검사하여 대상의 제목 또는 대상의 URL을 확인하고 이러한 방식으로 얻은 정보를 대체 텍스트로 사용해야 한다.
캡션이 있는 이미지의 경우 마크업 생성기는 figure 및
figcaption
요소 또는 title
속성을 사용하여
이미지의 캡션을 제공해야 한다.
최후의 수단으로 구현자는 이미지가 정보를 추가하지 않지만 여전히 주변 콘텐츠에 특화된
순수 장식 이미지라고 가정하여 alt
속성을 빈 문자열로 설정하거나, 이미지가
콘텐츠의 핵심 부분이라고 가정하여 alt
속성을
완전히 생략해야 한다.
마크업 생성기는 대체 텍스트를 얻을 수 없어
alt 속성을 생략한
img
요소에 generator-unable-to-provide-required-alt
속성을 지정할 수 있다. 이 속성의
값은 빈 문자열이어야 한다. 이러한 속성을 포함하는 문서는 준수하지 않지만
적합성 검사기는 이 오류를 조용히
무시한다.
이는 최신 자동화
적합성 검사기가 가짜 대체 텍스트와 올바른 대체 텍스트를 구분할 수 없기 때문에,
마크업 생성기가 alt 속성을 생략하는
오류를
가짜 대체 텍스트를 제공하는 훨씬 더
심각한 오류로 대체하도록 압박받는 일을 방지하기 위한 것이다.
마크업 생성기는 일반적으로 이미지 자체의 파일 이름을 대체 텍스트로 사용하는 것을 피해야 한다. 마찬가지로 마크업 생성기는 프레젠테이션 사용자 에이전트 (예: 웹 브라우저)에도 동일하게 제공될 콘텐츠에서 대체 텍스트를 생성하는 것을 피해야 한다.
이는 페이지가 생성된 뒤에는 일반적으로 업데이트되지 않지만, 나중에 페이지를 읽는 브라우저는 사용자가 업데이트할 수 있으므로 브라우저가 페이지 생성 당시 마크업 생성기보다 더 최신이고 정교하게 조정된 휴리스틱을 가질 가능성이 높기 때문이다.
적합성 검사기는 아래 나열된 조건 중 하나가 적용되지 않는 한 alt
속성의 부재를 오류로 보고해야 한다:
img
요소가 위에서 설명한 조건을 충족하는 figure
요소 안에 있다.
img
요소에 빈 문자열이 아닌 값을 가진 title
속성이 있다(또한 위에서
설명한 대로).
적합성 검사기가 문서를 이미지를 볼 수 있다고 알려진 특정인을 위한 이메일 또는 문서라고 가정하도록 구성되었다.
img
요소에 값이 빈 문자열인 (준수하지 않는) generator-unable-to-provide-required-alt
속성이 있다. alt
속성의 부재를 오류로 보고하지 않는 적합성 검사기는
빈 generator-unable-to-provide-required-alt
속성의 존재도 오류로 보고해서는 안 된다. (이 경우는 문서가 준수하는 경우를 나타내는 것이 아니라
생성기가 적절한 대체 텍스트를 결정할 수 없었다는 경우일 뿐이다. 검사기가 이 경우
오류를 표시할 필요는 없다. 이러한 오류는 마크업 생성기가 검사기의 메시지를 없애려는 목적으로만
가짜 대체 텍스트를 포함하도록 유도할 수 있기 때문이다.
물론 적합성 검사기는 generator-unable-to-provide-required-alt
속성이 있는 경우에도 alt
속성의 부재를
오류로 보고할 수 있다. 예를 들어 마크업
생성기 사용으로 인해 어느 정도 불가피하게 발생할 수 있는 오류까지 포함하여 모든 적합성 오류를
보고하는 사용자 옵션이 있을 수 있다.)
iframe 요소
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
src — 리소스의
주소
srcdoc — iframe에
렌더링할 문서
name — 콘텐츠 내비게이션 가능 객체의 이름
sandbox — 중첩
콘텐츠에 대한 보안 규칙
allow — iframe의 콘텐츠에
적용할 권한
정책
allowfullscreen
— iframe의 콘텐츠가
requestFullscreen()을
사용하도록
허용할지 여부
width — 가로 치수
height — 세로 치수
referrerpolicy
— 요소가 시작한 가져오기에 대한 리퍼러
정책
loading — 로딩
지연을 결정할 때 사용됨
[Exposed =Window ]
interface HTMLIFrameElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , ReflectURL ] attribute USVString src ;
[CEReactions ] attribute (TrustedHTML or DOMString ) srcdoc ;
[CEReactions , Reflect ] attribute DOMString name ;
[SameObject , PutForwards =value , Reflect ] readonly attribute DOMTokenList sandbox ;
[CEReactions , Reflect ] attribute DOMString allow ;
[CEReactions , Reflect ] attribute boolean allowFullscreen ;
[CEReactions , Reflect ] attribute DOMString width ;
[CEReactions , Reflect ] attribute DOMString height ;
[CEReactions ] attribute DOMString referrerPolicy ;
[CEReactions ] attribute DOMString loading ;
readonly attribute Document ? contentDocument ;
readonly attribute WindowProxy ? contentWindow ;
Document ? getSVGDocument ();
// also has obsolete members
};
iframe 요소는 자신의 콘텐츠 내비게이션 가능 객체를 나타낸다.
src 속성은
요소의 콘텐츠 내비게이션 가능 객체가
포함할 페이지의 URL을 제공한다. 속성이 있는 경우 공백으로 둘러싸일 수 있는
유효한 비어 있지 않은 URL이어야 한다. iframe 요소에
itemprop
속성이 지정된 경우
src 속성도
지정해야 한다.
현재의 모든 엔진에서 지원된다.
srcdoc
속성은 요소의 콘텐츠 내비게이션 가능 객체가
포함할 페이지의 콘텐츠를 제공한다. 속성 값은 구성에 사용되어 iframe srcdoc 문서를 만들며, 이는
URL이 about:srcdoc과 일치하는
Document이다.
위 요구 사항은 XML 문서에도 적용된다.
여기서 블로그는 아래에 설명된 sandbox
속성과 함께 srcdoc 속성을
사용하여,
이 기능을 지원하는 사용자 에이전트의 사용자에게 블로그 게시물 댓글의 스크립트
삽입으로부터 추가 보호 계층을 제공한다:
< article >
< h1 > I got my own magazine!</ h1 >
< p > After much effort, I've finally found a publisher, and so now I
have my own magazine! Isn't that awesome?! The first issue will come
out in September, and we have articles about getting food, and about
getting in boxes, it's going to be great!</ p >
< footer >
< p > Written by < a href = "/users/cap" > cap</ a > , 1 hour ago.
</ footer >
< article >
< footer > Thirteen minutes ago, < a href = "/users/ch" > ch</ a > wrote: </ footer >
< iframe sandbox srcdoc = "<p>did you get a cover picture yet?" ></ iframe >
</ article >
< article >
< footer > Nine minutes ago, < a href = "/users/cap" > cap</ a > wrote: </ footer >
< iframe sandbox srcdoc = "<p>Yeah, you can see it <a href="/gallery?mode=cover&amp;page=1">in my gallery</a>." ></ iframe >
</ article >
< article >
< footer > Five minutes ago, < a href = "/users/ch" > ch</ a > wrote: </ footer >
< iframe sandbox srcdoc = "<p>hey that's earl's table.
<p>you should get earl&amp;me on the next cover." ></ iframe >
</ article >
따옴표를 이스케이프해야 하는 방식(그렇지 않으면 srcdoc 속성이
조기에 종료됨)과 샌드박스된 콘텐츠에 언급된 원시
앰퍼샌드(예: URL 또는 산문 안)가 이중으로 이스케이프되어야 하는 방식에 유의한다.
처음에는 srcdoc 속성을
구문 분석할 때 앰퍼샌드를 보존하기 위해 한 번, 그리고
샌드박스된 콘텐츠를 구문 분석할 때 앰퍼샌드가 잘못 해석되는 것을 방지하기 위해 한 번 더 이스케이프한다.
또한 iframe
srcdoc 문서에서는 DOCTYPE이
선택 사항이고,
html,
head 및 body 요소에는 선택 가능한
시작 및 종료 태그가 있으며, iframe
srcdoc
문서에서는 title 요소도 선택
사항이므로,
srcdoc 속성의 마크업은
전체 문서를 나타내더라도 비교적 간결할 수 있다. 구문에는 body 요소의 콘텐츠만
문자 그대로 나타나면 되기 때문이다. 다른 요소도 여전히 존재하지만 암시적으로만 존재한다.
HTML 구문에서 작성자는 속성 콘텐츠를 감쌀 때
U+0022 QUOTATION MARK 문자(")를 사용한 뒤 모든 U+0026
AMPERSAND(&) 및 U+0022 QUOTATION MARK(") 문자를 이스케이프하고 sandbox 속성을 지정하면
콘텐츠를 안전하게 임베드할 수 있다는 점만 기억하면 된다. (또한 따옴표보다 앰퍼샌드를 먼저
이스케이프하여 따옴표가 &quot;가 아니라 "가 되도록 해야 한다.)
XML에서는 U+003C LESS-THAN SIGN 문자(<)도 이스케이프해야 한다. 속성 값 정규화를 방지하려면 XML의 일부 공백 문자, 특히 U+0009 CHARACTER TABULATION(tab), U+000A LINE FEED(LF) 및 U+000D CARRIAGE RETURN(CR)도 이스케이프해야 한다. [XML]
src
속성과 srcdoc
속성이 함께 지정된 경우 srcdoc 속성이
우선한다. 이를 통해 작성자는 srcdoc
속성을 지원하지 않는
레거시 사용자 에이전트에 대한 대체 URL을 제공할 수 있다.
insertedNode가 주어졌을 때 iframe의 HTML
요소 연결 후 단계는 다음과 같다:
insertedNode에 sandbox
속성이 있으면 속성 값과 insertedNode의
iframe
샌드박스 플래그 집합이 주어졌을 때 샌드박스 지시문을
구문 분석한다.
insertedNode에 대해 새로운 자식 내비게이션 가능 객체를 생성한다.
insertedNode에 대해 initialInsertion을 true로 설정하여
iframe
속성을 처리한다.
removedNode가 주어졌을 때 iframe의 HTML 요소 제거
단계는 removedNode가 주어졌을 때 자식 내비게이션 가능 객체를 파괴하는 것이다.
이는 unload 이벤트가 발생하지 않은
상태에서
일어난다(요소의 콘텐츠
문서는 언로드되는 것이 아니라 파괴된다).
위에 따라 iframe은 섀도 트리 안에 있을 때 처리되지만,
그 동작의 여러 다른 측면은 섀도 트리와 관련하여 명확하게 정의되지 않았다.
자세한 내용은 이슈 #763을 참조한다.
null이 아닌 콘텐츠
내비게이션 가능 객체를 가진 iframe
요소의 srcdoc 속성이 설정,
변경 또는 제거될 때마다 사용자 에이전트는 iframe 속성을 처리해야 한다.
마찬가지로 null이 아닌 콘텐츠
내비게이션 가능 객체를 가지지만 srcdoc 속성이
지정되지 않은 iframe 요소의
src 속성이 설정,
변경 또는 제거될 때마다 사용자 에이전트는 iframe 속성을 처리해야 한다.
요소 element에 대해 선택적 불리언 initialInsertion
(기본값 false)과 함께 iframe 속성을 처리하려면:
element의 srcdoc 속성이
지정되어 있으면:
element의 현재 내비게이션이 지연 로드됨 불리언을 false로 설정한다.
element이 주어졌을 때 요소를 지연 로드할지 결정하는 단계가 true를 반환하면:
element의 지연 로드 재개 단계를 srcdoc 리소스로 내비게이션이라고 표시된 단계부터 시작하는 이 알고리즘의 나머지 부분으로 설정한다.
element의 현재 내비게이션이 지연 로드됨 불리언을 true로 설정한다.
element에 대해 지연 로딩 요소의 교차 관찰을 시작한다.
반환한다.
srcdoc 리소스로 내비게이션: element, about:srcdoc, 빈
문자열 및 element의 srcdoc
속성 값이 주어졌을 때 iframe 또는
frame을 내비게이션한다.
그 결과인 Document는
iframe
srcdoc 문서로 간주해야 한다.
그렇지 않으면:
url을 element와
initialInsertion이 주어졌을 때 iframe
및 frame 요소의
공유 속성 처리 단계를 실행한 결과로 둔다.
url이 null이면 반환한다.
url이 about:blank과
일치하고
initialInsertion이 true이면:
element이 주어졌을 때 iframe load 이벤트 단계를 실행한다.
반환한다.
referrerPolicy를 element의 referrerpolicy
콘텐츠 속성의 현재 상태로 둔다.
element의 현재 내비게이션이 지연 로드됨 불리언을 false로 설정한다.
element이 주어졌을 때 요소를 지연 로드할지 결정하는 단계가 true를 반환하면:
element의 지연 로드 재개 단계를 내비게이션이라고 표시된 단계부터 시작하는 이 알고리즘의 나머지 부분으로 설정한다.
element의 현재 내비게이션이 지연 로드됨 불리언을 true로 설정한다.
element에 대해 지연 로딩 요소의 교차 관찰을 시작한다.
반환한다.
내비게이션: element, url 및 referrerPolicy가
주어졌을 때 iframe 또는
frame을 내비게이션한다.
요소
element와 불리언 initialInsertion이 주어졌을 때 iframe 및 frame
요소의
공유 속성 처리 단계는 다음과 같다:
url을 URL 레코드 about:blank로 둔다.
element에 src
속성이 지정되어 있고
그 값이 빈 문자열이 아니면:
maybeURL을 해당 속성 값과 element의 노드 문서를 기준으로 URL을 인코딩 구문 분석한 결과로 둔다.
maybeURL이 실패가 아니면 url을 maybeURL로 설정한다.
element의 노드 내비게이션 가능 객체의 포괄적 조상 내비게이션 가능 객체에 활성 문서의 URL이 프래그먼트 제외를 true로 설정했을 때 url과 같은 내비게이션 가능 객체가 포함되면 null을 반환한다.
url이 about:blank과
일치하고
initialInsertion이 true이면 element의 콘텐츠
내비게이션 가능 객체의 활성
문서와 url이 주어졌을 때 URL 및 이력 업데이트 단계를 수행한다.
이는 url이 about:blank?foo와 같은 경우에 필요하다.
url이 단순한 about:blank이면 아무 작업도 하지 않는다.
url을 반환한다.
요소
element, URL url, 리퍼러
정책
referrerPolicy, 선택적 문자열 또는 null srcdocString(기본값
null), 선택적 불리언 initialInsertion(기본값 false)이 주어졌을 때
iframe 또는 frame을 내비게이션하려면:
historyHandling을 "auto"로
둔다.
element의 콘텐츠
내비게이션 가능 객체의 활성 문서가 완전히 로드되지 않았으면
historyHandling을 "replace"로
설정한다.
element이 iframe이면:
element의 대기 중인 리소스 타이밍 시작 시간을 element의 노드 문서의 관련 전역 객체가 주어졌을 때 현재 고해상도 시간으로 설정한다.
element의 대기 중인 리소스 타이밍 URL을 url로 설정한다.
element의 노드 문서를 사용하여 element의 콘텐츠 내비게이션 가능 객체를 url로 내비게이션하며, historyHandling을 historyHandling로 설정하고, referrerPolicy를 referrerPolicy로 설정하며, documentResource를 srcdocString으로 설정하고, initialInsertion을 initialInsertion으로 설정한다.
각 Document에는 iframe 로드 진행 중 플래그와 iframe
로드 음소거 플래그가 있다. Document가
생성될 때 해당 Document에 대해
이 플래그들을 해제해야 한다.
iframe 요소
element이 주어졌을 때 iframe load 이벤트 단계를 실행하려면:
단언: element의 콘텐츠 내비게이션 가능 객체는 null이 아니다.
childDocument를 element의 콘텐츠 내비게이션 가능 객체의 활성 문서로 둔다.
childDocument의 iframe 로드 음소거 플래그가 설정되어 있으면 반환한다.
element의 대기 중인 리소스 타이밍 시작 시간이 null이 아니면:
단언: element의 대기 중인 리소스 타이밍 URL은 null이 아니다.
fallbackTimingInfo를 시작 시간이 element의 대기 중인 리소스 타이밍 시작 시간이고, 응답 종료 시간이 global이 주어졌을 때 현재 고해상도 시간인 새로운 가져오기 타이밍 정보로 둔다.
fallbackTimingInfo,
element의 대기 중인 리소스 타이밍 URL을
구문 분석한 결과,
"iframe",
global, 빈 문자열, 새로운
응답 본문 정보 및 0이 주어졌을 때
리소스 타이밍을 표시한다.
element의 대기 중인 리소스 타이밍 시작 시간을 null로 설정한다.
element의 대기 중인 리소스 타이밍 URL을 null로 설정한다.
childDocument의 iframe 로드 진행 중 플래그를 설정한다.
childDocument의 iframe 로드 진행 중 플래그를 해제한다.
이는 스크립팅과 함께 사용하여 로컬 네트워크 HTTP 서버의 URL 공간을 조사하는 데 사용할 수 있다. 사용자 에이전트는 이 공격을 완화하기 위해 위에 설명된 것보다 더 엄격한 교차 출처 접근 제어 정책을 구현할 수 있지만, 안타깝게도 이러한 정책은 일반적으로 기존 웹 콘텐츠와 호환되지 않는다.
요소 유형이 load 이벤트를 잠재적으로 지연시키는 경우, 해당 유형의 각 요소 element에 대해 element의 콘텐츠 내비게이션 가능 객체가 null이 아니고 다음 중 하나가 true이면 사용자 에이전트는 element의 노드 문서의 load 이벤트를 지연해야 한다:
element의 콘텐츠 내비게이션 가능 객체의 활성 문서가 로드 후 태스크를 수행할 준비가 되지 않았다.
element의 콘텐츠
내비게이션 가능 객체의 load
이벤트를 지연 중인지 여부가 true이다. 또는
무언가가 element의 콘텐츠 내비게이션 가능 객체의 활성 문서의 load 이벤트를 지연하고 있다.
load 이벤트를 처리하는 동안
element의 콘텐츠
내비게이션 가능 객체가 다시 내비게이션되면
load 이벤트가 추가로 지연된다.
각 iframe 요소에는
처음에 false인 현재 내비게이션이 지연
로드됨 불리언이 연결되어 있다. 이 값은 iframe
속성 처리 알고리즘에서 설정되고 해제된다.
현재
내비게이션이 지연 로드됨 불리언이
false인 iframe 요소는
load 이벤트를
잠재적으로 지연시킨다.
각 iframe 요소에는
처음에 null로 설정되는 연결된 null 또는
DOMHighResTimeStamp 대기 중인 리소스 타이밍 시작 시간이 있다.
각 iframe 요소에는
처음에 null로 설정되는 연결된 null 또는
URL 대기 중인 리소스 타이밍 URL이 있다.
요소가 생성될 때 srcdoc 속성이
설정되지 않고 src 속성도
설정되지 않았거나 설정되었지만 그 값을 구문 분석할
수 없으면 요소의 콘텐츠
내비게이션 가능 객체는 초기
about:blank Document에
남는다.
사용자가 이 페이지에서 벗어나도록 내비게이션하면
iframe의 콘텐츠 내비게이션 가능 객체의 활성
WindowProxy 객체는 새로운
Document 객체를 위한 새로운 Window 객체를 프록시하지만 src 속성은
변경되지 않는다.
name
속성이 있는 경우 유효한 내비게이션 가능 대상
이름이어야 한다.
주어진 값은 요소의 콘텐츠
내비게이션 가능 객체가 생성될 때 존재하는 경우 그 이름을 지정하는 데
사용된다.
현재의 모든 엔진에서 지원된다.
sandbox
속성을 지정하면 iframe이
호스팅하는 모든 콘텐츠에 추가 제한 집합이 적용된다. 그 값은 고유한 공백 구분 토큰의 순서 없는 집합이어야 하며,
토큰은 ASCII
대소문자를 구분하지 않는다. 허용되는 값은 다음과 같다:
allow-downloads
allow-forms
allow-modals
allow-orientation-lock
allow-pointer-lock
allow-popups
allow-popups-to-escape-sandbox
allow-presentation
allow-same-origin
allow-scripts
allow-top-navigation
allow-top-navigation-by-user-activation
allow-top-navigation-to-custom-protocols
속성이 설정되면 콘텐츠는 고유한 불투명 출처에서 온 것으로
취급되고, 폼, 스크립트 및 잠재적으로
성가신 여러 API가 비활성화되며, 링크가 다른 내비게이션 가능 객체를 대상으로 삼지 못하게 된다.
allow-same-origin
키워드는 콘텐츠를 불투명 출처로 강제하는 대신 실제
출처에서 온 것으로
취급하게 한다. allow-top-navigation
키워드는 콘텐츠가 자신의 순회 가능 내비게이션 가능 객체를 내비게이션하도록 허용한다.
allow-top-navigation-by-user-activation
키워드는 비슷하게 동작하지만 브라우징 컨텍스트의 활성 창에 일시적
활성화가 있을 때만 이러한 내비게이션을 허용한다.
allow-top-navigation-to-custom-protocols
키워드는 가져오기 스킴이 아닌 대상으로 향하는 내비게이션을
외부
소프트웨어에 넘기도록 다시 활성화한다. 그리고 allow-forms,
allow-modals,
allow-orientation-lock,
allow-pointer-lock,
allow-popups,
allow-presentation,
allow-scripts
및
allow-popups-to-escape-sandbox
키워드는 각각 폼, 모달 대화 상자, 화면 방향 잠금, 포인터 잠금 API, 팝업,
프레젠테이션 API, 스크립트 및 샌드박스되지 않은 보조 브라우징 컨텍스트의 생성을 다시 활성화한다. allow-downloads
키워드는 콘텐츠가 다운로드를 수행하도록 허용한다. [POINTERLOCK] [SCREENORIENTATION] [PRESENTATION]
allow-top-navigation
및 allow-top-navigation-by-user-activation
키워드를 둘 다 지정해서는 안 된다. 그렇게 하면 중복되며, 이러한 준수하지 않는 마크업에서는
allow-top-navigation만
효과가 있다.
마찬가지로 allow-top-navigation-to-custom-protocols
키워드는 allow-top-navigation
또는 allow-popups
중 하나가 지정된 경우 중복되므로 지정해서는 안 된다.
샌드박스된 콘텐츠 안에서 alert(),
confirm() 및 prompt()를 허용하려면
allow-modals
및 allow-same-origin
키워드를 모두 지정해야 하고, 로드된 URL은 최상위
출처와 동일 출처여야 한다. allow-same-origin
키워드가 없으면 콘텐츠는
항상 교차 출처로 취급되며 교차 출처 콘텐츠는 단순
대화 상자를 표시할 수 없다.
임베드된 페이지가 iframe을
포함하는 페이지와 동일 출처일 때 allow-scripts
및 allow-same-origin
키워드를 함께 설정하면
임베드된 페이지가 단순히 sandbox
속성을 제거한 뒤 자신을 다시 로드하여 사실상 샌드박스에서 완전히 벗어날 수 있다.
이러한 플래그는 iframe 요소의
콘텐츠 내비게이션 가능 객체가 내비게이션될 때만 효과가 있다. 이들을 제거하거나
전체 sandbox 속성을 제거해도
이미 로드된 페이지에는 효과가 없다.
잠재적으로 적대적인 파일은 iframe
요소를 포함하는 파일과 같은 서버에서 제공해서는 안 된다. 공격자가 사용자를 설득하여
iframe 안이 아니라
적대적 콘텐츠를 직접 방문하게 할 수 있다면 적대적 콘텐츠를 샌드박스하는 것은 거의 도움이 되지 않는다.
적대적 HTML 콘텐츠가 일으킬 수 있는 피해를 제한하려면 별도의 전용 도메인에서 제공해야 한다.
다른 도메인을 사용하면 사용자가 sandbox
속성의 보호 없이 해당 페이지를 직접 방문하도록 속더라도 파일의 스크립트가 사이트를 공격할 수 없게 된다.
null이 아닌 콘텐츠 내비게이션 가능 객체를 가진 동안
iframe
요소의 sandbox
속성이 설정되거나 변경되면 사용자 에이전트는 속성 값과 iframe 요소의 iframe
샌드박스 플래그 집합이 주어졌을 때 샌드박스 지시문을 구문 분석해야 한다.
null이 아닌 콘텐츠 내비게이션 가능 객체를 가진 동안
iframe
요소의 sandbox
속성이 제거되면 사용자 에이전트는 iframe
요소의 iframe
샌드박스 플래그 집합을 비워야 한다.
이 예제에서는 완전히 알 수 없고 잠재적으로 적대적인 사용자 제공 HTML 콘텐츠가 페이지에 임베드된다. 별도의 도메인에서 제공되므로 일반적인 모든 교차 사이트 제한의 영향을 받는다. 또한 임베드된 페이지는 스크립팅, 플러그인 및 폼이 비활성화되며 자신(또는 자신이 임베드한 프레임이나 창) 이외의 프레임이나 창을 내비게이션할 수 없다.
< p > We're not scared of you! Here is your content, unedited:</ p >
< iframe sandbox src = "https://usercontent.example.net/getusercontent.cgi?id=12193" ></ iframe >
공격자가 사용자를 설득하여 해당 페이지를 직접 방문하게 하더라도 페이지가 사이트 출처의 컨텍스트에서 실행되지 않도록 별도의 도메인을 사용하는 것이 중요하다. 그렇지 않으면 사용자가 페이지에서 발견되는 모든 공격에 취약해진다.
이 예제에서는 다른 사이트의 가젯이 임베드된다. 가젯은 스크립팅과 폼이 활성화되어 있고 출처 샌드박스 제한이 해제되어 가젯이 원래 서버와 통신할 수 있다. 그러나 샌드박스는 플러그인과 팝업을 비활성화하므로 사용자가 악성 코드 및 기타 불편에 노출될 위험을 줄인다는 점에서 여전히 유용하다.
< iframe sandbox = "allow-same-origin allow-forms allow-scripts"
src = "https://maps.example.com/embedded.html" ></ iframe >
파일 A에 다음 조각이 포함되어 있다고 가정한다:
< iframe sandbox = "allow-same-origin allow-forms" src = B ></ iframe >
파일 B에도 iframe이 포함되어 있다고 가정한다:
< iframe sandbox = "allow-scripts" src = C ></ iframe >
또한 파일 C에 링크가 포함되어 있다고 가정한다:
< a href = D > Link</ a >
이 예제에서는 모든 파일이 text/html로 제공되었다고 가정한다.
이 시나리오의 페이지 C에는 모든 샌드박스 플래그가 설정되어 있다. A의
iframe에서
스크립트가 비활성화되어 있고 이것이 B의
iframe에 설정된
allow-scripts
키워드를 재정의하므로 스크립트가 비활성화된다. 내부 iframe(B에 있음)에
allow-forms
키워드가 설정되어 있지 않으므로 폼도 비활성화된다.
이제 A의 스크립트가 A와 B의 모든 sandbox 속성을 제거한다고
가정한다. 이는 즉시 아무것도 변경하지 않는다. 사용자가 C의 링크를 클릭하여 페이지 D를
B의 iframe에 로드하면
페이지 D는 이제 B의 iframe에
allow-same-origin
및 allow-forms
키워드가 설정된 것처럼 동작한다. 이는 페이지 B가 로드될 때 A의 iframe의
콘텐츠 내비게이션 가능 객체 상태가
그러했기 때문이다.
일반적으로 sandbox 속성을
동적으로 제거하거나 변경하는 것은 권장되지 않는다. 무엇이 허용되고 무엇이 허용되지 않는지
추론하기가 상당히 어려워질 수 있기 때문이다.
allow
속성을 지정하면 iframe의 콘텐츠 내비게이션 가능 객체에 있는
Document의
권한
정책이 초기화될 때 사용할 컨테이너
정책을 결정한다.
그 값은 직렬화된 권한
정책이어야 한다. [PERMISSIONSPOLICY]
이 예제에서는 iframe을 사용하여
온라인 내비게이션
서비스의 지도를 임베드한다. 중첩된 컨텍스트 안에서 Geolocation API를 활성화하기 위해
allow
속성을 사용한다.
< iframe src = "https://maps.example.com/" allow = "geolocation" ></ iframe >
allowfullscreen 속성은 불리언
속성이다. 이를 지정하면 iframe 요소의 콘텐츠 내비게이션 가능 객체에 있는
Document 객체가
모든 출처에서 "fullscreen" 기능을 사용할 수
있게 하는
권한
정책으로 초기화됨을 나타낸다.
이는 권한 정책 속성 처리 알고리즘에 의해 적용된다.
[PERMISSIONSPOLICY]
여기서는 iframe을
사용하여 동영상 사이트의 플레이어를 임베드한다. 플레이어가 동영상을 전체 화면으로 표시할 수 있게 하려면
allowfullscreen
속성이 필요하다.
< article >
< header >
< p >< img src = "/usericons/1627591962735" > < b > Fred Flintstone</ b ></ p >
< p >< a href = "/posts/3095182851" rel = bookmark > 12:44</ a > — < a href = "#acl-3095182851" > Private Post</ a ></ p >
</ header >
< p > Check out my new ride!</ p >
< iframe src = "https://video.example.com/embed?id=92469812" allowfullscreen ></ iframe >
</ article >
요소의 노드
문서가 해당 기능을 사용할 수 있도록 이미 허용되지 않은 경우 allow와 allowfullscreen
중 어느 것도 iframe 요소의
콘텐츠 내비게이션 가능 객체에서
기능에 대한 접근 권한을 부여할 수 없다.
Document 객체
document가
정책 제어 기능 feature를 사용하도록 허용되는지
결정하려면 다음 단계를 실행한다:
document의 브라우징 컨텍스트가 null이면 false를 반환한다.
document가 완전히 활성 상태가 아니면 false를 반환한다.
feature, document 및 document의 출처에 대해 출처에 대해 문서에서 기능이
활성화되었는지 여부를 실행한 결과가 "Enabled"이면
true를 반환한다.
false를 반환한다.
allow 및
allowfullscreen
속성은 콘텐츠
내비게이션 가능 객체의 활성 문서의
권한
정책에만 영향을 주므로
iframe의
콘텐츠 내비게이션 가능 객체가
내비게이션될 때만 효과가 있다.
이들을 추가하거나 제거해도 이미 로드된 문서에는 효과가 없다.
iframe 요소는
임베드된 콘텐츠에 특정 치수가 있는 경우(예: 광고 단위의 치수가 잘 정의됨)를 위해
치수 속성을 지원한다.
iframe 요소는
지정된 초기 콘텐츠가 성공적으로 사용되는지와 관계없이 항상
새로운 자식
내비게이션 가능 객체를 생성하므로 대체 콘텐츠를 절대로 가지지
않는다.
referrerpolicy 속성은
리퍼러 정책
속성이다. 그 목적은 iframe
속성을 처리할 때 사용되는 리퍼러
정책을 설정하고, 내부 조상 출처 객체 목록 생성
단계에서 일부 출처를
마스킹할 수 있게 하는 것이다. [REFERRERPOLICY]
loading
속성은 지연
로딩 속성이다. 그 목적은 뷰포트 밖에 있는 iframe
요소를 로드하는 정책을 나타내는 것이다.
loading
속성의 상태가 즉시 로드 상태로 변경되면
사용자 에이전트는 다음
단계를 실행해야 한다:
resumptionSteps를 iframe 요소의 지연 로드
재개 단계로 둔다.
resumptionSteps가 null이면 반환한다.
iframe의
지연 로드
재개 단계를 null로 설정한다.
resumptionSteps를 호출한다.
iframe
요소의 자손은 아무것도 나타내지 않는다. (iframe
요소를 지원하지 않는 레거시 사용자 에이전트에서는 콘텐츠가
대체 콘텐츠로 작동할 수 있는 마크업으로 구문 분석된다.)
HTML 파서는
iframe 요소 안의
마크업을 텍스트로 취급한다.
현재의 모든 엔진에서 지원된다.
srcdoc
getter 단계는 다음과 같다:
attribute를 null, srcdoc의 로컬
이름 및 this가 주어졌을 때 네임스페이스와 로컬
이름으로 속성을 가져온 결과로 둔다.
attribute가 null이면 빈 문자열을 반환한다.
attribute의 값을 반환한다.
srcdoc setter 단계는
다음과 같다:
compliantString을 TrustedHTML,
this의
관련 전역
객체, 주어진 값, "HTMLIFrameElement srcdoc" 및 "script"를 사용하여
신뢰할 수 있는 유형
준수 문자열 가져오기 알고리즘을 호출한 결과로 둔다.
sandbox의 DOMTokenList에
대한
지원되는 토큰은
sandbox 속성에 정의되고
사용자 에이전트가 지원하는 허용 값이다.
HTMLIFrameElement/referrerPolicy
현재의 모든 엔진에서 지원된다.
referrerPolicy IDL 속성은 referrerpolicy
콘텐츠 속성을 반영해야 하며,
알려진 값으로만
제한된다.
loading IDL 속성은 loading 콘텐츠
속성을 반영해야 하며, 알려진
값으로만 제한된다.
HTMLIFrameElement/contentDocument
현재의 모든 엔진에서 지원된다.
HTMLIFrameElement/contentWindow
현재의 모든 엔진에서 지원된다.
다음은 iframe을 사용하여
광고 중개업체의 광고를 포함하는 페이지의 예이다:
< iframe src = "https://ads.example.com/?customerid=923513721&format=banner"
width = "468" height = "60" ></ iframe >
embed
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
src — 리소스의 주소
type — 임베디드
리소스의 유형
width — 가로 치수
height — 세로 치수
[Exposed =Window ]
interface HTMLEmbedElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , ReflectURL ] attribute USVString src ;
[CEReactions , Reflect ] attribute DOMString type ;
[CEReactions , Reflect ] attribute DOMString width ;
[CEReactions , Reflect ] attribute DOMString height ;
Document ? getSVGDocument ();
// also has obsolete members
};
embed 요소는
외부 애플리케이션 또는 대화형 콘텐츠를 위한
통합 지점을 제공한다.
src 속성은
임베드되는 리소스의 URL을 제공한다. 속성이 있는 경우
공백으로 둘러싸일 수 있는
유효한 비어 있지 않은 URL을 포함해야 한다.
embed 요소에
itemprop
속성이 지정된 경우
src 속성도
지정해야 한다.
type 속성이
있는 경우 인스턴스화할 플러그인을 선택하는 데 사용되는 MIME 유형을 제공한다. 값은 유효한 MIME 유형
문자열이어야 한다. type
속성과 src
속성이 모두 있는 경우 type 속성은
src
속성이 제공한 리소스의 명시적 Content-Type 메타데이터와
동일한 유형을 지정해야 한다.
embed 요소는
다음 조건이 모두 동시에 충족될 때 잠재적으로
활성 상태라고 한다:
잠재적으로
활성 상태가 아니었던 embed
요소가 잠재적으로
활성 상태가 될 때마다, 그리고 잠재적으로 활성
상태를 유지하는 embed 요소의
src 속성이 설정,
변경 또는 제거되거나 type 속성이 설정, 변경
또는
제거될 때마다 사용자 에이전트는 해당 요소가 주어졌을 때
embed 태스크 소스에서 요소 태스크를 큐에 넣어 그 요소에 대한 embed
요소 설정 단계를 실행해야 한다.
주어진 embed 요소
element에 대한 embed 요소 설정 단계는
다음과 같다:
그 이후 element에 대해 embed 요소 설정 단계를 실행할
다른 태스크가 큐에 들어갔다면 반환한다.
element에 src
속성이 설정되어 있으면:
url을 element의 src 속성 값과
element의 노드
문서를 기준으로 URL을 인코딩 구문
분석한 결과로 둔다.
url이 실패이면 반환한다.
request를 URL이
url이고, 클라이언트가
element의 노드
문서의 관련 설정
객체이고, 대상이
"embed"이며,
자격 증명 모드가 "include"이고, 모드가 "navigate"이며, 개시자
유형이 "embed"이고, URL 자격 증명 사용 플래그가
설정된 새로운 요청으로 둔다.
request를 가져오기하되, processResponse를 응답 response가 주어졌을 때 다음 단계로 설정한다:
그 이후 element에 대해 embed 요소 설정 단계를
실행할 다른 태스크가
큐에 들어갔다면 반환한다.
type을 element와 response가 주어졌을 때 콘텐츠 유형을 결정한 결과로 둔다.
type에 따라 전환한다:
element에 대해 플러그인 없음을 표시한다.
element의 콘텐츠 내비게이션 가능 객체가 null이면 element에 대해 새로운 자식 내비게이션 가능 객체를 생성한다.
element의 노드
문서를 사용하여
element의 콘텐츠
내비게이션 가능 객체를 response의 URL로
내비게이션하되, response를
response로 설정하고 historyHandling을 "replace"로
설정한다.
element의 콘텐츠 내비게이션 가능 객체가
다른 위치로 추가로 내비게이션되더라도 element의 src 속성은
업데이트되지 않는다.
이제 element는 자신의 콘텐츠 내비게이션 가능 객체를 나타낸다.
리소스를 가져오는 것은 element의 노드 문서의 load 이벤트를 지연해야 한다.
그렇지 않으면 element에 대해 플러그인 없음을 표시한다.
embed 요소
element와 응답 response가
주어졌을 때 콘텐츠 유형을 결정하려면 다음 단계를 실행한다:
element에 type
속성이 있고 그
속성 값이 플러그인이 지원하는 유형이면
type 속성 값을
반환한다.
response의 url의 경로 구성 요소가 플러그인이 지원하는 패턴과 일치하면 해당 플러그인이 처리할 수 있는 유형을 반환한다.
예를 들어 플러그인은 네 문자 문자열
".swf"로 끝나는 경로 구성 요소를 가진 URL을 처리할 수 있다고
명시할 수 있다.
response에 명시적 Content-Type 메타데이터가 있고 그 값이 플러그인이 지원하는 유형이면 그 값을 반환한다.
null을 반환한다.
위 알고리즘에서 response가 정상 상태가 아니어도 허용하는 것은 의도된 것이다. 이를 통해 서버는 오류 응답에서도 플러그인용 데이터를 반환할 수 있다(예: HTTP 500 Internal Server Error 코드에도 플러그인 데이터가 포함될 수 있다).
embed 요소
element에 대해 플러그인 없음을 표시하려면:
element가 주어졌을 때 자식 내비게이션 가능 객체를 파괴한다.
element에 대한 플러그인을 찾을 수 없다는 표시를 element의 콘텐츠로 표시한다.
이제 element는 아무것도 나타내지 않는다.
embed
요소에는 대체 콘텐츠가 없으며,
그 자손은 무시된다.
잠재적으로
활성 상태였던 embed
요소가 잠재적으로
활성 상태이기를 멈출 때마다 그 요소에 대해 인스턴스화되었던 모든
플러그인을 언로드해야 한다.
embed 요소는
load 이벤트를
잠재적으로 지연시킨다.
object
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
data — 리소스의
주소
type — 임베디드
리소스의 유형
name — 콘텐츠 내비게이션 가능 객체의 이름
form — 요소를
form 요소와 연결
width — 가로 치수
height — 세로 치수
[Exposed =Window ]
interface HTMLObjectElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , ReflectURL ] attribute USVString data ;
[CEReactions , Reflect ] attribute DOMString type ;
[CEReactions , Reflect ] attribute DOMString name ;
readonly attribute HTMLFormElement ? form ;
[CEReactions , Reflect ] attribute DOMString width ;
[CEReactions , Reflect ] attribute DOMString height ;
readonly attribute Document ? contentDocument ;
readonly attribute WindowProxy ? contentWindow ;
Document ? getSVGDocument ();
readonly attribute boolean willValidate ;
readonly attribute ValidityState validity ;
readonly attribute DOMString validationMessage ;
boolean checkValidity ();
boolean reportValidity ();
undefined setCustomValidity (DOMString error );
// also has obsolete members
};
object 요소가
인스턴스화한 콘텐츠의 유형에 따라 노드는 다른
인터페이스도 지원한다.
object 요소는
외부 리소스를 나타낼 수 있으며, 리소스 유형에 따라
이미지 또는 자식
내비게이션 가능 객체로 취급된다.
data 속성은
리소스의 URL을
지정한다. 이 속성은 반드시 존재해야 하며
공백으로 둘러싸일 수 있는
유효한 비어 있지 않은 URL을 포함해야 한다.
type
속성이
있는 경우 리소스의 유형을 지정한다. 속성이 있는 경우 유효한
MIME 유형 문자열이어야 한다.
name
속성이 있는 경우 유효한 내비게이션 가능 대상
이름이어야 한다.
주어진 값은 해당하는 경우 요소의 콘텐츠
내비게이션 가능 객체의 이름을 지정하는 데 사용되며, 요소의 콘텐츠
내비게이션 가능 객체가 생성될 때
존재하는 경우에 적용된다.
다음 조건 중 하나가 발생할 때마다:
object 요소 중
하나가
자신의 대체 콘텐츠를 표시하는 상태로 또는 그 상태에서 변경된다.
classid 속성이
설정, 변경 또는 제거된다.
classid 속성이
존재하지 않고
data 속성이
설정, 변경 또는 제거된다.
classid 속성과
data 속성이
모두 존재하지 않고 type
속성이 설정, 변경 또는 제거된다.
...사용자 에이전트는 object
요소가 주어졌을 때
DOM 조작 태스크
소스에서 요소
태스크를 큐에 넣어, object
요소가 무엇을 나타내는지 (다시) 결정하기 위한 다음 단계를 실행해야 한다. 이 태스크가
큐에 들어가 있거나 실행 중이면
요소의 노드 문서의
load
이벤트를 지연해야 한다.
사용자가 이 object 요소의
일반적인
동작 대신 요소의 대체
콘텐츠를 표시하기를 선호한다고 나타낸 경우 아래의 대체라고 표시된 단계로 이동한다.
예를 들어 사용자는 요소의 대체 콘텐츠가 자신에게 더 접근하기 쉬운 형식을 사용하므로 이를 표시하도록 요청할 수 있다.
요소에 미디어
요소 조상이 있거나, 자신의 대체 콘텐츠를 표시하고
있지 않은
object 조상 요소가
있거나, 요소가 브라우징
컨텍스트가 null이 아닌 문서 안에 있지 않거나, 요소의 노드 문서가
완전히
활성 상태가 아니거나, 요소가 여전히 HTML 파서 또는 XML 파서의 열린 요소 스택에 있거나, 요소가 렌더링
중이 아니면 아래의 대체라고 표시된 단계로 이동한다.
data 속성이
존재하고 그 값이 빈 문자열이 아니면:
type
속성이 존재하고 그 값이 사용자 에이전트가 지원하는 유형이 아니면, 사용자 에이전트는
실제 유형을 검사하기 위해 콘텐츠를 가져오지 않고 아래의 대체라고 표시된 단계로
이동할 수 있다.
url을 data 속성 값과
요소의 노드
문서를 기준으로 URL을 인코딩
구문 분석한 결과로 둔다.
request를 URL이
url이고, 클라이언트가
요소의 노드
문서의
관련 설정
객체이고, 대상이 "object"이며,
자격 증명 모드가 "include"이고, 모드가 "navigate"이며, 개시자
유형이 "object"이고, URL 자격 증명 사용
플래그가 설정된 새로운 요청으로 둔다.
request를 가져오기한다.
리소스를 가져오는 것은 리소스가 가져와진 뒤(다음에 정의됨) 네트워킹 태스크 소스가 큐에 넣은 태스크가 실행될 때까지 요소의 노드 문서의 load 이벤트를 지연해야 한다.
리소스를 아직 사용할 수 없으면(예: 리소스가 캐시에 없어 리소스를 로드하기 위해 네트워크를 통해 요청해야 했기 때문) 아래의 대체라고 표시된 단계로 이동한다. 리소스를 사용할 수 있게 된 뒤 네트워킹 태스크 소스가 큐에 넣은 태스크는 이 단계부터 이 알고리즘을 다시 시작해야 한다. 리소스는 점진적으로 로드될 수 있으며, 사용자 에이전트는 리소스 처리를 시작하기에 충분한 데이터를 얻은 때마다 리소스를 "사용 가능"한 것으로 간주할 수 있다.
로드에 실패하면(예: HTTP 404 오류 또는 DNS 오류가 발생함) 요소에
error라는 이름의
이벤트를 발생시킨 뒤 아래의 대체라고 표시된
단계로 이동한다.
다음과 같이 리소스 유형을 결정한다:
리소스 유형을 알 수 없음으로 둔다.
사용자 에이전트가 이 리소스에 대해 Content-Type 헤더를 엄격히 따르도록 구성되어 있고, 리소스에 연결된 Content-Type 메타데이터가 있으면 리소스 유형을 리소스의 Content-Type 메타데이터에 지정된 유형으로 둔 뒤 아래의 처리기라고 표시된 단계로 이동한다.
이는 사이트가 특정 유형을 사용하는 리소스를 임베드하려 하지만 원격 사이트가 이를 재정의하고 대신 서로 다른 보안 특성을 가진 다른 유형의 콘텐츠를 작동시키는 리소스를 사용자 에이전트에 제공하는 취약성을 발생시킬 수 있다.
다음 목록에서 적절한 단계 집합을 실행한다:
binary를 false로 둔다.
리소스의 Content-Type
메타데이터에 지정된 유형이 "text/plain"이고,
리소스에 리소스가 텍스트인지
바이너리인지 구분하는 규칙을 적용한 결과 리소스가
text/plain이
아니면 binary를 true로 설정한다.
리소스의 Content-Type
메타데이터에 지정된 유형이 "application/octet-stream"이면
binary를 true로 설정한다.
binary가 false이면 리소스 유형을 리소스의 Content-Type 메타데이터에 지정된 유형으로 두고 아래의 처리기라고 표시된 단계로 이동한다.
object
요소에 type
속성이 존재하고 그 값이 application/octet-stream이
아니면 다음 단계를 실행한다:
속성 값이 "image/"로 시작하면서 XML MIME 유형이 아닌 유형이면
리소스 유형을 해당 type
속성에 지정된 유형으로 둔다.
아래의 처리기라고 표시된 단계로 이동한다.
object
요소에 type
속성이 존재하면 임시 유형을 해당 type
속성에 지정된 유형으로 둔다.
그렇지 않으면 임시 유형을 리소스의 계산된 유형으로 둔다.
임시 유형이
application/octet-stream이
아니면 리소스 유형을
임시 유형으로 두고 아래의
처리기라고 표시된 단계로 이동한다.
지정된 리소스의 URL(모든 리디렉션 이후)에 URL 파서 알고리즘을 적용한 결과, 경로 구성 요소가 플러그인이 지원하는 패턴과 일치하는 URL 레코드가 생성되면 리소스 유형을 해당 플러그인이 처리할 수 있는 유형으로 둔다.
예를 들어 플러그인은 네 문자 문자열
".swf"로 끝나는 경로 구성 요소를 가진 리소스를
처리할 수 있다고
명시할 수 있다.
이 단계가 끝났거나 위의 하위 단계 중 하나가 바로 다음 단계로 이동했을 때에도 리소스 유형이 여전히 알 수 없음일 수 있다. 두 경우 모두 다음 단계에서 대체 콘텐츠가 작동한다.
처리기: 다음 경우 중 처음으로 일치하는 경우에 따라 콘텐츠를 처리한다:
image/"로 시작하지 않는 경우object
요소의 콘텐츠
내비게이션 가능 객체가 null이면 요소에 대해
새로운 자식
내비게이션 가능 객체를 생성한다.
response의 URL이
about:blank과
일치하지 않으면 요소의 콘텐츠 내비게이션
가능 객체를
response의 URL로
요소의 노드 문서를
사용하여 내비게이션하되, historyHandling을
"replace"로
설정한다.
object
요소의 data 속성은
콘텐츠 내비게이션 가능 객체가 다른 위치로
추가로 내비게이션되더라도
업데이트되지 않는다.
object
요소는 자신의 콘텐츠
내비게이션 가능 객체를 나타낸다.
image/"로 시작하고 이미지
지원이 비활성화되지 않은 경우object
요소가 주어졌을 때 자식
내비게이션 가능 객체를 파괴한다.
이미지 유형을 결정하기 위해 이미지 스니핑 규칙을 적용한다.
이미지가 잘못 구성되었거나 지원되지 않는 형식이어서 렌더링할 수 없으면 아래의 대체라고 표시된 단계로 이동한다.
주어진 리소스 유형은 지원되지 않는다. 아래의 대체라고 표시된 단계로 이동한다.
이전 단계가 리소스 유형이 알 수 없음인 상태로 끝났다면 이 경우가 작동한다.
요소의 콘텐츠는 object 요소가
나타내는 것의 일부가 아니다.
object 요소가
자신의 콘텐츠
내비게이션 가능 객체를 나타내지 않으면, 리소스가 완전히 로드된 뒤
object 요소가
주어졌을 때 DOM
조작 태스크 소스에서 요소 태스크를
큐에 넣어
요소에 load라는 이름의
이벤트를 발생시킨다.
요소가 자신의 콘텐츠 내비게이션
가능 객체를 실제로
나타내는 경우에는 생성된 Document가 로드를 완전히
마쳤을 때 이와 유사한 태스크가 큐에 들어간다.
반환한다.
대체: object 요소는
요소의 자식을 나타낸다. 이것이 요소의 대체 콘텐츠이다. 요소가 주어졌을 때
자식 내비게이션 가능 객체를
파괴한다.
위 알고리즘으로 인해 object 요소의
콘텐츠는
참조된 리소스를 표시할 수 없을 때만 사용되는(예: 404 오류를 반환함)
대체
콘텐츠로 작동한다. 이를 통해 서로 다른 기능을 가진 여러 사용자 에이전트를 대상으로
여러 object 요소를
서로 중첩할 수 있으며 사용자 에이전트는 자신이 지원하는 첫 번째 요소를 선택한다.
object 요소는
load 이벤트를
잠재적으로 지연시킨다.
form 속성은
object 요소를
자신의 폼 소유자와 명시적으로
연결하는 데 사용된다.
HTMLObjectElement/contentDocument
현재의 모든 엔진에서 지원된다.
HTMLObjectElement/contentWindow
현재의 모든 엔진에서 지원된다.
willValidate,
validity 및 validationMessage
속성과 checkValidity(), reportValidity()
및 setCustomValidity()
메서드는 제약 조건 유효성 검사
API의 일부이다. form IDL 속성은
요소의 폼 API에 속한다.
이 예제에서는 object
요소를 사용하여 HTML 페이지를 다른 페이지 안에 임베드한다.
< figure >
< object data = "clock.html" ></ object >
< figcaption > My HTML Clock</ figcaption >
</ figure >
video 요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
controls 속성이 있는
경우: 대화형 콘텐츠.src
속성이 있는 경우:
0개 이상의 track
요소, 그 다음
투명. 단, 미디어 요소 자손은 없어야 한다.
src 속성이 없는 경우: 0개 이상의
source 요소, 그 다음
0개 이상의 track
요소, 그 다음
투명. 단, 미디어 요소 자손은 없어야 한다.
src — 리소스의 주소
crossorigin —
요소가 교차 출처 요청을 처리하는 방식
poster — 비디오 재생
전에 표시할 포스터 프레임
preload — 미디어 리소스에 필요한 버퍼링 양을 암시
autoplay — 페이지가
로드될 때 미디어 리소스를 자동으로
시작할 수 있음을 암시
playsinline —
사용자 에이전트가 요소의 재생 영역 안에 비디오 콘텐츠를 표시하도록 권장
loop — 미디어 리소스를 반복할지 여부
muted — 기본적으로
미디어 리소스를 음소거할지 여부
controls —
사용자 에이전트 컨트롤 표시
loading — 로딩 지연을
결정할 때 사용
width — 가로 치수
height — 세로 치수
[Exposed =Window ]
interface HTMLVideoElement : HTMLMediaElement {
[HTMLConstructor ] constructor ();
[CEReactions , Reflect ] attribute unsigned long width ;
[CEReactions , Reflect ] attribute unsigned long height ;
readonly attribute unsigned long videoWidth ;
readonly attribute unsigned long videoHeight ;
[CEReactions , ReflectURL ] attribute USVString poster ;
[CEReactions , Reflect ] attribute boolean playsInline ;
};
video 요소는
비디오나 영화, 그리고 자막이 있는 오디오 파일을
재생하는 데 사용된다.
video 요소 안에 콘텐츠를
제공할 수 있다. 사용자 에이전트는 이 콘텐츠를 사용자에게 표시하지 않아야 한다. 이 콘텐츠는
video를 지원하지 않는
오래된 웹 브라우저를 위한 것으로, 이러한 브라우저의 사용자에게
비디오 콘텐츠에 접근하는 방법을 알려 주는 텍스트를 표시할 수 있게 한다.
특히 이 콘텐츠는 접근성 문제를 해결하기 위한 것이 아니다. 저시력자, 시각 장애인,
난청인, 청각 장애인 및 그 밖의 신체적 또는 인지적 장애가 있는 사용자가 비디오 콘텐츠에 접근할 수
있도록 다양한 기능을 사용할 수 있다.
자막은 비디오 스트림에 임베드하거나 track
요소를 사용하여
외부 파일로 제공할 수 있다.
수어 트랙은 비디오 스트림에 임베드할 수 있다. 오디오
설명은 비디오 스트림에 임베드하거나 WebVTT 파일을 사용하여
텍스트 형식으로 제공하고, track 요소로
참조하여
사용자 에이전트가 음성으로 합성할 수 있다.
WebVTT는 장 제목을 제공하는 데에도 사용할 수 있다. 미디어 요소를 전혀 사용하지 않으려는
사용자를 위해서는 video 요소 근처의 본문에서
대본이나 다른 텍스트 대체물로 링크하기만 하면 된다. [WEBVTT]
video 요소는
미디어 데이터가 표면상 비디오 데이터이며,
관련 오디오 데이터가 함께 있을 수 있는 미디어 요소이다.
video 요소에는
slot 요소가 없는
내부 섀도 트리가 있다.
src, crossorigin,
preload, autoplay,
loop, muted 및 controls 속성은
모든 미디어 요소에 공통인
속성이다.
poster
속성은 비디오 데이터를 사용할 수 없는 동안 사용자 에이전트가 표시할 수 있는 이미지 파일의
URL을 제공한다.
속성이 있는 경우 공백으로 둘러싸일 수 있는
유효한 비어 있지 않은 URL을 포함해야 한다.
지정된 리소스를 사용하는 경우, 요소가 생성되거나 poster 속성이 설정,
변경 또는 제거될 때 사용자 에이전트는
요소의 포스터 표시 플래그 값과 관계없이
요소의 포스터 프레임을 결정하기 위해 다음 단계를 실행해야 한다:
이 video 요소에 대해
이미 실행 중인 이 알고리즘의 인스턴스가 있으면 포스터
프레임을 변경하지 않고 해당 인스턴스를 중단한다.
poster
속성 값이 빈 문자열이거나 속성이 없는 경우:
video
요소의 포스터 지연 로딩 재개 단계를
null로 설정한다.
포스터 프레임은 없다. 반환한다.
url을 poster 속성 값과
요소의 노드
문서를 기준으로 URL을 인코딩 구문
분석한 결과로 둔다.
url이 실패이면 반환한다. 포스터 프레임은 없다.
request를 요청으로 둔다. 그 URL은 url이고, 클라이언트는 요소의 노드 문서의
관련 설정
객체이고, 대상은
"image"이고, 개시자
유형은 "video"이고,
자격 증명 모드는 "include"이며,
URL 자격 증명 사용 플래그가 설정되어 있다.
video가 주어졌을 때
요소를 지연
로딩할지 결정하는 단계가 true를 반환하면:
posterResumptionSteps를 가져오기라고 표시된 단계부터 시작하는 이 알고리즘의 나머지 부분으로 둔다.
video
요소의 포스터 지연 로딩 재개 단계를
posterResumptionSteps로 설정한다.
반환한다.
request를 가져오기한다. 이는 요소의 노드 문서의 load 이벤트를 지연해야 한다.
poster 속성이
제공한 이미지,
즉 포스터 프레임은 사용자가 비디오가
어떤 것인지 파악할 수 있게 하는 비디오의 대표 프레임
(일반적으로 처음 등장하는 비어 있지 않은 프레임 중 하나)을 의도한다.
playsinline
속성은 불리언
속성이다. 속성이 있으면 비디오가 전체 화면이나 독립적으로 크기를 조절할 수 있는 창에
표시되는 대신, 기본적으로 요소의 재생 영역으로 제한되어 문서 안에 "인라인"으로 표시되어야 함을
사용자 에이전트에 암시한다.
playsinline
속성이 없다고 해서 비디오가 기본적으로 전체 화면으로 표시된다는 의미는 아니다. 실제로 대부분의
사용자 에이전트는 모든 비디오를 기본적으로 인라인으로 재생하도록 선택했으며, 이러한 사용자
에이전트에서는 playsinline 속성이
아무런 효과도 갖지 않는다.
poster 속성이
존재하고 loading
속성이 지연
상태이면 사용자 에이전트는 요소의 지연 로딩 재개
단계가 호출될 때까지 포스터
이미지 소스 데이터의 로딩을 지연해야 한다.
< video src = "1.mp4" poster = "1.jpg" type = "video/mp4" >
< video src = "2.mp4" type = "video/mp4" loading = "eager" >
< video src = "3.mp4" type = "video/mp4" loading = "lazy" >
< video src = "4.mp4" type = "video/mp4" loading = "lazy" autoplay >
< div id = "very-large" ></ div > <!-- Everything after this div is below the viewport -->
< video src = "5.mp4" type = "video/mp4" >
< video src = "6.mp4" type = "video/mp4" loading = "lazy" >
< video src = "7.mp4" type = "video/mp4" autoplay loading = "lazy" >
< video src = "8.mp4" type = "video/mp4" poster = "8.jpg" loading = "lazy" >
< video src = "9.mp4" type = "video/mp4" preload = "none" poster = "9.jpg" loading = "lazy" >
< video src = "10.mp4" type = "video/mp4" preload = "metadata" loading = "lazy" >
< video src = "11.mp4" type = "video/mp4" poster = "11.jpg" preload = "none" loading = "eager" >
위 예제에서 비디오는 다음과 같이 로드된다:
1.mp4비디오와 포스터 이미지는 즉시 로드되며 창의 load 이벤트를 지연한다.
2.mp4, 5.mp4비디오는 즉시 로드되며 창의 load 이벤트를 지연한다.
3.mp4비디오는 뷰포트 안에 있으므로 레이아웃을 알게 되면 로드되지만, 창의 load 이벤트를 지연하지 않는다.
4.mp4비디오는 뷰포트 안에 있으므로 레이아웃을 알게 되면 로드되고 자동 재생이 시작되지만, 창의 load 이벤트를 지연하지 않는다.
6.mp4비디오는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.
7.mp4비디오는 스크롤되어 뷰포트에 들어온 뒤에만 로드되고 자동 재생이 시작되며, 창의 load 이벤트를 지연하지 않는다.
8.mp4비디오와 포스터 이미지는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.
9.mp4비디오는 재생할 때까지 로드되지 않는다. 포스터 이미지는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.
10.mp4비디오의 메타데이터는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.
11.mp4비디오는 재생할 때까지 로드되지 않는다. 포스터 이미지는 즉시 로드되며 창의 load 이벤트를 지연한다.
video 요소는
아래 목록에서 처음으로 일치하는 조건에 주어진 것을 나타낸다:
readyState 속성이
HAVE_NOTHING이거나,
HAVE_METADATA이지만
아직 어떠한 비디오 데이터도 전혀 얻지 못했거나, 요소의 readyState 속성이
그 이후의 값이지만 미디어 리소스에
비디오 채널이 없는 경우)
video 요소는
포스터 프레임이 있으면 그 포스터 프레임을 나타내고,
그렇지 않으면 자연
치수가 없는 투명한 검정색을
나타낸다.video
요소가 일시 정지되어 있고, 현재 재생
위치가 비디오의 첫 번째 프레임이며,
요소의 포스터 표시 플래그가
설정된 경우video 요소는
포스터 프레임이 있으면 그 포스터 프레임을 나타내고,
그렇지 않으면 비디오의 첫 번째 프레임을 나타낸다.video
요소가 일시 정지되어 있고,
현재 재생
위치에 해당하는 비디오 프레임을 사용할 수 없는 경우(예: 비디오가 탐색 중이거나 버퍼링 중인 경우)
video
요소가 잠재적으로
재생 중이지도 않고 일시 정지되어
있지도 않은 경우(예: 탐색 중이거나 정지된 경우)video 요소는
마지막으로 렌더링된 비디오 프레임을 나타낸다.video
요소가 일시 정지된 경우video 요소는
현재 재생
위치에 해당하는 비디오 프레임을 나타낸다.
video
요소에 비디오 채널이 있고 잠재적으로
재생 중인 경우)video 요소는
계속 증가하는 "현재"
위치의 비디오 프레임을 나타낸다. 현재 재생
위치가 변경되어 마지막으로 렌더링된 프레임이 더 이상 비디오에서 현재 재생 위치에 해당하는 프레임이 아니게 되면,
새 프레임을 렌더링해야 한다.
비디오 프레임은 이벤트 루프가 마지막으로 단계 1에 도달했을 때 선택된 비디오 트랙에서 얻어야 한다.
비디오 스트림에서 특정 재생 위치에 해당하는 프레임은 비디오 스트림의 형식에 의해 정의된다.
video 요소는
텍스트 트랙 큐 활성 플래그가 설정되어 있고
텍스트 트랙이
표시 모드인 모든
텍스트 트랙 큐와,
현재 재생
위치에서의 미디어 리소스의
모든 오디오도 나타낸다.
미디어 리소스와 관련된 모든 오디오는 재생되는 경우 요소의 유효 미디어 음량으로 현재 재생 위치와 동기화하여 재생해야 한다. 사용자 에이전트는 이벤트 루프가 마지막으로 단계 1에 도달했을 때 활성화된 오디오 트랙의 오디오를 재생해야 한다.
위의 사항에 더하여 사용자 에이전트는 비디오나 요소 재생 영역의 다른 부분에 텍스트 또는 아이콘을 오버레이하거나 다른 적절한 방식으로 사용자에게 메시지(예: "버퍼링 중", "로드된 비디오 없음", "오류" 또는 더 자세한 정보)를 제공할 수 있다.
비디오를 렌더링할 수 없는 사용자 에이전트는 대신 요소가 외부 비디오 재생 유틸리티 또는 비디오 데이터 자체로 연결되는 링크를 나타내도록 할 수 있다.
video 요소의
미디어 리소스에 비디오 채널이 있으면,
요소는 너비가 미디어 리소스의
자연 너비이고,
높이가 미디어 리소스의
자연
높이이며, 외형이 사용 가능한 경우 현재
재생 위치에 해당하는 비디오 프레임인
페인트 소스를 제공한다. 사용할 수 없으면
(예: 비디오가 탐색 중이거나 버퍼링 중인 경우) 이전 외형이 있으면 그 외형을 사용하고,
그렇지 않으면(예: 비디오가 아직 첫 번째 프레임을 로드 중인 경우) 검은색을 사용한다.
video.videoWidth
현재의 모든 엔진에서 지원된다.
video.videoHeight
현재의 모든 엔진에서 지원된다.
이 속성들은 비디오의 자연 치수를 반환하며, 치수를 알 수 없으면 0을 반환한다.
미디어 리소스의 자연 너비와 자연 높이는 리소스에서 사용하는 형식에 정의된 대로 리소스의 치수, 종횡비, 클린 애퍼처, 해상도 등을 고려한 뒤의 CSS 픽셀 단위 치수이다. 아나모픽 형식이 "올바른" 치수를 얻기 위해 비디오 데이터의 치수에 종횡비를 적용하는 방식을 정의하지 않은 경우 사용자 에이전트는 한 치수를 늘리고 다른 치수는 변경하지 않는 방식으로 비율을 적용해야 한다.
videoWidth getter 단계는 다음과 같다:
this의
readyState
속성이
HAVE_NOTHING이면
0을 반환한다.
videoHeight getter 단계는 다음과 같다:
this의
readyState
속성이
HAVE_NOTHING이면
0을 반환한다.
비디오의 자연 너비 또는
자연
높이가 변경될 때마다
(예를 들어 선택된 비디오
트랙이 변경되어 발생한 경우 포함), 요소의 readyState
속성이 HAVE_NOTHING이
아니면 사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에 넣어 미디어 요소에서 resize라는 이름의
이벤트를 발생시켜야 한다.
반대되는 스타일 규칙이 없으면 비디오 콘텐츠는 요소의 재생 영역 안에서 종횡비를 유지한 채 재생 영역 안에 완전히 들어가는 가능한 가장 큰 크기로 중앙에 표시되도록 렌더링해야 한다. 따라서 재생 영역의 종횡비가 비디오의 종횡비와 일치하지 않으면 비디오는 레터박스 또는 필러박스 형태로 표시된다. 비디오를 포함하지 않는 요소 재생 영역의 부분은 아무것도 나타내지 않는다.
CSS를 구현하는 사용자 에이전트에서는 위 요구 사항을 렌더링 절에 제안된 스타일 규칙을 사용하여 구현할 수 있다.
video 요소 재생 영역의
자연 너비는 포스터 프레임을 사용할 수 있고 요소가 현재
자신의 포스터 프레임을 나타내는 경우 포스터 프레임의
자연 너비이다.
그렇지 않고 비디오 리소스의 자연
너비를 사용할 수 있으면 그 값이다.
그렇지 않으면 자연 너비는
누락된다.
video 요소 재생 영역의
자연 높이는 포스터 프레임을 사용할 수 있고 요소가 현재
자신의 포스터 프레임을 나타내는 경우 포스터 프레임의
자연 높이이다.
그렇지 않고 비디오 리소스의 자연 높이를 사용할 수 있으면 그 값이다.
그렇지 않으면 자연 높이는
누락된다.
기본 객체 크기는 너비 300 CSS 픽셀, 높이 150 CSS 픽셀이다. [CSSIMAGES]
사용자 에이전트는 폐쇄 자막, 오디오 설명 트랙 및 비디오 스트림과 관련된 기타 추가 데이터의 표시를 활성화하거나 비활성화하는 컨트롤을 제공해야 한다. 다만 이러한 기능 역시 페이지의 정상적인 렌더링을 방해해서는 안 된다.
사용자 에이전트는 사용자가 전체 화면이나 독립적으로 크기를 조절할 수 있는 창과 같이
사용자에게 더 적합한 방식으로 비디오 콘텐츠를 볼 수 있게 할 수 있다. 사용자 에이전트는 비디오를
재생할 때 이러한 보기 모드를 기본적으로 작동시킬 수도 있지만, playsinline 속성이
지정된 경우에는 그렇게 하지 않아야 한다. 다른 사용자 인터페이스 기능과 마찬가지로 이를
활성화하는 컨트롤은 사용자 에이전트가 사용자에게 사용자
인터페이스를 노출하는 경우가 아니면 페이지의 정상적인 렌더링을 방해해서는 안 된다.
그러나 이러한 독립 보기 모드에서는 controls 속성이
없어도 사용자 에이전트가 완전한 사용자 인터페이스를 표시할 수 있다.
사용자 에이전트는 비디오 재생이 사용자의 경험을 방해할 수 있는 시스템 기능에 영향을 주도록 허용할 수 있다. 예를 들어 비디오를 재생하는 동안 화면 보호기를 비활성화할 수 있다.
이 예제는 비디오가 올바르게 재생되지 못했음을 감지하는 방법을 보여 준다:
< script >
function failed( e) {
// video playback failed - show a message saying why
switch ( e. target. error. code) {
case e. target. error. MEDIA_ERR_ABORTED:
alert( 'You aborted the video playback.' );
break ;
case e. target. error. MEDIA_ERR_NETWORK:
alert( 'A network error caused the video download to fail part-way.' );
break ;
case e. target. error. MEDIA_ERR_DECODE:
alert( 'The video playback was aborted due to a corruption problem or because the video used features your browser did not support.' );
break ;
case e. target. error. MEDIA_ERR_SRC_NOT_SUPPORTED:
alert( 'The video could not be loaded, either because the server or network failed or because the format is not supported.' );
break ;
default :
alert( 'An unknown error occurred.' );
break ;
}
}
</ script >
< p >< video src = "tgif.vid" autoplay controls onerror = "failed(event)" ></ video ></ p >
< p >< a href = "tgif.vid" > Download the video file</ a > .</ p >
audio 요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
controls 속성이 있는
경우: 대화형 콘텐츠.controls 속성이 있는
경우: 실체적 콘텐츠.src
속성이 있는 경우:
0개 이상의 track
요소, 그 다음
투명. 단, 미디어 요소 자손은 없어야 한다.
src 속성이 없는 경우: 0개 이상의
source 요소, 그 다음
0개 이상의 track
요소, 그 다음
투명. 단, 미디어 요소 자손은 없어야 한다.
src — 리소스의 주소
crossorigin —
요소가 교차 출처 요청을 처리하는 방식
preload — 미디어 리소스에 필요한 버퍼링 양을 암시
autoplay — 페이지가
로드될 때 미디어 리소스를 자동으로
시작할 수 있음을 암시
loop — 미디어 리소스를 반복할지 여부
muted — 기본적으로
미디어 리소스를 음소거할지 여부
controls —
사용자 에이전트 컨트롤 표시
loading — 로딩 지연을
결정할 때 사용
[Exposed =Window ,
LegacyFactoryFunction =Audio (optional DOMString src )]
interface HTMLAudioElement : HTMLMediaElement {
[HTMLConstructor ] constructor ();
};
audio 요소는
소리 또는 오디오 스트림을 나타낸다.
audio 요소 안에 콘텐츠를
제공할 수 있다. 사용자 에이전트는 이 콘텐츠를 사용자에게 표시하지 않아야 한다. 이 콘텐츠는
audio를 지원하지 않는
오래된 웹 브라우저를 위한 것으로, 이러한 브라우저의 사용자에게
오디오 콘텐츠에 접근하는 방법을 알려 주는 텍스트를 표시할 수 있게 한다.
특히 이 콘텐츠는 접근성 문제를 해결하기 위한 것이 아니다. 청각 장애인이나
그 밖의 신체적 또는 인지적 장애가 있는 사용자가 오디오 콘텐츠에 접근할 수 있도록 다양한 기능을
사용할 수 있다. 자막이나 수어 비디오를 사용할 수 있으면 audio 요소 대신
video 요소를
사용하여 오디오를 재생함으로써 사용자가 시각적 대체물을 활성화할 수 있다. 내비게이션을 돕기 위해
track 요소와
WebVTT 파일을 사용하여 장 제목을 제공할 수 있다. 그리고
당연히 audio
요소 근처의 본문에서 대본이나 다른 텍스트 대체물로 링크하기만 하면 된다.
[WEBVTT]
audio 요소는
미디어 데이터가 표면상 오디오 데이터인
미디어 요소이다.
audio 요소에는
slot 요소가 없는
내부 섀도 트리가 있다.
src, crossorigin,
preload, autoplay,
loop, muted, controls 및 loading 속성은
모든 미디어 요소에 공통인
속성이다.
audio
요소에 controls 속성이 없으면
사용자 에이전트가 표시하지 않으므로 지연 로딩할 수 없다.
< audio src = "1.mp3" type = "audio/mpeg" controls >
< audio src = "2.mp3" type = "audio/mpeg" controls loading = "eager" >
< audio src = "3.mp3" type = "audio/mpeg" controls loading = "lazy" >
< audio src = "4.mp3" type = "audio/mpeg" controls loading = "lazy" autoplay >
< div id = "very-large" ></ div > <!-- Everything after this div is below the viewport -->
< audio src = "5.mp3" type = "audio/mpeg" controls >
< audio src = "6.mp3" type = "audio/mpeg" controls loading = "lazy" >
< audio src = "7.mp3" type = "audio/mpeg" controls autoplay loading = "lazy" >
< audio src = "8.mp3" type = "audio/mpeg" controls preload = "metadata" loading = "lazy" >
위 예제에서 오디오 파일은 다음과 같이 로드된다:
1.mp3, 2.mp3, 5.mp3오디오 파일은 즉시 로드되며 창의 load 이벤트를 지연한다.
3.mp3오디오는 뷰포트 안에 있으므로 레이아웃을 알게 되면 로드되지만, 창의 load 이벤트를 지연하지 않는다.
4.mp3오디오는 뷰포트 안에 있으므로 레이아웃을 알게 되면 로드되고 자동 재생이 시작되지만, 창의 load 이벤트를 지연하지 않는다.
6.mp3오디오는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.
7.mp3오디오는 스크롤되어 뷰포트에 들어온 뒤에만 로드되고 자동 재생이 시작되며, 창의 load 이벤트를 지연하지 않는다.
8.mp3오디오의 메타데이터는 스크롤되어 뷰포트에 들어온 뒤에만 로드되며 창의 load 이벤트를 지연하지 않는다.
audio = new Audio([ url ])
현재의 모든 엔진에서 지원된다.
HTMLAudioElement 객체를 생성하기
위해 DOM의 createElement()와
같은 팩터리 메서드에 더하여 레거시 팩터리 함수
Audio(src)가 제공된다. 호출되면 레거시 팩터리 함수는
다음 단계를 수행해야 한다:
document를 현재 전역
객체의 연결된
Document로 둔다.
audio를 document, "audio" 및 HTML
네임스페이스가 주어졌을 때 요소를
생성한 결과로 둔다.
src가 주어진 경우 "src"와
src를 사용하여 audio의 속성 값을
설정한다. (이로 인해 반환하기 전에 사용자 에이전트가 객체의 리소스 선택
알고리즘을 호출하게 된다.)
audio를 반환한다.
track
요소현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
kind — 텍스트 트랙의 유형
src — 리소스의 주소
srclang — 텍스트
트랙의 언어
label — 사용자에게
표시되는 레이블
default — 다른
텍스트 트랙이 더 적합하지 않으면 트랙 활성화
[Exposed =Window ]
interface HTMLTrackElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions ] attribute DOMString kind ;
[CEReactions , ReflectURL ] attribute USVString src ;
[CEReactions , Reflect ] attribute DOMString srclang ;
[CEReactions , Reflect ] attribute DOMString label ;
[CEReactions , Reflect ] attribute boolean default ;
const unsigned short NONE = 0;
const unsigned short LOADING = 1;
const unsigned short LOADED = 2;
const unsigned short ERROR = 3;
readonly attribute unsigned short readyState ;
readonly attribute TextTrack track ;
};
track 요소를 사용하면
작성자가 미디어 요소를 위한 명시적인
외부 시간 지정 텍스트 트랙을 지정할 수 있다.
이 요소는 그 자체로는 아무것도 나타내지 않는다.
kind 속성은
다음 키워드와 상태를 갖는 열거형 속성이다:
| 키워드 | 상태 | 간략한 설명 |
|---|---|---|
subtitles
|
자막 | 소리는 들리지만 이해할 수 없는 경우에 적합한 대화의 전사 또는 번역 (예: 사용자가 미디어 리소스 오디오 트랙의 언어를 이해하지 못하는 경우). 비디오 위에 오버레이된다. |
captions
|
폐쇄 자막 | 소리를 사용할 수 없거나 명확하게 들을 수 없는 경우에 적합한 대화, 음향 효과, 관련 음악 신호 및 그 밖의 관련 오디오 정보의 전사 또는 번역 (예: 음소거되었거나 주변 소음에 묻혔거나 사용자가 청각 장애인인 경우). 비디오 위에 오버레이되며 난청인에게 적합한 것으로 레이블된다. |
descriptions
|
설명 | 시각적 구성 요소가 가려졌거나 사용할 수 없거나 사용할 수 없는 경우 오디오 합성을 위해 의도된 미디어 리소스의 비디오 구성 요소에 대한 텍스트 설명 (예: 사용자가 운전 중 화면 없이 애플리케이션과 상호작용하거나 사용자가 시각 장애인인 경우). 오디오로 합성된다. |
chapters
|
장 메타데이터 | 스크립트에서 사용하도록 의도된 트랙. 사용자 에이전트가 표시하지 않는다. |
metadata
|
메타데이터 |
속성의 누락 값 기본값은 자막 상태이고, 유효하지 않은 값 기본값은 메타데이터 상태이다.
src 속성은
텍스트 트랙 데이터의 URL을 제공한다. 값은 공백으로 둘러싸일 수 있는
유효한 비어 있지 않은 URL이어야 한다. 이 속성은 반드시 존재해야 한다.
요소에는 연결된 트랙 URL(문자열)이 있으며 처음에는 빈 문자열이다.
요소의 src
속성이 설정되면 다음 단계를 실행한다:
trackURL을 실패로 둔다.
value를 요소의 src
속성
값으로 둔다.
value가 빈 문자열이 아니면 trackURL을 value와 요소의 노드 문서를 기준으로 URL을 인코딩 구문 분석하고 직렬화한 결과로 설정한다.
trackURL이 실패가 아니면 요소의 트랙 URL을 trackURL로 설정하고, 그렇지 않으면 빈 문자열로 설정한다.
요소의 트랙 URL이 WebVTT 리소스를 식별하고,
요소의 kind 속성이
장 메타데이터 또는
메타데이터 상태가
아니면 WebVTT 파일은
큐 텍스트를 사용하는 WebVTT 파일이어야 한다.
[WEBVTT]
srclang
속성은 텍스트 트랙 데이터의 언어를 제공한다. 값은 유효한 BCP 47 언어 태그여야 한다.
요소의 kind
속성이 자막 상태이면 이 속성이 반드시
존재해야 한다.
[BCP47]
label 속성은
사용자가 읽을 수 있는 트랙의 제목을 제공한다. 사용자 에이전트는 사용자 인터페이스에
자막,
폐쇄 자막 및
오디오 설명
트랙을 나열할 때 이 제목을 사용한다.
label
속성이 존재하는 경우 그 값은 빈 문자열이어서는 안 된다. 또한 동일한 미디어 요소의
track
자식 요소 둘이, kind
속성이 동일한 상태이고, srclang
속성이 둘 다 없거나 동일한 언어를 나타내는 값을 가지며, label 속성도
둘 다 없거나 동일한 값을 가져서는 안 된다.
default
속성은 불리언 속성이며,
지정된 경우 사용자의 환경설정에서 다른 트랙이 더 적합하다고 나타내지 않으면 해당 트랙을
활성화해야 함을 나타낸다.
각 미디어 요소에는
kind 속성이
자막 또는
폐쇄 자막 상태이고
default 속성이
지정된 track 자식
요소가 하나를 초과해서는 안 된다.
각 미디어 요소에는
kind 속성이
설명 상태이고
default
속성이 지정된 track
자식 요소가 하나를 초과해서는 안 된다.
각 미디어 요소에는
kind 속성이
장 메타데이터 상태이고
default
속성이 지정된 track
자식 요소가 하나를 초과해서는 안 된다.
kind 속성이
메타데이터 상태이고
default 속성이
지정된 track 요소의 수에는 제한이
없다.
track.readyState다음 목록의 숫자로 나타낸 텍스트 트랙 준비 상태를 반환한다:
track.NONE (0)텍스트 트랙이 로드되지 않음 상태.
track.LOADING (1)텍스트 트랙 로딩 중 상태.
track.LOADED (2)텍스트 트랙이 로드됨 상태.
track.ERROR (3)텍스트 트랙 로드 실패 상태.
track.trackreadyState 속성은 다음 목록에 정의된 대로
track 요소의
텍스트 트랙의
텍스트 트랙 준비 상태에 해당하는
숫자 값을
반환해야 한다:
NONE
(숫자 값 0)LOADING
(숫자 값 1)LOADED
(숫자 값 2)ERROR
(숫자 값 3)kind
IDL
속성은 같은 이름의 콘텐츠 속성을 알려진
값으로만 제한하여
반영해야 한다.
이 비디오에는 여러 언어의 자막이 있다:
< video src = "brave.webm" >
< track kind = subtitles src = brave.en.vtt srclang = en label = "English" >
< track kind = captions src = brave.en.hoh.vtt srclang = en label = "English for the Hard of Hearing" >
< track kind = subtitles src = brave.fr.vtt srclang = fr lang = fr label = "Français" >
< track kind = subtitles src = brave.de.vtt srclang = de lang = de label = "Deutsch" >
</ video >
(마지막 두 요소의 lang 속성은
자막 자체의 언어가 아니라 label 속성의
언어를
설명한다. 자막의 언어는 srclang
속성으로
제공된다.)
HTMLMediaElement 객체(이 명세에서는
audio와 video)는 간단히
미디어
요소라고 한다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
현재의 모든 엔진에서 지원된다.
enum CanPlayTypeResult { "" /* empty string */, " maybe " , " probably " };
typedef (MediaStream or MediaSource or Blob ) MediaProvider ;
[Exposed =Window ]
interface HTMLMediaElement : HTMLElement {
// error state
readonly attribute MediaError ? error ;
// network state
[CEReactions , ReflectURL ] attribute USVString src ;
attribute MediaProvider ? srcObject ;
readonly attribute USVString currentSrc ;
[CEReactions ] attribute DOMString ? crossOrigin ;
const unsigned short NETWORK_EMPTY = 0;
const unsigned short NETWORK_IDLE = 1;
const unsigned short NETWORK_LOADING = 2;
const unsigned short NETWORK_NO_SOURCE = 3;
readonly attribute unsigned short networkState ;
[CEReactions ] attribute DOMString preload ;
readonly attribute TimeRanges buffered ;
undefined load ();
CanPlayTypeResult canPlayType (DOMString type );
// ready state
const unsigned short HAVE_NOTHING = 0;
const unsigned short HAVE_METADATA = 1;
const unsigned short HAVE_CURRENT_DATA = 2;
const unsigned short HAVE_FUTURE_DATA = 3;
const unsigned short HAVE_ENOUGH_DATA = 4;
readonly attribute unsigned short readyState ;
readonly attribute boolean seeking ;
// playback state
attribute double currentTime ;
undefined fastSeek (double time );
readonly attribute unrestricted double duration ;
object getStartDate ();
readonly attribute boolean paused ;
attribute double defaultPlaybackRate ;
attribute double playbackRate ;
attribute boolean preservesPitch ;
readonly attribute TimeRanges played ;
readonly attribute TimeRanges seekable ;
readonly attribute boolean ended ;
[CEReactions , Reflect ] attribute boolean autoplay ;
[CEReactions , Reflect ] attribute boolean loop ;
Promise <undefined > play ();
undefined pause ();
// controls
[CEReactions , Reflect ] attribute boolean controls ;
attribute double volume ;
attribute boolean muted ;
[CEReactions , Reflect="muted"] attribute boolean defaultMuted ;
[CEReactions ] attribute DOMString loading ;
// tracks
[SameObject ] readonly attribute AudioTrackList audioTracks ;
[SameObject ] readonly attribute VideoTrackList videoTracks ;
[SameObject ] readonly attribute TextTrackList textTracks ;
TextTrack addTextTrack (TextTrackKind kind , optional DOMString label = "", optional DOMString language = "");
};
미디어 요소 속성인 src, crossorigin, preload, autoplay,
loop, muted, controls 및 loading은 모든
미디어 요소에 적용된다. 이들은 이 절에서
정의된다.
loading
속성은 지연 로딩
속성이다. 그 목적은 뷰포트 밖에 있는 미디어 리소스의
로딩 정책을 나타내는 것이다.
loading
속성의 상태가 즉시 로드 상태로 변경되면 사용자
에이전트는
다음 단계를 실행해야 한다:
resumptionSteps를 미디어 요소의 지연 로딩 재개 단계로 둔다.
posterResumptionSteps를 null로 둔다.
미디어 요소가 video 요소이면
posterResumptionSteps를 video 요소의
포스터 지연
로딩
재개 단계로 설정한다.
resumptionSteps가 null이고 posterResumptionSteps도 null이면 반환한다.
resumptionSteps가 null이 아니면:
미디어 요소의 지연 로딩 재개 단계를 null로 설정한다.
resumptionSteps를 호출한다.
posterResumptionSteps가 null이 아니면:
video
요소의 포스터 지연 로딩 재개 단계를
null로 설정한다.
posterResumptionSteps를 호출한다.
loading
IDL 속성은 loading
콘텐츠 속성을 알려진 값으로만 제한하여
반영해야 한다.
loading 속성이
지연 상태이면
데이터 가져오기를 지연함으로써 preload
속성보다
우선한다.
autoplay 속성이
존재하고 loading
속성이 지연 상태이면 사용자 에이전트는 요소의
지연 로딩 재개
단계가 호출될 때까지 재생 시작(및 autoplay가 발생시킬 수 있는 관련 네트워크 요청)도
지연해야 한다.
미디어 요소는 오디오 데이터 또는 비디오와 오디오 데이터를 사용자에게 제공하는 데 사용된다. 이 절은 오디오 또는 비디오용 미디어 요소에 동일하게 적용되므로 이 절에서는 이를 미디어 데이터라고 한다. 미디어 리소스라는 용어는 완전한 비디오 파일이나 완전한 오디오 파일과 같은 미디어 데이터의 전체 집합을 가리키는 데 사용된다.
미디어 리소스에는 연결된
출처가 있으며, 이는
"none", "multiple",
"rewritten" 또는 출처이다. 처음에는
"none"으로 설정된다.
미디어 리소스에는 여러 오디오 및
비디오 트랙이 있을 수 있다. 미디어 요소의 목적상
미디어 리소스의 비디오 데이터는
이벤트 루프가 마지막으로
단계 1에 도달했을 때 요소의 videoTracks 속성이
제공한 현재 선택된 트랙(있는 경우)의 데이터뿐이고, 미디어 리소스의 오디오 데이터는
이벤트 루프가 마지막으로
단계 1에 도달했을 때 요소의 audioTracks 속성이
제공한 현재 활성화된 모든 트랙(있는 경우)을 혼합한 결과이다.
audio와
video 요소는 모두
오디오와 비디오에 사용할 수 있다. 둘 사이의 주요 차이는 단순히 audio 요소에는
시각적 콘텐츠(예: 비디오 또는 자막)를 위한 재생 영역이 없지만 video
요소에는 있다는 점이다.
각 미디어 요소에는 고유한 미디어 요소 이벤트 태스크 소스가 있다.
미디어 요소 element와 일련의 단계 steps를 사용하여 미디어 요소 태스크를 큐에 넣으려면, element와 steps가 주어졌을 때 미디어 요소의 미디어 요소 이벤트 태스크 소스에서 요소 태스크를 큐에 넣는다.
현재 모든 엔진에서 지원됩니다.
media.error
현재 모든 엔진에서 지원됩니다.
요소의 현재 오류 상태를 나타내는 MediaError
객체를 반환합니다.
오류가 없으면 null을 반환합니다.
모든 미디어 요소에는 연관된 오류 상태가 있으며,
이 상태는 요소의 리소스 선택 알고리즘이
마지막으로 호출된 이후
요소가 마주친 마지막 오류를 기록합니다. error 속성은 가져올 때 이 마지막 오류를 위해 생성된
MediaError 객체를 반환해야 하며,
오류가 발생하지 않았다면 null을 반환해야 합니다.
[Exposed =Window ]
interface MediaError {
const unsigned short MEDIA_ERR_ABORTED = 1;
const unsigned short MEDIA_ERR_NETWORK = 2;
const unsigned short MEDIA_ERR_DECODE = 3;
const unsigned short MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
readonly attribute unsigned short code ;
readonly attribute DOMString message ;
};
media.error.code
현재 모든 엔진에서 지원됩니다.
아래 목록에서 현재 오류의 오류 코드를 반환합니다.
media.error.message
현재 모든 엔진에서 지원됩니다.
발생한 오류 조건에 관한 구체적이고 유용한 진단 메시지를 반환합니다. 메시지와 메시지 형식은 일반적으로 서로 다른 사용자 에이전트 간에 동일하지 않습니다. 이러한 메시지를 사용할 수 없으면 빈 문자열을 반환합니다.
모든 MediaError 객체에는 문자열인
메시지와 다음 중 하나인
코드가 있습니다.
MEDIA_ERR_ABORTED (숫자 값 1)MEDIA_ERR_NETWORK (숫자 값 2)MEDIA_ERR_DECODE (숫자 값 3)MEDIA_ERR_SRC_NOT_SUPPORTED (숫자 값 4)src 속성 또는
할당된
미디어 제공자 객체가 나타내는 미디어 리소스가 적합하지 않았습니다.
위 값 중 하나인 오류 코드가 주어졌을 때 MediaError를 생성하려면, 코드가 주어진 오류 코드이고
메시지가
오류 조건의 원인에 관해 사용자 에이전트가 제공할 수 있는 모든 세부 정보를 포함하는 문자열인 새로운
MediaError 객체를 반환합니다.
사용자 에이전트가 이러한 세부 정보를 제공할 수 없으면 메시지는 빈 문자열입니다. 이 메시지 문자열에는
제공된 오류 코드를 통해 이미 알 수 있는 정보만 포함되어서는 안 됩니다. 예를 들어, 단순히 코드를
문자열 형식으로 번역한 것이어서는 안 됩니다. 오류 코드가 제공하는 정보 외에 추가 정보를 사용할 수
없다면 메시지를 빈 문자열로 설정해야 합니다.
미디어 요소의
src 콘텐츠 속성은 표시할
미디어 리소스
(비디오, 오디오)의 URL을 제공합니다.
이 속성이 존재한다면 공백으로 둘러싸일 수
있는 유효한 비어 있지 않은 URL을 포함해야 합니다.
미디어 요소에
itemprop
속성이 지정된 경우, src 속성도
지정되어야 합니다.
미디어 요소의
crossorigin 콘텐츠 속성은
CORS 설정 속성입니다.
미디어 요소가
src 속성과
함께 생성되면, 사용자 에이전트는 즉시 해당
미디어 요소의
리소스 선택
알고리즘을
호출해야 합니다.
미디어 요소의
src
속성이 설정되거나 변경되면, 사용자 에이전트는 해당
미디어 요소의
미디어 요소 로드
알고리즘을
호출해야 합니다. (source
요소가 존재하더라도 src 속성을
제거하는 경우에는 이렇게 하지 않습니다.)
현재 모든 엔진에서 지원됩니다.
crossOrigin IDL 속성은
알려진 값으로만
제한하여
crossorigin
콘텐츠 속성을 반영해야 합니다.
미디어 제공자 객체는
URL과 별도로 미디어 리소스를 나타낼 수 있는 객체입니다.
MediaStream
객체, MediaSource
객체 및 Blob
객체는 모두 미디어 제공자 객체입니다.
각 미디어 요소에는 할당된 미디어 제공자 객체가 있으며, 이는 미디어 제공자 객체 또는 null이고, 초기값은 null입니다.
media.srcObject [ = source ]
하나의 엔진에서만 지원됩니다.
미디어 요소에 미디어 제공자 객체를 할당할 수 있게 합니다.
media.currentSrc
현재 모든 엔진에서 지원됩니다.
현재 미디어 리소스가 존재하는 경우 그 URL을 반환합니다.
미디어 리소스가 없거나 URL을 갖지 않으면 빈 문자열을 반환합니다.
currentSrc IDL 속성은 처음에 빈 문자열로 설정되어야 합니다.
그 값은 아래에 정의된 리소스 선택 알고리즘에 의해
변경됩니다.
srcObject getter 단계는
this의 할당된 미디어 제공자 객체를
반환하는 것입니다.
srcObject
setter 단계는 다음과 같습니다.
this의 할당된 미디어 제공자 객체를 주어진 값으로 설정합니다.
this의 미디어 요소 로드 알고리즘을 호출합니다.
미디어 리소스를 지정하는 방법에는
세 가지가 있습니다.
srcObject
IDL 속성, src 콘텐츠 속성,
그리고 source
요소입니다. IDL 속성이 가장 높은 우선순위를 가지며, 그다음은 콘텐츠 속성이고, 그다음은 요소입니다.
미디어 리소스는 그
유형, 구체적으로는 경우에 따라 codecs 매개변수를 포함하는
MIME
유형으로 설명할 수 있습니다.
(codecs 매개변수의 허용 여부는 MIME 유형에 따라 달라집니다.)
[RFC6381]
유형은 일반적으로 다소 불완전한 설명입니다. 예를 들어 "video/mpeg"은 컨테이너 유형 외에는
아무것도 알려주지 않으며, "video/mp4; codecs="avc1.42E01E, mp4a.40.2"" 같은 유형조차
실제 비트 전송률과 같은 정보는 포함하지 않습니다(최대 비트 전송률만 포함합니다). 따라서 유형이 주어지면
사용자 에이전트는 흔히 그 유형의 미디어를 재생할 수 있을 가능성이 있는지
(신뢰도는 다양할 수 있음), 또는 그 유형의 미디어를 확실히 재생할 수 없는지만
알 수 있습니다.
사용자 에이전트가 렌더링할 수 없음을 알고 있는 유형은, 예를 들어 컨테이너 유형을 인식하지 못하거나 나열된 코덱을 지원하지 않기 때문에 사용자 에이전트가 확실히 지원하지 않는 리소스를 설명하는 유형입니다.
매개변수가 없는 MIME 유형
"application/octet-stream"은
절대로 사용자 에이전트가 렌더링할 수 없음을
알고 있는 유형이 아닙니다. 사용자 에이전트는 잠재적인
미디어 리소스에 이 유형이 표시된 경우,
이를 명시적인 Content-Type 메타데이터가
없는 것과 동등하게 취급해야 합니다.
여기서는 매개변수가 없는 MIME 유형
"application/octet-stream"만
특별하게 처리됩니다. 매개변수가 하나라도 있으면 다른 모든
MIME
유형과 동일하게 취급됩니다. 이는 알 수 없는
MIME
유형 매개변수를 무시해야 한다는 규칙에서 벗어나는 것입니다.
media.canPlayType(type)
현재 모든 엔진에서 지원됩니다.
사용자 에이전트가 주어진 유형의 미디어 리소스를 재생할 수 있다고 얼마나 확신하는지에 따라 빈 문자열(부정적인 응답), "maybe" 또는 "probably"를 반환합니다.
canPlayType(type) 메서드는
type이 사용자 에이전트가 렌더링할 수 없음을
알고 있는 유형이거나 유형
"application/octet-stream"이면
빈 문자열을 반환해야 합니다. 사용자 에이전트가 그 유형이
이 audio 또는
video 요소와 함께
사용할 때 렌더링할 수 있는 미디어 리소스를 나타낸다고 확신한다면
"probably"를 반환해야 하며,
그 외의 경우에는 "maybe"를 반환해야 합니다. 구현자는 해당 유형이
지원되거나 지원되지 않는다고 확실하게 판단할 수 없는 한
"maybe"를
반환하는 것이 권장됩니다. 일반적으로 사용자 에이전트는 codecs 매개변수를 허용하는 유형에
해당 매개변수가 존재하지 않는다면
"probably"를
반환해서는 안 됩니다.
이 스크립트는 사용자 에이전트가 (가상의) 새로운 형식을 지원하는지 테스트하여
video 요소를
사용할지 동적으로 결정합니다.
< section id = "video" >
< p >< a href = "playing-cats.nfv" > Download video</ a ></ p >
</ section >
< script >
const videoSection = document. getElementById( 'video' );
const videoElement = document. createElement( 'video' );
const support = videoElement. canPlayType( 'video/x-new-fictional-format;codecs="kittens,bunnies"' );
if ( support === "probably" ) {
videoElement. setAttribute( "src" , "playing-cats.nfv" );
videoSection. replaceChildren( videoElement);
}
</ script >
source 요소의
type 속성을 사용하면
사용자 에이전트가 렌더링할 수 없는 형식을 사용하는 리소스의 다운로드를 피할 수 있습니다.
media.networkState
현재 모든 엔진에서 지원됩니다.
아래 목록의 코드 중 하나로 요소의 현재 네트워크 활동 상태를 반환합니다.
미디어 요소가 네트워크와 상호 작용할 때,
현재 네트워크 활동은 networkState 속성으로 나타냅니다.
가져올 때 이 속성은 다음 값 중 하나여야 하는 요소의 현재 네트워크 상태를 반환해야 합니다.
NETWORK_EMPTY (숫자 값 0)NETWORK_IDLE (숫자 값 1)NETWORK_LOADING (숫자 값 2)NETWORK_NO_SOURCE (숫자 값 3)아래에 정의된 리소스 선택 알고리즘은
networkState
속성 값이 정확히 언제 변경되는지와 이 상태의 변경을 나타내기 위해 어떤 이벤트가 발생하는지를 설명합니다.
media.load()
현재 모든 엔진에서 지원됩니다.
요소를 재설정하고 새로운 미디어 리소스를 처음부터 선택하고 로드하기 시작하게 합니다.
모든 미디어 요소에는 자동 재생 가능 플래그가 있으며, 이 플래그는 true 상태로 시작해야 합니다. 또한 load 이벤트 지연 플래그가 있으며, 이 플래그는 false 상태로 시작해야 합니다. load 이벤트 지연 플래그가 true인 동안 요소는 문서의 load 이벤트를 지연해야 합니다.
미디어 요소의
load() 메서드가
호출되면 사용자 에이전트는
다음 단계를 실행해야 합니다.
resumptionSteps를 미디어 요소의 지연 로드 재개 단계로 둡니다.
resumptionSteps가 null이 아니면 다음을 수행합니다.
미디어 요소의 지연 로드 재개 단계를 null로 설정합니다.
resumptionSteps를 호출합니다.
미디어 요소 로드 알고리즘을 실행합니다.
미디어 요소에는 연관된 불리언 현재 정지됨이 있으며, 초기값은 false입니다.
미디어 요소 로드 알고리즘은 다음 단계로 구성됩니다.
이 요소의 현재 정지됨을 false로 설정합니다.
이 요소에 대해 이미 실행 중인 리소스 선택 알고리즘의 모든 인스턴스를 중단합니다.
pending tasks를 태스크 큐 중 하나에 있는 미디어 요소의 미디어 요소 이벤트 태스크 소스에서 온 모든 태스크의 목록으로 둡니다.
pending tasks의 각 태스크 중 대기 중인 재생 프로미스를 이행하거나 대기 중인 재생 프로미스를 거부하려는 태스크마다, 해당 태스크가 큐에 추가된 순서대로 그 프로미스를 즉시 이행하거나 거부합니다.
pending tasks의 각 태스크를 해당 태스크 큐에서 제거합니다.
기본적으로 미디어 요소가 새로운 리소스를 로드하기 시작하면 대기 중인 이벤트와 콜백은 폐기되며, 이행 또는 거부가 진행 중인 프로미스는 즉시 이행되거나 거부됩니다.
미디어 요소의
networkState가
NETWORK_LOADING
또는 NETWORK_IDLE로
설정되어 있으면, 미디어 요소가 주어졌을 때
미디어 요소 태스크를
큐에 추가하여
미디어 요소에서
abort라는
이름의 이벤트를 발생시킵니다.
미디어 요소의
networkState가
NETWORK_EMPTY로
설정되어 있지 않으면 다음을 수행합니다.
미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에 추가하여
미디어 요소에서
emptied라는
이름의 이벤트를
발생시킵니다.
미디어 요소에 대해 가져오기 과정이 진행 중이라면 사용자 에이전트는 이를 중지하는 것이 좋습니다.
미디어 요소의
할당된 미디어 제공자 객체가
MediaSource
객체이면, 이를 분리합니다.
readyState가
HAVE_NOTHING로
설정되어 있지 않으면 해당 상태로 설정합니다.
paused
속성이 false이면 다음을 수행합니다.
paused
속성을 true로 설정합니다.
대기
중인 재생 프로미스를 가져오고,
그 결과와 "AbortError"
DOMException을
사용하여 대기 중인 재생 프로미스를
거부합니다.
seeking이
true이면 false로 설정합니다.
현재 재생 위치를 0으로 설정합니다.
공식 재생 위치를 0으로 설정합니다.
이로 인해 공식 재생 위치가 변경되었다면,
미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에 추가하여
미디어 요소에서
timeupdate라는
이름의 이벤트를
발생시킵니다.
타임라인 오프셋을 Not-a-Number(NaN)로 설정합니다.
duration
속성을 Not-a-Number(NaN)로 업데이트합니다.
사용자 에이전트는 이 특정 재생 시간 변경에 대해
durationchange
이벤트를 발생시키지 않습니다.
playbackRate
속성을 defaultPlaybackRate
속성의 값으로 설정합니다.
error
속성을 null로 설정하고, 자동 재생 가능
플래그를 true로 설정합니다.
미디어 요소의 리소스 선택 알고리즘을 호출합니다.
이 요소에서 이전에 재생 중이던 모든 미디어 리소스의 재생이 중지됩니다.
미디어 요소의 리소스 선택 알고리즘은 다음과 같습니다. 이 알고리즘은 항상 태스크의 일부로 호출되지만, 알고리즘의 첫 단계 중 하나에서 반환한 뒤 나머지 단계를 병렬로 계속 실행합니다. 또한 이 알고리즘은 이벤트 루프 메커니즘과 긴밀하게 상호 작용합니다. 특히 이 알고리즘에는 이벤트 루프 알고리즘의 일부로 트리거되는 동기 구간이 있습니다. 이러한 구간의 단계는 ⌛로 표시됩니다.
요소의 networkState
속성을 NETWORK_NO_SOURCE
값으로 설정합니다.
요소의 포스터 표시 플래그를 true로 설정합니다.
미디어 요소의 지연 로딩 속성이 Eager 상태이거나 스크립팅이 비활성화되어 있으면, 미디어 요소의 load 이벤트 지연 플래그를 true로 설정합니다(이는 load 이벤트를 지연합니다).
이 알고리즘을 호출한 태스크가 계속 진행할 수 있도록 안정 상태를 기다립니다. 동기 구간은 알고리즘이 동기 구간이 끝났다고 말할 때까지 이 알고리즘의 남은 모든 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)
⌛ 미디어 요소의 파서에 의해 차단됨 플래그가 false이면, 대기 중인 텍스트 트랙 목록을 채웁니다.
⌛ mode를 null로 둡니다.
⌛ candidate를 null로 둡니다.
⌛ 미디어 요소의 할당된 미디어 제공자 객체가 null이 아니면 mode를 object로 설정합니다.
⌛ 그렇지 않고 미디어 요소에
source
요소 자식이 있으면, mode를 children으로 설정하고
candidate를 트리 순서에서 첫 번째
source
요소 자식으로 설정합니다.
⌛ 그렇지 않으면 다음을 수행합니다.
⌛ networkState를
NETWORK_EMPTY로
설정합니다.
⌛ 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.
동기 구간을 끝내고 반환합니다.
⌛ 미디어 요소의
networkState를
NETWORK_LOADING으로
설정합니다.
⌛ 미디어 요소가 주어졌을 때
미디어 요소 태스크를
큐에 추가하여
미디어 요소에서
loadstart라는
이름의 이벤트를 발생시킵니다.
다음 목록에서 적절한 단계를 실행합니다.
⌛ currentSrc
속성을 빈 문자열로 설정합니다.
할당된 미디어 제공자 객체를 사용하여 리소스 가져오기 알고리즘을 실행합니다. 해당 알고리즘이 이 알고리즘을 중단하지 않고 반환하면 로드가 실패한 것입니다.
미디어 제공자에서 실패: 이 단계에 도달했다는 것은 미디어 리소스 로드가 실패했음을 나타냅니다. 대기 중인 재생 프로미스를 가져오고, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 그 결과와 함께 전용 미디어 소스 실패 단계를 실행합니다.
이전 단계에서 큐에 추가한 태스크가 실행될 때까지 기다립니다.
반환합니다. 이 알고리즘이 다시 트리거될 때까지 요소는 다른 리소스의 로드를 시도하지 않습니다.
⌛ urlRecord를 src
속성 값과, src
속성이
마지막으로 변경되었을 때의 미디어 요소의
노드 문서를
기준으로
URL을 인코딩
파싱한 결과로
둡니다.
⌛ urlRecord가 실패가 아니면,
currentSrc
속성을 urlRecord에 URL
직렬 변환기를 적용한 결과로 설정합니다.
urlRecord가 실패가 아니면, urlRecord를 사용하여 리소스 가져오기 알고리즘을 실행합니다. 해당 알고리즘이 이 알고리즘을 중단하지 않고 반환하면 로드가 실패한 것입니다.
속성에서 실패: 이 단계에 도달했다는 것은 미디어 리소스 로드가 실패했거나 urlRecord가 실패임을 나타냅니다. 대기 중인 재생 프로미스를 가져오고, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 그 결과와 함께 전용 미디어 소스 실패 단계를 실행합니다.
이전 단계에서 큐에 추가한 태스크가 실행될 때까지 기다립니다.
반환합니다. 이 알고리즘이 다시 트리거될 때까지 요소는 다른 리소스의 로드를 시도하지 않습니다.
⌛ pointer를 미디어 요소의 자식 목록에 있는 인접한 두 노드로 정의되는 위치로 둡니다. 목록의 시작(목록에 자식이 있다면 첫 번째 자식 앞)과 목록의 끝(목록에 자식이 있다면 마지막 자식 뒤)은 각각 독립적인 노드로 취급합니다. 한 노드는 pointer 앞의 노드이고, 다른 노드는 pointer 뒤의 노드입니다. 처음에는 다음 노드가 있다면 candidate 노드와 다음 노드 사이의 위치를 pointer로 두고, 마지막 노드라면 목록의 끝을 pointer로 둡니다.
노드가 삽입, 제거 및 이동되어 미디어 요소에 들어갈 때, pointer는 다음과 같이 업데이트되어야 합니다.
다른 변경은 pointer에 영향을 주지 않습니다.
⌛ 후보 처리: candidate에
src
속성이 없거나, 그 src
속성 값이 빈 문자열이면 동기
구간을 끝내고,
아래의 요소에서 실패 단계로 이동합니다.
⌛ candidate에 값이
환경과
일치하지 않는
media
속성이 있으면 동기
구간을 끝내고,
아래의 요소에서 실패 단계로 이동합니다.
⌛ urlRecord를 candidate의
src
속성 값과, 해당 src
속성이 마지막으로 변경되었을 때의 candidate의
노드 문서를
기준으로
URL을 인코딩
파싱한 결과로
둡니다.
⌛ urlRecord가 실패이면 동기 구간을 끝내고, 아래의 요소에서 실패 단계로 이동합니다.
⌛ candidate에, MIME 유형으로 파싱했을 때
(codecs 매개변수를 정의하는 유형에서는 해당 매개변수에 설명된 코덱 포함)
사용자 에이전트가
렌더링할 수 없음을 알고 있는 유형을 나타내는 값의
type
속성이 있으면 동기
구간을 끝내고,
아래의 요소에서 실패 단계로 이동합니다.
⌛ currentSrc
속성을 urlRecord에
URL 직렬 변환기를 적용한 결과로 설정합니다.
urlRecord를 사용하여 리소스 가져오기 알고리즘을 실행합니다. 해당 알고리즘이 이 알고리즘을 중단하지 않고 반환하면 로드가 실패한 것입니다.
요소에서 실패:
미디어 요소가 주어졌을 때
미디어
요소 태스크를 큐에
추가하여 candidate에서
error라는
이름의 이벤트를
발생시킵니다.
안정 상태를 기다립니다. 동기 구간은 알고리즘이 동기 구간이 끝났다고 말할 때까지 이 알고리즘의 남은 모든 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)
⌛ 다음 후보 찾기: candidate를 null로 둡니다.
⌛ 검색 루프: pointer 뒤의 노드가 목록의 끝이면 아래의 대기 단계로 이동합니다.
⌛ pointer 뒤의 노드가
source
요소이면, candidate를 해당 요소로 둡니다.
⌛ pointer 앞의 노드가 이제 이전에 pointer 뒤에 있던 노드가 되고, pointer 뒤의 노드가 존재한다면 이전에 pointer 뒤에 있던 노드의 다음 노드가 되도록 pointer를 전진시킵니다.
⌛ candidate가 null이면 검색 루프 단계로 돌아갑니다. 그렇지 않으면 후보 처리 단계로 돌아갑니다.
⌛ 대기: 요소의
networkState
속성을 NETWORK_NO_SOURCE
값으로 설정합니다.
⌛ 요소의 포스터 표시 플래그를 true로 설정합니다.
⌛ 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.
pointer 뒤의 노드가 목록의 끝이 아닌 노드가 될 때까지 기다립니다. (이 단계는 영원히 기다릴 수 있습니다.)
안정 상태를 기다립니다. 동기 구간은 알고리즘이 동기 구간이 끝났다고 말할 때까지 이 알고리즘의 남은 모든 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)
⌛ 요소의 load 이벤트 지연 플래그를 다시 true로 설정합니다(아직 발생하지 않았다면 이는 load 이벤트를 다시 지연합니다).
⌛ networkState를
다시 NETWORK_LOADING으로
설정합니다.
⌛ 위의 다음 후보 찾기 단계로 돌아갑니다.
프로미스 목록 promises가 주어진 전용 미디어 소스 실패 단계는 다음과 같습니다.
error
속성을 MEDIA_ERR_SRC_NOT_SUPPORTED로
MediaError를 생성한
결과로 설정합니다.
요소의 networkState
속성을 NETWORK_NO_SOURCE
값으로 설정합니다.
요소의 포스터 표시 플래그를 true로 설정합니다.
promises와
"NotSupportedError"
DOMException을
사용하여 대기 중인 재생 프로미스를
거부합니다.
요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.
응답 response,
미디어 리소스 resource,
그리고 "entire resource" 또는
(숫자, 숫자 또는 "until end") 튜플 byteRange가 주어졌을 때
미디어 응답을 검증하려면 다음을 수행합니다.
response가 네트워크 오류이면 false를 반환합니다.
byteRange가 "entire resource"이면 true를 반환합니다.
internalResponse를 response의 안전하지 않은 응답으로 둡니다.
internalResponse의 상태가 200이면 true를 반환합니다.
internalResponse의 상태가 206이 아니면 false를 반환합니다.
internalResponse에서 content-range 값을 추출한 결과가 실패이면 false를 반환합니다.
추출된 값은 사용되지 않으며, 특히 byteRange와 비교되지도 않습니다.
따라서 이 단계는 `Content-Range`
헤더를 구문적으로 검증하는 역할을 하지만, 응답의 `Content-Range`
값과 요청의 `Range`
값이 일치하지 않더라도 실패로 간주하지 않습니다.
internalResponse의
URL이 null이면
origin을
"rewritten"으로 두고, 그렇지 않으면 internalResponse의
URL의
출처로 둡니다.
previousOrigin을 resource의 출처로 둡니다.
다음 중 하나라도 true이면 다음을 수행합니다.
previousOrigin이 "none"입니다.
origin과 previousOrigin이 모두
"rewritten"입니다.
origin과 previousOrigin이 출처이고, origin이 previousOrigin과 동일 출처입니다.
그러면 resource의 출처를 origin으로 설정합니다.
그렇지 않고 response가 CORS 교차 출처이면 false를 반환합니다.
그렇지 않으면 resource의
출처를
"multiple"로 설정합니다.
이는 범위 헤더가 있는 불투명 응답을 서로 다른 출처의 다른 응답과 이어 붙여 정보가 유출되는 것을 방지합니다.
true를 반환합니다.
미디어 요소와 주어진 URL 레코드 또는 미디어 제공자 객체를 위한 리소스 가져오기 알고리즘은 다음과 같습니다.
미디어 요소가 주어졌을 때 요소가 지연 로드될지 결정하는 단계가 true를 반환하면 다음을 수행합니다.
resumptionSteps를 mode를 remote로 둡니다라고 표시된 단계부터 시작하는 이 알고리즘의 나머지 부분으로 둡니다.
미디어 요소의 지연 로드 재개 단계를 resumptionSteps로 설정합니다.
미디어 요소에 대해 지연 로딩 요소의 교차 관찰을 시작합니다.
반환합니다.
mode를 remote로 둡니다.
알고리즘이 미디어 제공자 객체와 함께 호출되었다면 mode를 local로 설정합니다.
그렇지 않으면 다음을 수행합니다.
isTopLevelSelfFetch를 false로 둡니다.
다음 조건이 모두 true이면 다음을 수행합니다.
그러면 isTopLevelSelfFetch를 true로 설정합니다.
isTopLevelSelfFetch가 true이면 stringOrEnvironment을
"top-level-self-fetch"로 두고, 그렇지 않으면 settingsObject로
둡니다.
object를 URL 레코드의 blob URL 항목과 stringOrEnvironment을 사용하여 blob 객체를 얻은 결과로 둡니다.
object가 미디어 제공자 객체이면 mode를 local로 설정합니다.
mode가 remote이면 current media resource를 이 알고리즘에 전달된 URL 레코드가 제공하는 리소스로 두고, 그렇지 않으면 current media resource를 미디어 제공자 객체가 제공하는 리소스로 둡니다. 어느 경우든 이제 current media resource는 요소의 미디어 리소스입니다.
미디어 요소의 대기 중인 텍스트 트랙 목록이 있다면, 그 목록에서 모든 미디어 리소스별 텍스트 트랙을 제거합니다.
다음 목록에서 적절한 단계를 실행합니다.
선택적으로 다음 하위 단계를 실행합니다. 사용자 에이전트가 사용자가 명시적으로 요청할
때까지 리소스 가져오기를 시도하지 않으려는 경우
(예: preload
속성의 none
키워드를 구현하는 방법) 예상되는 동작입니다.
networkState를
NETWORK_IDLE로
설정합니다.
미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 요소에서
suspend라는
이름의 이벤트를
발생시킵니다.
미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.
태스크가 실행될 때까지 기다립니다.
구현 정의 이벤트 (예: 사용자가 미디어 요소에 재생 시작을 요청함)를 기다립니다.
요소의 load 이벤트 지연 플래그를 다시 true로 설정합니다(아직 발생하지 않았다면 이는 load 이벤트를 다시 지연합니다).
networkState를
NETWORK_LOADING으로
설정합니다.
미디어 요소가
audio
요소이면 destination을 "audio"로 두고, 그렇지 않으면
"video"로 둡니다.
request를 current media resource의
URL 레코드, destination,
그리고 미디어 요소의
crossorigin
콘텐츠 속성의 현재 상태가 주어졌을 때
잠재적 CORS 요청을 생성한
결과로 둡니다.
request의 개시자 유형을 destination으로 설정합니다.
byteRange를 "entire resource" 또는
(숫자, 숫자 또는 "until end") 튜플이며,
미디어 데이터에서 누락된 데이터를 충족하는 데
필요한 바이트 범위로 둡니다. 이 값은
구현 정의이며 코덱, 네트워크 상태 또는
다른 휴리스틱에 의존할 수 있습니다. 사용자 에이전트는 리소스 전체를 가져오도록 결정할 수
있으며, 이 경우 byteRange는 "entire resource"가 됩니다.
바이트 오프셋부터 끝까지 가져오도록 결정할 수 있으며, 이 경우 byteRange는
(숫자, "until end")가 됩니다. 또는 두 바이트 오프셋 사이의 범위를
가져오도록 결정할 수 있으며, 이 경우 byteRange는 두 오프셋을 나타내는
(숫자, 숫자) 튜플이 됩니다.
byteRange가 "entire resource"가 아니면 다음을 수행합니다.
request를 가져옵니다. 이때 processResponse를, 응답 response가 주어졌을 때의 다음 단계로 설정합니다.
updateMedia를 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 아래의 미디어 데이터 처리 단계 목록에서 첫 번째로 적절한 단계를 실행하는 것으로 둡니다. (아래 설명된 작업이 네트워킹 태스크 소스를 사용하는 대신 적절한 미디어 요소 이벤트 태스크 소스를 기준으로 이루어지도록 새 태스크를 사용합니다.)
processEndOfMedia를 다음 단계로 둡니다. 미디어 데이터 디코딩을 포함한 가져오기 과정이 오류 없이 완료되었고 모든 데이터를 네트워크 접근 없이 사용자 에이전트가 사용할 수 있다면, 사용자 에이전트는 아래의 마지막 단계로 진행해야 합니다. 웹 라디오 같은 무한 리소스를 스트리밍하거나 리소스가 사용자 에이전트의 데이터 캐시 용량보다 긴 경우처럼, 이 상황은 결코 발생하지 않을 수도 있습니다.
response, current media resource 및 byteRange가 주어졌을 때 검증한 결과가 false이면 이 단계를 중단합니다.
그렇지 않으면 updateMedia, processEndOfMedia, 빈 알고리즘 및 global이 주어졌을 때 response의 본문을 점진적으로 읽습니다.
이 방식으로 얻은 response의
안전하지 않은 응답의 내용으로
미디어 데이터를 업데이트합니다.
response는
CORS 동일 출처 또는
CORS 교차 출처일 수
있습니다.
이는 미디어 데이터에서 참조된 자막이 API에
노출되는지와, video
요소의 경우 비디오를 canvas에
그릴 때 canvas가 오염되는지에 영향을 줍니다.
미디어 요소 정지 시간 제한은 구현 정의 시간 길이이며, 약 3초여야 합니다. 미디어 데이터를 적극적으로 얻으려는 미디어 요소가 미디어 요소 정지 시간 제한과 같은 기간 동안 데이터를 전혀 수신하지 못했다면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 다음을 수행해야 합니다.
사용자 에이전트는 사용자가 미디어 데이터 다운로드를 선택적으로 차단하거나 느리게 할 수 있도록 허용할 수 있습니다. 미디어 요소의 다운로드가 완전히 차단되었다면, 사용자 에이전트는 연결이 닫힌 것처럼 동작하는 대신 정지된 것처럼 동작해야 합니다. 또한 사용자 에이전트는 예를 들어 동일한 대역폭을 공유하는 다른 연결과 다운로드의 균형을 맞추기 위해 다운로드 속도를 자동으로 제한할 수 있습니다.
사용자 에이전트는 언제든지 더 많은 콘텐츠를 다운로드하지 않기로
결정할 수 있습니다. 예를 들어 한 시간짜리 미디어 리소스의 5분 분량을 버퍼링한 뒤 사용자가
리소스를 재생할지 결정하기를 기다리는 동안, 대화형 리소스에서 사용자 입력을 기다리는 동안,
또는 사용자가 페이지를 떠날 때입니다.
미디어 요소의 다운로드가 일시 중단되면,
사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 networkState를
NETWORK_IDLE로
설정하고 요소에서 suspend라는
이름의 이벤트를
발생시켜야 합니다. 리소스 다운로드가
재개되면 사용자 에이전트는 미디어 요소가
주어졌을 때
미디어 요소 태스크를 큐에
추가하여 networkState를
NETWORK_LOADING으로
설정해야 합니다. 이러한 태스크가 큐에 추가되는 사이에는 로드가 일시 중단됩니다.
따라서 위에서 설명한 것처럼
progress
이벤트가 발생하지 않습니다.
preload
속성은 autoplay
속성이 없더라도 작성자가 어느 정도의 버퍼링이 적절하다고 생각하는지에 관한 힌트를
제공합니다.
사용자 에이전트가 다운로드를 완전히 일시 중단하기로 결정한 경우, 예를 들어 사용자가 재생을 시작할 때까지 추가 콘텐츠를 다운로드하지 않고 기다리는 경우, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 요소의 load 이벤트 지연 플래그를 false로 설정해야 합니다. 이는 load 이벤트 지연을 중지합니다.
위의 단계는 요청을 발행하기 위한 알고리즘을 제공하지만, 사용자 에이전트는 특히 오류 조건에서 정확히 이러한 방법 외의 다른 수단을 사용할 수 있습니다. 예를 들어 사용자 에이전트는 서버에 다시 연결하거나 스트리밍 프로토콜로 전환할 수 있습니다. 사용자 에이전트가 리소스 가져오기를 포기한 경우에만 리소스를 오류가 있는 것으로 간주하고 위 단계의 오류 분기로 진행해야 합니다.
미디어 리소스의 형식을 결정하기 위해 사용자 에이전트는 오디오와 비디오를 구체적으로 스니핑하기 위한 규칙을 사용해야 합니다.
로드가 일시 중단되지 않은 동안(아래 참조), 350ms(±200ms)마다 또는 수신한 각 바이트마다 중 빈도가 더 낮은 쪽에 따라, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 다음을 수행합니다.
사용자 에이전트가 미디어 리소스의 일부를 얻기 위해 여전히 네트워크 접근이 필요할 수 있는 동안 사용자 에이전트는 이 단계에 머물러야 합니다.
예를 들어 사용자 에이전트가 비디오의 전반부를 폐기했다면,
사용자가 시작 부분으로 다시 탐색할 가능성이 항상 있으므로
재생이 끝난 뒤에도 사용자 에이전트는
이 단계에 머뭅니다. 실제로 이 상황에서는
재생이 끝난 뒤 사용자 에이전트가
앞에서 설명한 대로 결국 suspend
이벤트를 발생시키게 됩니다.
current media resource가 설명하는 리소스가 있다면 그 리소스가 미디어 데이터를 포함합니다. 이는 CORS 동일 출처입니다.
current media resource가 원시 데이터 스트림
(예: File
객체에서 온 것)이면, 미디어 리소스의 형식을
결정하기 위해
사용자 에이전트는 오디오와 비디오를 구체적으로 스니핑하기 위한
규칙을 사용해야 합니다. 그렇지 않고 데이터 스트림이 사전 디코딩되어 있다면,
형식은 관련 명세에서 지정한 형식입니다.
current media resource의 새 데이터를 사용할 수 있게 될 때마다, 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 아래의 미디어 데이터 처리 단계 목록에서 첫 번째로 적절한 단계를 실행합니다.
current media resource가 영구적으로 소진되면
(예: Blob의
모든 바이트가 처리됨), 디코딩 오류가 없었다면 사용자 에이전트는 아래의
마지막 단계로 진행해야 합니다. current media resource가
MediaStream인
경우처럼, 이 상황은 결코 발생하지 않을 수도 있습니다.
미디어 데이터 처리 단계 목록은 다음과 같습니다.
사용자 에이전트가 current media resource를 사용할 수 있는지 확인하기 전에 발생한 DNS 오류, HTTP 4xx 및 5xx 오류(및 다른 프로토콜의 동등한 오류), 그 밖의 치명적인 네트워크 오류, 지원되지 않는 컨테이너 형식을 사용하는 파일, 또는 모든 데이터에 지원되지 않는 코덱을 사용하는 파일은 사용자 에이전트가 다음 단계를 실행하게 해야 합니다.
사용자 에이전트는 가져오기 과정을 취소하는 것이 좋습니다.
이 하위 알고리즘을 중단하고 리소스 선택 알고리즘으로 돌아갑니다.
오디오 트랙을 나타내는 AudioTrack
객체를 생성합니다.
미디어 요소의
audioTracks
속성의 AudioTrackList
객체를 새 AudioTrack
객체로 업데이트합니다.
enable을 unknown으로 둡니다.
미디어 리소스 또는 current media resource의 URL이 활성화할 특정 오디오 트랙 집합을 나타내거나, 사용자 에이전트에 사용자 경험을 개선하기 위해 특정 오디오 트랙을 선택하는 데 도움이 되는 정보가 있다면, 이 오디오 트랙이 활성화할 트랙 중 하나인 경우 enable을 true로 설정하고, 그렇지 않으면 false로 설정합니다.
이는 미디어 조각 구문에 의해 트리거될 수 있지만, 예를 들어 사용자 에이전트가 스테레오 오디오 트랙보다 5.1 서라운드 사운드 오디오 트랙을 선택하는 경우에도 트리거될 수 있습니다.
enable이 여전히 unknown이면, 미디어 요소에 아직 활성화된 오디오 트랙이 없을 경우 enable을 true로 설정하고, 그렇지 않으면 false로 설정합니다.
enable이 true이면 이 오디오 트랙을 활성화하고, 그렇지 않으면 활성화하지 않습니다.
이 AudioTrackList
객체에서 addtrack이라는
이름의 이벤트를
발생시킵니다. 이때
TrackEvent를
사용하고, track
속성을 새 AudioTrack
객체로 초기화합니다.
비디오 트랙을 나타내는
VideoTrack
객체를 생성합니다.
미디어 요소의
videoTracks
속성의 VideoTrackList
객체를 새 VideoTrack
객체로 업데이트합니다.
enable을 unknown으로 둡니다.
미디어 리소스 또는 current media resource의 URL이 활성화할 특정 비디오 트랙 집합을 나타내거나, 사용자 에이전트에 사용자 경험을 개선하기 위해 특정 비디오 트랙을 선택하는 데 도움이 되는 정보가 있다면, 이 비디오 트랙이 그러한 첫 번째 비디오 트랙인 경우 enable을 true로 설정하고, 그렇지 않으면 false로 설정합니다.
이 역시 미디어 조각 구문에 의해 트리거될 수 있습니다.
enable이 여전히 unknown이면, 미디어 요소에 아직 선택된 비디오 트랙이 없을 경우 enable을 true로 설정하고, 그렇지 않으면 false로 설정합니다.
enable이 true이면 이 트랙을 선택하고 이전에 선택된 모든 비디오
트랙의 선택을 해제하며, 그렇지 않으면 이 비디오 트랙을 선택하지 않습니다. 다른 트랙의
선택이 해제되면 change 이벤트가 발생합니다.
이 VideoTrackList
객체에서 addtrack이라는
이름의 이벤트를
발생시킵니다. 이때
TrackEvent를
사용하고, track
속성을 새 VideoTrack
객체로 초기화합니다.
이는 리소스를 사용할 수 있음을 나타냅니다. 사용자 에이전트는 다음 하위 단계를 따라야 합니다.
미디어 데이터를 기반으로, 현재 재생 위치와 가능한 가장 이른 위치를 위한 미디어 타임라인을 설정합니다.
이전 단계에서 설정한 미디어 타임라인의 0 시간에 해당하는 날짜와 시간이 있다면 타임라인 오프셋을 해당 날짜와 시간으로 업데이트합니다. 미디어 리소스에 명시적인 날짜와 시간이 없다면 타임라인 오프셋을 Not-a-Number(NaN)로 설정해야 합니다.
현재 재생 위치와 공식 재생 위치를 가능한 가장 이른 위치로 설정합니다.
위에서 설정한 미디어 타임라인에서
리소스의 마지막
프레임 시간을 알고 있다면 그 시간으로
duration
속성을 업데이트합니다. 알 수 없다면
(예: 원칙적으로 무한한 스트림), duration
속성을 양의 Infinity 값으로 업데이트합니다.
사용자 에이전트는 이 시점에
미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 요소에서 durationchange라는
이름의 이벤트를
발생시킵니다.
video
요소의 경우 videoWidth
및 videoHeight
속성을 설정하고, 미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 미디어 요소에서
resize라는
이름의 이벤트를
발생시킵니다.
이후 크기가 변경되면 추가
resize
이벤트가 발생합니다.
readyState
속성을 HAVE_METADATA로
설정합니다.
readyState
속성을 새 값으로 설정하는 과정의 일부로
loadedmetadata
DOM 이벤트가 발생합니다.
jumped를 false로 둡니다.
미디어 요소의 기본 재생 시작 위치가 0보다 크면 해당 시간으로 탐색하고, jumped를 true로 둡니다.
미디어 요소의 기본 재생 시작 위치를 0으로 설정합니다.
initial playback position을 0으로 둡니다.
미디어 리소스 또는 current media resource의 URL이 특정 시작 시간을 나타내면 initial playback position을 해당 시간으로 설정하고, jumped가 여전히 false이면 해당 시간으로 탐색합니다.
활성화된
오디오 트랙이 없으면
오디오 트랙 하나를 활성화합니다. 이로 인해
change 이벤트가 발생합니다.
선택된
비디오 트랙이 없으면
비디오 트랙 하나를 선택합니다. 이로 인해
change 이벤트가 발생합니다.
readyState
속성이 HAVE_CURRENT_DATA에
도달하면, loadeddata 이벤트가 발생한 뒤
요소의 load 이벤트 지연 플래그를
false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.
각 미디어 리소스의
메타데이터를 계속 가져오면서
네트워크 사용량을 줄이려는 사용자 에이전트는 이 시점에서 버퍼링도 중지할 것입니다.
이는 앞서 설명한 규칙을 따르며,
networkState
속성이 NETWORK_IDLE
값으로 전환되고 suspend
이벤트가 발생하는 것을 포함합니다.
사용자 에이전트는 재생 전에 미디어 리소스의 재생 시간을 결정하고 이 단계를 거쳐야 합니다.
미디어 요소에서
progress라는
이름의 이벤트를
발생시킵니다.
networkState를
NETWORK_IDLE로
설정하고, 미디어 요소에서
suspend라는
이름의 이벤트를
발생시킵니다.
사용자 에이전트가 미디어 데이터를 폐기한 뒤 다시 얻기 위해
네트워크 활동을 재개해야 한다면, 미디어 요소가
주어졌을 때
미디어 요소
태스크를 큐에
추가하여 networkState를
NETWORK_LOADING으로
설정해야 합니다.
사용자 에이전트가 미디어 리소스를 로드된 상태로 유지할 수 있다면 알고리즘은 아래의 마지막 단계로 진행하여 알고리즘을 중단합니다.
사용자 에이전트가 current media resource를 사용할 수 있는지 확인한 뒤
(즉, 미디어 요소의
readyState
속성이 더 이상 HAVE_NOTHING이
아닌 뒤) 발생한 치명적인 네트워크 오류는 사용자 에이전트가 다음 단계를 실행하게 해야 합니다.
사용자 에이전트는 가져오기 과정을 취소하는 것이 좋습니다.
error
속성을 MEDIA_ERR_NETWORK로
MediaError를 생성한
결과로 설정합니다.
요소의 networkState
속성을 NETWORK_IDLE
값으로 설정합니다.
요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.
전체 리소스 선택 알고리즘을 중단합니다.
사용자 에이전트가 current media resource를 사용할 수 있는지 확인한 뒤
(즉, 미디어 요소의
readyState
속성이 더 이상 HAVE_NOTHING이
아닌 뒤) 미디어 데이터를 디코딩하는 동안 발생한 치명적인
오류는 사용자 에이전트가 다음 단계를 실행하게 해야 합니다.
사용자 에이전트는 가져오기 과정을 취소하는 것이 좋습니다.
error
속성을 MEDIA_ERR_DECODE로
MediaError를 생성한
결과로 설정합니다.
요소의 networkState
속성을 NETWORK_IDLE
값으로 설정합니다.
요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.
전체 리소스 선택 알고리즘을 중단합니다.
예를 들어 사용자가 "중지" 버튼을 눌러 가져오기 과정이 중단되면 사용자 에이전트는 다음 단계를
실행해야 합니다. 이 단계를 실행하는 동안 load()
메서드 자체가 호출된 경우에는 위 단계가 그러한 종류의 중단을 처리하므로 이 단계를 따르지
않습니다.
사용자 에이전트는 가져오기 과정을 취소하는 것이 좋습니다.
error
속성을 MEDIA_ERR_ABORTED로
MediaError를 생성한
결과로 설정합니다.
미디어 요소의
readyState
속성 값이 HAVE_NOTHING과
같으면, 요소의 networkState
속성을 NETWORK_EMPTY
값으로 설정하고, 요소의 포스터 표시
플래그를 true로
설정하며, 요소에서 emptied라는
이름의 이벤트를
발생시킵니다.
그렇지 않으면 요소의 networkState
속성을 NETWORK_IDLE
값으로 설정합니다.
요소의 load 이벤트 지연 플래그를 false로 설정합니다. 이는 load 이벤트 지연을 중지합니다.
전체 리소스 선택 알고리즘을 중단합니다.
서버가 부분적으로 사용할 수 있지만 최적으로 렌더링할 수 없는 데이터를 반환하면, 사용자 에이전트는 처리할 수 있는 부분만 렌더링하고 나머지는 무시해야 합니다.
미디어 데이터가 CORS 동일 출처이면, 관련 데이터를 사용하여 미디어 리소스별 텍스트 트랙을 노출하는 단계를 실행합니다.
교차 출처 비디오는 자막을 노출하지 않습니다. 그렇게 하면 악의적인 사이트가 사용자의 인트라넷에 있는 기밀 비디오의 자막을 읽는 것과 같은 공격이 가능해지기 때문입니다.
마지막 단계: 사용자 에이전트가 이 단계에 도달하면 (이는 전체 리소스가 로드되고 사용 가능한 상태로 유지되는 경우에만 가능함), 전체 리소스 선택 알고리즘을 중단합니다.
미디어 요소가
미디어 요소의 미디어 리소스별 트랙을
잊어야 할 때, 사용자 에이전트는 미디어 요소의
텍스트 트랙 목록에서 모든
미디어 리소스별 텍스트 트랙을
제거한 다음, 미디어 요소의
audioTracks
속성의 AudioTrackList
객체를 비우고, 이어서 미디어 요소의
videoTracks
속성의 VideoTrackList
객체를 비워야 합니다. 이 과정의 일부로 이벤트
(특히 removetrack
이벤트)는 발생하지 않습니다. 대신 이 알고리즘을 호출하는 알고리즘에 의해 발생하는
error 및
emptied
이벤트를 사용할 수 있습니다.
preload 속성은
다음 키워드와 상태를 갖는
열거형 속성입니다.
| 키워드 | 상태 | 간략한 설명 |
|---|---|---|
auto
|
자동 | 전체 리소스를 낙관적으로 다운로드하는 것까지 포함하여, 서버에 위험을 주지 않는 범위에서 사용자 에이전트가 사용자의 필요를 우선할 수 있다는 힌트를 제공합니다. |
none
|
없음 | 작성자가 사용자가 미디어 리소스를 필요로 할 것으로 예상하지 않거나, 서버가 불필요한 트래픽을 최소화하려 한다는 힌트를 사용자 에이전트에 제공합니다. 이 상태는 어쨌든 버퍼링이 시작된 경우 (예: 사용자가 "재생"을 누른 뒤) 미디어 리소스를 실제로 얼마나 적극적으로 다운로드할지에 관한 힌트를 제공하지 않습니다. |
metadata
|
메타데이터 | 작성자가 사용자가 미디어 리소스를 필요로 할 것으로 예상하지 않지만,
리소스 메타데이터(크기, 트랙 목록, 재생 시간 등)와 경우에 따라 처음 몇 프레임까지 가져오는 것은
합리적이라는 힌트를 사용자 에이전트에 제공합니다. 사용자 에이전트가 정확히 메타데이터만 가져오면
미디어 요소의
readyState
속성은 결국 HAVE_METADATA로
설정됩니다. 하지만 일반적으로 일부 프레임도 함께 얻으므로
HAVE_CURRENT_DATA
또는 HAVE_FUTURE_DATA일
가능성이 큽니다. 미디어 리소스가 재생 중일 때는 대역폭을 희소한 것으로 간주해야 한다는 힌트를
사용자 에이전트에 제공합니다. 예를 들어 일관된 재생을 유지할 수 있는 가장 느린 속도로 미디어
데이터를 얻도록 다운로드를 제한할 것을 제안합니다.
|
속성의 누락 값 기본값과 유효하지 않은 값 기본값은 모두 구현 정의입니다. 다만 서버 부하 감소와 최적의 사용자 경험 제공 사이의 절충안으로 메타데이터 상태가 권장됩니다.
이 속성은 미디어 리소스가 버퍼링되거나 재생 중인 뒤에도 변경할 수 있습니다. 위 표의 설명은 이를 염두에 두고 해석해야 합니다.
작성자는 사용자가 재생을 시작한 뒤 속성을
"none"
또는 "metadata"에서
"auto"로
동적으로 전환할 수 있습니다. 예를 들어 많은 비디오가 있는 페이지에서는 여러 비디오를 요청받지 않는 한
다운로드하지 않도록 나타내되, 하나가 요청되면 해당 비디오를 적극적으로 다운로드하도록 나타내는 데 이를
사용할 수 있습니다.
preload
속성은 작성자가 최상의 사용자 경험으로 이어질 것이라고 생각하는 바에 관한 힌트를 사용자 에이전트에
제공하기 위한 것입니다. 이 속성은 명시적인 사용자 환경설정이나 사용 가능한 연결 상태 등을 근거로
완전히 무시될 수 있습니다.
preload
IDL 속성은
알려진 값으로만
제한하여
같은 이름의 콘텐츠 속성을
반영해야 합니다.
autoplay
속성은 preload
속성을 재정의할 수 있습니다. 미디어가 재생된다면
preload
속성이 제공한 힌트와 관계없이 자연스럽게 먼저 버퍼링해야 하기 때문입니다. 그러나 두 속성을 모두
포함하는 것은 오류가 아닙니다.
audio 및
video 요소에서
스크립팅이 활성화되어 있으면,
loading
속성은 요소의 지연 로드 재개
단계가 실행될 때까지
preload
속성이 암시한 동작을 연기할 수 있습니다.
media.buffered
현재 모든 엔진에서 지원됩니다.
사용자 에이전트가 버퍼링한 미디어 리소스의 범위를
나타내는
TimeRanges
객체를 반환합니다.
buffered getter 단계는
this의 미디어
리소스가 있다면 사용자 에이전트가
버퍼링한 해당 리소스의 범위를 나타내는 새로운
정규화된
TimeRanges 객체를 반환하는 것입니다. 사용자 에이전트는 지루한 검사를 통해서만
확인할 수 있는 미디어 스트림에서도 사용 가능한 범위를 정확하게 결정해야 합니다.
일반적으로 이는 0 지점에 고정된 단일 범위이지만, 예를 들어 사용자 에이전트가 탐색에 응답하여 HTTP 범위 요청을 사용하면 여러 범위가 있을 수 있습니다.
사용자 에이전트는 이전에 버퍼링한 데이터를 폐기할 수 있습니다.
따라서 한 시점에 buffered
속성이 반환한 객체의 범위에 포함된 시간 위치가, 나중에 같은 속성이 반환한 객체의 범위에는 포함되지 않을
수 있습니다.
접근할 때마다 새 객체를 반환하는 것은 속성 getter에 좋지 않은 패턴이며, 변경 비용이 크기 때문에 여기에만 유지되어 있습니다. 새로운 API에서 이를 모방해서는 안 됩니다.
media.duration
현재 모든 엔진에서 지원됩니다.
미디어 리소스의 시작이 시간 0에 있다고 가정할 때, 미디어 리소스의 길이를 초 단위로 반환합니다.
재생 시간을 사용할 수 없으면 NaN을 반환합니다.
경계가 없는 스트림이면 Infinity를 반환합니다.
media.currentTime [ = value ]
현재 모든 엔진에서 지원됩니다.
공식 재생 위치를 초 단위로 반환합니다.
주어진 시간으로 탐색하도록 설정할 수 있습니다.
미디어 리소스에는 시간(초)을 미디어 리소스의 위치에 매핑하는 미디어 타임라인이 있습니다. 타임라인의 원점은 가장 이른 정의된 위치입니다. 타임라인의 재생 시간은 마지막으로 정의된 위치입니다.
미디어
타임라인 설정: 미디어
리소스가 원점이 음수가 아닌 명시적 타임라인을 어떤 방식으로든 지정한다면
(즉, 각 프레임에 특정 시간 오프셋을 부여하고 첫 번째 프레임에 0 또는 양의 오프셋을 부여한다면),
미디어 타임라인은 해당 타임라인이어야 합니다.
(미디어 리소스가 타임라인을
지정할 수 있는지 여부는 미디어 리소스의 형식에 따라
달라집니다.)
미디어 리소스가 명시적인 시작 시간과
날짜를 지정한다면, 해당 시간과 날짜를
미디어 타임라인의 0 지점으로
간주해야 합니다. 타임라인 오프셋은 해당 시간과 날짜가
되며,
getStartDate()
메서드를 사용하여 노출됩니다.
미디어 리소스에 불연속적인 타임라인이 있는 경우, 사용자 에이전트는 리소스 시작 시 사용된 타임라인을 전체 리소스에 걸쳐 확장해야 합니다. 따라서 기반 미디어 데이터에 순서가 뒤바뀌거나 서로 겹치는 타임 코드가 있더라도, 미디어 리소스의 미디어 타임라인은 아래에 정의된 가능한 가장 이른 위치부터 선형적으로 증가해야 합니다.
예를 들어 두 클립을 하나의 비디오 파일로 연결했지만 비디오 형식이 두 클립의 원래 시간을 노출한다면, 비디오 데이터는 가령 00:15..00:29 다음에 00:05..00:38로 이어지는 타임라인을 노출할 수 있습니다. 그러나 사용자 에이전트는 이러한 시간을 노출하지 않고, 대신 하나의 비디오로서 00:15..00:29와 00:29..01:02로 노출합니다.
드물게 명시적인 타임라인이 없는 미디어 리소스의 경우,
미디어 타임라인의 0 시간은
미디어 리소스의 첫 번째
프레임에 대응해야 합니다. 그보다도 더 드물게 프레임 재생 시간을 포함하여 어떤 종류의 명시적 시간 정보도
없는 미디어 리소스의
경우, 사용자 에이전트는 각 프레임의 시간을
구현 정의
방식으로 직접 결정해야 합니다.
명시적인 타임라인은 없지만 명시적인 프레임 재생 시간이 있는 파일 형식의 예로 Animated
GIF 형식이 있습니다. 명시적인 시간 정보가 전혀 없는 파일 형식의 예로 JPEG-push 형식
(JPEG 프레임이 포함된 multipart/x-mixed-replace,
흔히 MJPEG 스트림 형식으로 사용됨)이 있습니다.
시간 정보가 없는 리소스의 경우에도 사용자 에이전트가 서버가 처음 제공한 프레임보다 앞선 지점으로 탐색할 수 있다면, 0 시간은 미디어 리소스의 가장 이른 탐색 가능 시간에 대응해야 합니다. 그렇지 않으면 서버에서 수신한 첫 번째 프레임 (사용자 에이전트가 스트림 수신을 시작한 미디어 리소스의 지점)에 대응해야 합니다.
이 글을 작성하는 시점에는 명시적인 프레임 시간 오프셋이 없으면서도 서버가 보낸 첫 번째 프레임보다 앞선 프레임으로 탐색할 수 있는 알려진 형식이 없습니다.
10월의 화창한 금요일 오후에 스트리밍을 시작하고, 연결하는 사용자 에이전트에 항상 동일한 미디어
타임라인상의 미디어 데이터를 전송하며, 0 시간을 이 스트림의 시작으로 설정하는 TV 방송국의 스트림을
생각해 보겠습니다. 몇 달 뒤 이 스트림에 연결한 사용자 에이전트는 자신이 수신한 첫 번째 프레임의 시간이
수백만 초에 달한다는 것을 알게 됩니다. getStartDate()
메서드는 항상 방송이 시작된 날짜를 반환합니다. 이를 통해 컨트롤러는 스크러버에 방송이 시작된 시점을
기준으로 한 시간("8개월, 4시간, 12분, 23초") 대신 실제 시간
(예: "오후 2:30")을 표시할 수 있습니다.
여러 개의 연결된 조각으로 구성된 비디오를 전달하는 스트림을 생각해 보겠습니다. 이 스트림은 사용자
에이전트가 특정 시간을 요청하는 것을 허용하지 않고, 첫 번째로 전달되는 프레임을 항상 시간 0인 프레임으로
식별하면서 미리 정해진 순서대로 비디오 데이터만 스트리밍하는 서버가 방송합니다. 사용자 에이전트가 이
스트림에 연결하여 타임스탬프 2010-03-20 23:15:00 UTC부터 2010-03-21 00:05:00 UTC까지와
2010-02-12 14:25:00 UTC부터 2010-02-12 14:35:00 UTC까지를 포함하는 것으로 정의된 조각을
수신하면, 0초에서 시작하여 3,600초(1시간)까지 이어지는
미디어 타임라인으로 이를 노출합니다.
스트리밍 서버가 두 번째 클립의 끝에서 연결을 끊었다고 가정하면, duration
속성은 3,600을 반환합니다. getStartDate()
메서드는 2010-03-20 23:15:00 UTC에 해당하는 시간을 가진
Date
객체를 반환합니다. 그러나 다른 사용자 에이전트가 5분 뒤 연결하면, 그 사용자 에이전트는
(아마도) 타임스탬프 2010-03-20 23:20:00 UTC부터 2010-03-21 00:05:00 UTC까지와
2010-02-12 14:25:00 UTC부터 2010-02-12 14:35:00 UTC까지를 포함하는 조각을 수신하고,
0초에서 시작하여 3,300초(55분)까지 이어지는
미디어 타임라인으로 이를 노출합니다.
이 경우 getStartDate()
메서드는 2010-03-20 23:20:00 UTC에 해당하는 시간을 가진 Date
객체를 반환합니다.
두 예제 모두에서 seekable
속성은 컨트롤러가 실제로 UI에 표시하려는 범위를 제공합니다. 일반적으로 서버가 임의의 시간으로 탐색하는
것을 지원하지 않는다면, 이는 사용자 에이전트가 스트림에 연결한 순간부터 사용자 에이전트가 얻은 최신
프레임까지의 시간 범위입니다. 그러나 사용자 에이전트가 이전 정보를 폐기하기 시작하면 실제 범위는 더
짧을 수 있습니다.
어떤 경우든 사용자 에이전트는 설정된 미디어 타임라인을 사용하는 아래에 정의된 가능한 가장 이른 위치가 0 이상이 되도록 보장해야 합니다.
미디어 타임라인에는 연관된 시계도 있습니다. 어떤 시계를 사용할지는 사용자 에이전트가 정의하며 미디어 리소스에 따라 달라질 수 있지만, 사용자의 벽시계와 비슷해야 합니다.
미디어 요소에는 현재 재생 위치가 있으며, 처음에는(즉, 미디어 데이터가 없을 때) 0초여야 합니다. 현재 재생 위치는 미디어 타임라인의 시간입니다.
미디어 요소에는 공식 재생 위치도 있으며, 처음에는 0초로 설정해야 합니다. 공식 재생 위치는 스크립트가 실행되는 동안 안정적으로 유지되는 현재 재생 위치의 근삿값입니다.
미디어 요소에는 기본 재생 시작 위치도 있으며, 처음에는 0초로 설정해야 합니다. 이 시간은 미디어가 로드되기 전에도 요소를 탐색할 수 있게 하는 데 사용됩니다.
각 미디어 요소에는
포스터 표시 플래그가 있습니다.
미디어 요소가 생성되면 이 플래그를 true로
설정해야 합니다. 이 플래그는 사용자 에이전트가 video
요소에 비디오 콘텐츠 대신 포스터 프레임을 표시할 시점을 제어하는 데 사용됩니다.
currentTime 속성은 가져올 때
미디어 요소의
기본
재생 시작 위치를 반환해야
합니다. 단, 그 값이 0이면 요소의
공식 재생
위치를 반환해야 합니다.
반환값은 초 단위로 표현해야 합니다. 설정할 때 미디어
요소의 readyState가
HAVE_NOTHING이면,
미디어 요소의
기본 재생 시작 위치를 새 값으로
설정해야 합니다. 그렇지 않으면 공식 재생 위치를 새 값으로 설정한
다음 새 값으로 탐색해야 합니다. 새 값은 초 단위로
해석해야 합니다.
미디어 리소스가 스트리밍 리소스라면 사용자 에이전트는 버퍼에서 만료된 뒤 리소스의 특정 부분을 얻지 못할 수 있습니다. 마찬가지로 일부 미디어 리소스에는 0에서 시작하지 않는 미디어 타임라인이 있을 수 있습니다. 가능한 가장 이른 위치는 사용자 에이전트가 다시 얻을 수 있는 스트림 또는 리소스에서 가장 이른 위치입니다. 이 역시 미디어 타임라인의 시간입니다.
가능한 가장 이른 위치는 API에 명시적으로
노출되지 않습니다. 범위가 있다면 seekable
속성의 TimeRanges
객체에 있는 첫 번째 범위의 시작 시간에 대응하며, 그렇지 않으면
현재
재생 위치에 대응합니다.
가능한 가장 이른
위치가 변경될 때,
현재 재생
위치가 가능한 가장 이른 위치보다 앞에 있으면
사용자 에이전트는 가능한 가장 이른 위치로
탐색해야 합니다.
그렇지 않고 사용자 에이전트가 지난 15~250ms 동안 요소에서 timeupdate
이벤트를 발생시키지 않았고 해당 이벤트의 이벤트 처리기를 여전히 실행 중이지 않다면,
사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소 태스크를
큐에 추가하여
요소에서 timeupdate라는
이름의 이벤트를
발생시켜야 합니다.
위 요구사항과 클립의 메타데이터를 알게 될 때 적용되는 리소스 가져오기 알고리즘의 요구사항으로 인해, 현재 재생 위치는 가능한 가장 이른 위치보다 작을 수 없습니다.
사용자 에이전트가 오디오 또는 비디오 트랙이 끝났으며 해당 트랙과 관련된 모든 미디어 데이터가 가능한 가장 이른 위치보다 앞선 미디어 타임라인 부분에 해당한다는 것을 언제든 알게 되면, 사용자 에이전트는 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 다음 단계를 실행할 수 있습니다.
적절한 경우 audioTracks
속성의 AudioTrackList
객체 또는 videoTracks
속성의 VideoTrackList
객체에서 해당 트랙을 제거합니다.
앞에서 언급한 미디어 요소의 AudioTrackList
또는 VideoTrackList
객체에서 removetrack이라는
이름의 이벤트를
발생시킵니다. 이때 TrackEvent를 사용하고
track
속성을 해당 트랙을 나타내는 AudioTrack 또는
VideoTrack 객체로
초기화합니다.
duration 속성은
미디어 타임라인에서
미디어 리소스가
끝나는 시간을 초 단위로 반환해야 합니다. 사용할 수 있는
미디어 데이터가 없다면
속성은 Not-a-Number(NaN) 값을 반환해야 합니다. 미디어 리소스의 경계가 정해져 있다고
알려지지 않은 경우(예: 스트리밍 라디오 또는 종료 시간이 공지되지 않은 라이브 이벤트),
속성은 양의 Infinity 값을 반환해야 합니다.
사용자 에이전트는 미디어 데이터의 어떤 부분이든 재생하기 전,
그리고 readyState를
HAVE_METADATA
이상의 값으로 설정하기 전에, 리소스의 여러 부분을 가져와야 하더라도
미디어 리소스의 재생 시간을 결정해야 합니다.
미디어 리소스의
길이가 알려진 값으로 변경될 때
(예: 알 수 없는 값에서 알려진 값으로 변경되거나, 이전에 설정된 길이에서 새로운 길이로 변경될 때),
사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에 추가하여
미디어 요소에서
durationchange라는
이름의 이벤트를
발생시켜야 합니다. (새로운 미디어 리소스를 로드하는 과정의 일부로 재생 시간이 재설정될 때는
이벤트가 발생하지 않습니다.) 재생 시간이 변경되어
현재 재생
위치가
미디어 리소스가
끝나는 시간보다 커지면, 사용자 에이전트는 미디어
리소스가 끝나는 시간으로도
탐색해야 합니다.
"무한" 스트림이 어떤 이유로 끝나면 재생 시간은 양의 Infinity에서 스트림의 마지막
프레임 또는 샘플 시간으로 변경되고, durationchange
이벤트가 발생합니다. 마찬가지로 사용자 에이전트가 처음에
미디어 리소스의 재생 시간을 정확히 결정하지
않고 추정했다가 나중에 새로운 정보를 기반으로 추정치를 수정하면, 재생 시간이 변경되고
durationchange
이벤트가 발생합니다.
일부 비디오 파일에는 미디어 타임라인의 0 시간에 대응하는 명시적인 날짜와 시간도 있으며, 이를 타임라인 오프셋이라고 합니다. 처음에는 타임라인 오프셋을 Not-a-Number(NaN)로 설정해야 합니다.
loop
속성은 불리언
속성이며, 지정된 경우 미디어 요소가
미디어 리소스의 끝에 도달했을 때 시작
부분으로 다시 탐색해야 함을 나타냅니다.
media.readyState
현재 모든 엔진에서 지원됩니다.
아래 목록의 코드 중 하나를 사용하여 현재 재생 위치를 렌더링하는 것과 관련된 요소의 현재 상태를 나타내는 값을 반환합니다.
미디어 요소에는 현재 재생 위치에서 렌더링할 준비가 어느 정도 되어 있는지를 설명하는 준비 상태가 있습니다. 가능한 값은 다음과 같습니다. 특정 시점의 미디어 요소의 준비 상태는 요소의 상태를 설명하는 값 중 가장 큰 값입니다.
HAVE_NOTHING (숫자 값 0)미디어 리소스에 관한 정보를 사용할 수
없습니다. 현재 재생 위치에 대한 데이터도
사용할 수
없습니다. networkState
속성이 NETWORK_EMPTY로
설정된 미디어 요소는 항상
HAVE_NOTHING
상태입니다.
HAVE_METADATA (숫자 값 1)리소스의 재생 시간을 사용할 수 있을 만큼 충분한 리소스를 얻었습니다.
video 요소의 경우
비디오 크기도 사용할 수 있습니다. 바로 현재의
현재 재생 위치에 사용할 수 있는
미디어 데이터는 없습니다.
HAVE_CURRENT_DATA (숫자 값 2)바로 현재의 현재 재생 위치에 대한 데이터는
사용할 수 있지만,
사용자 에이전트가 현재 재생 위치를
재생 방향으로 조금이라도 성공적으로 진행시킨 뒤 즉시
HAVE_METADATA
상태로 되돌아가지 않을 만큼 충분한 데이터를 사용할 수 없거나,
재생 방향으로 얻을 수 있는
데이터가 더 이상 없습니다. 예를 들어 비디오에서는 현재 재생 위치가 현재 프레임의 끝에 있을 때 사용자
에이전트가 현재 프레임의 데이터는 가지고 있지만 다음 프레임의 데이터는 가지고 있지 않은 경우와,
재생이 끝난 경우에 해당합니다.
HAVE_FUTURE_DATA (숫자 값 3)바로 현재의 현재 재생 위치에 대한 데이터를
사용할 수 있으며,
사용자 에이전트가 즉시 HAVE_METADATA
상태로 되돌아가지 않고 현재 재생 위치를
재생 방향으로 적어도
조금 진행시킬 만큼 충분한 데이터도 사용할 수 있고,
텍스트 트랙도
준비되어 있습니다. 예를 들어 비디오에서는 현재 재생 위치가 두 프레임 사이의 시점에 있을 때
사용자 에이전트가 적어도 현재 프레임과 다음 프레임에 대한 데이터를 가지고 있는 경우나,
현재 재생 위치가 프레임 중간에 있을 때 사용자 에이전트가 현재 프레임의 비디오 데이터와 적어도 조금
더 재생할 수 있는 오디오 데이터를 가지고 있는 경우에 해당합니다. 재생이 끝난
경우에는
현재 재생 위치가 더 이상 진행될 수
없으므로
사용자 에이전트는 이 상태일 수 없습니다.
HAVE_ENOUGH_DATA (숫자 값 4)HAVE_FUTURE_DATA
상태에 대해 설명한 모든 조건이 충족되며, 추가로 다음 조건 중 하나도 true입니다.
playbackRate로
진행되더라도, 재생이 미디어 리소스의 끝에 도달하기 전에 사용 가능한 데이터를
추월하지 않을 것으로 추정합니다.
실제로 HAVE_METADATA와
HAVE_CURRENT_DATA
사이의 차이는 무시할 만합니다. 실제로 차이가 중요한 유일한 경우는
video 요소를
canvas에 그릴
때입니다. 이 경우 무언가가 그려지는 경우
(HAVE_CURRENT_DATA
이상)와 아무것도 그려지지 않는 경우
(HAVE_METADATA
이하)를 구분합니다. 마찬가지로 HAVE_CURRENT_DATA
(현재 프레임만)와 HAVE_FUTURE_DATA
(적어도 이 프레임과 다음 프레임) 사이의 차이도 무시할 만할 수 있습니다
(극단적으로는 한 프레임 차이뿐입니다). 이 구분이 실제로 중요한 유일한 경우는 페이지가
"프레임 단위" 탐색 인터페이스를 제공할 때입니다.
networkState가
NETWORK_EMPTY가
아닌 미디어 요소의 준비 상태가 변경되면,
사용자 에이전트는 아래 단계를 따라야 합니다.
다음 목록에서 처음으로 적용되는 하위 단계 집합을 적용합니다.
HAVE_NOTHING이고,
새 준비 상태가 HAVE_METADATA인
경우
미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에 추가하여 요소에서 loadedmetadata라는
이름의 이벤트를 발생시킵니다.
이 태스크가 실행되기 전에 이벤트 루프 메커니즘의 일부로 렌더링이
업데이트되어,
적절한 경우 video 요소의
크기가 조정됩니다.
HAVE_METADATA이고,
새 준비 상태가 HAVE_CURRENT_DATA
이상인 경우이 미디어 요소에서
load() 알고리즘이
마지막으로 호출된 이후 이 상황이 처음 발생한 경우, 사용자 에이전트는
미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여
요소에서 loadeddata라는
이름의 이벤트를 발생시켜야 합니다.
새 준비 상태가 HAVE_FUTURE_DATA
또는 HAVE_ENOUGH_DATA이면,
아래의 관련 단계도 실행해야 합니다.
HAVE_FUTURE_DATA
이상이고, 새 준비 상태가
HAVE_CURRENT_DATA
이하인 경우
미디어 요소의
readyState
속성이 HAVE_FUTURE_DATA보다
낮은 값으로 변경되기 전에 요소가 잠재적으로 재생 중이었고,
요소의
재생이 끝나지 않았으며,
재생이 오류로 인해 중지되지 않았고,
사용자 상호 작용을 위해 일시
정지되거나
대역 내 콘텐츠를 위해 일시
정지되지 않았다면,
사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 요소에서
timeupdate라는
이름의 이벤트를 발생시키고,
미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 요소에서
waiting이라는
이름의 이벤트를 발생시켜야 합니다.
HAVE_CURRENT_DATA
이하이고, 새 준비 상태가
HAVE_FUTURE_DATA인
경우
사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 요소에서
canplay라는
이름의 이벤트를 발생시켜야 합니다.
HAVE_ENOUGH_DATA인
경우
이전 준비 상태가 HAVE_CURRENT_DATA
이하이면, 사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 요소에서
canplay이라는
이름의 이벤트를 발생시켜야 합니다. 또한 요소의
paused 속성이
false이면 요소에 대해 재생 중임을 알림해야
합니다.
사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 요소에서
canplaythrough라는
이름의 이벤트를 발생시켜야 합니다.
요소가 자동 재생 가능 상태가 아니면 사용자 에이전트는 이 하위 단계를 중단해야 합니다.
사용자 에이전트는 다음 하위 단계를 실행할 수 있습니다.
paused
속성을 false로 설정합니다.play라는 이름의
이벤트를 발생시킵니다.
또는 요소가 video 요소인 경우,
사용자 에이전트는 요소가 뷰포트와 교차하는지
관찰하기 시작할 수 있습니다.
요소가 뷰포트와 교차하기 시작할 때 요소가
여전히
자동 재생 가능 상태이면 위 하위 단계를
실행합니다.
선택적으로 요소가 뷰포트와 교차하지 않게 될
때,
자동 재생 가능 플래그가
여전히 true이고 autoplay
속성이
여전히 지정되어 있다면 다음 하위 단계를 실행합니다.
pause라는
이름의 이벤트를 발생시킵니다.
자동 재생 가능 플래그가 true인 동안에는 요소가 뷰포트와 교차하기 시작하거나 중지할 때 재생 및 일시 정지 하위 단계를 여러 번 실행할 수 있습니다.
사용자 에이전트는 자동 재생을 지원할 필요가 없으며, 이 문제에 관한 사용자
환경설정을 따르는 것이 권장됩니다. 작성자는 사용자가 원할 경우 동작을 재정의할 수 있도록
스크립트로 비디오를 강제로 재생하는 대신 autoplay
속성을 사용하는 것이 강력히 권장됩니다.
미디어 요소의 준비 상태는 이러한 상태 사이를 불연속적으로 건너뛸 수 있습니다.
예를 들어 미디어 요소의 상태는 HAVE_CURRENT_DATA
및 HAVE_FUTURE_DATA
상태를 거치지 않고 HAVE_METADATA에서
곧바로 HAVE_ENOUGH_DATA로
건너뛸 수 있습니다.
readyState IDL 속성은 가져올 때
미디어 요소의 현재 준비 상태를 설명하는 위의 값을 반환해야
합니다.
autoplay
속성은
불리언 속성입니다.
이 속성이 존재하면 사용자 에이전트는 여기 설명된 알고리즘에 따라 중단하지 않고 재생할 수 있게 되는 즉시
미디어 리소스의 재생을 자동으로
시작합니다.
작성자는 자동 재생이 원하지 않는 경우, 예를 들어 화면 판독기를 사용할 때 사용자가
자동 재생을 재정의할 수 있도록 스크립트로 자동 재생을 트리거하는 대신 autoplay
속성을 사용하는 것이 강력히 권장됩니다. 작성자는 자동 재생 동작을 전혀 사용하지 않고 사용자 에이전트가
사용자가 명시적으로 재생을 시작할 때까지 기다리도록 하는 것도 고려하는 것이 권장됩니다.
media.paused
현재 모든 엔진에서 지원됩니다.
재생이 일시 정지되어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
media.ended
현재 모든 엔진에서 지원됩니다.
재생이 미디어 리소스의 끝에 도달했으면 true를 반환합니다.
media.defaultPlaybackRate [ = value ]
HTMLMediaElement/defaultPlaybackRate
현재 모든 엔진에서 지원됩니다.
사용자가 미디어 리소스를 빨리 감거나 되감고 있지 않을 때의 기본 재생 속도를 반환합니다.
기본 재생 속도를 변경하도록 설정할 수 있습니다.
기본 속도는 재생에 직접적인 영향을 주지 않지만, 사용자가 빨리 감기 모드로 전환했다가 일반 재생 모드로 돌아오면 재생 속도가 기본 재생 속도로 복원될 것으로 예상됩니다.
media.playbackRate [ = value ]
현재 모든 엔진에서 지원됩니다.
1.0이 일반 속도인 현재 재생 속도를 반환합니다.
재생 속도를 변경하도록 설정할 수 있습니다.
media.preservesPitch
HTMLMediaElement/preservesPitch
playbackRate가
1.0이 아닐 때 피치 보존 알고리즘을 사용하면 true를 반환합니다. 기본값은 true입니다.
false로 설정하면 미디어 리소스의 오디오 피치가
playbackRate에
따라 높아지거나 낮아지게 할 수 있습니다. 이는 미적 이유와 성능상의 이유로 유용합니다.
media.played사용자 에이전트가 재생한 미디어 리소스의 범위를 나타내는
TimeRanges
객체를 반환합니다.
media.play()
현재 모든 엔진에서 지원됩니다.
paused
속성을 false로 설정하고, 필요한 경우 미디어 리소스를
로드하여 재생을 시작합니다.
재생이 끝난 상태라면 시작 부분부터 다시 시작합니다.
media.pause()
현재 모든 엔진에서 지원됩니다.
paused
속성은 미디어 요소가 일시 정지되어
있는지를 나타냅니다. 이 속성은 처음에 true여야 합니다.
미디어 요소의
readyState
속성이 HAVE_NOTHING,
HAVE_METADATA
또는 HAVE_CURRENT_DATA
상태이거나, 요소가 사용자
상호 작용을 위해 일시 정지되었거나
대역 내 콘텐츠를 위해 일시
정지된 경우,
해당 요소는 차단된 미디어 요소입니다.
미디어 요소의
paused 속성이
false이고, 요소의 재생이 끝나지 않았으며, 재생이
오류로 인해 중지되지 않았고, 요소가
차단된 미디어 요소가 아닐 때,
해당 요소는 잠재적으로 재생 중이라고 합니다.
잠재적으로 재생 중인 요소가
readyState
속성이 HAVE_FUTURE_DATA보다
낮은 값으로 변경되어 재생을 중지하면, 그 결과로 waiting
DOM 이벤트가 발생할 수 있습니다.
다음 조건이 모두 true일 때 미디어 요소는 자동 재생 가능 상태라고 합니다.
요소의 자동 재생 가능 플래그가 true입니다.
요소의 paused
속성이 true입니다.
요소에 autoplay
속성이 지정되어 있습니다.
요소가 audio 또는
video 요소라면,
요소의 지연 로딩 속성이
Eager 상태이거나,
Lazy 상태에서 로드를
시작했거나,
요소에 대해 스크립팅이 비활성화되어 있습니다.
요소의 노드 문서의 활성 샌드박싱 플래그 집합에 샌드박스된 자동 기능 브라우징 컨텍스트 플래그가 설정되어 있지 않습니다.
사용자 에이전트와 시스템이 현재 컨텍스트에서 미디어 재생을 허용하는 경우 미디어 요소는 재생 허용됨 상태라고 합니다.
예를 들어 사용자 에이전트는 미디어
요소의
Window 객체에
일시적 활성화가 있을 때만 재생을 허용할 수
있지만, 음소거된 동안에는 재생을 허용하도록 예외를
둘 수
있습니다.
미디어 요소는 다음과 같은 경우 재생이 끝남 상태라고 합니다.
요소의 readyState
속성이 HAVE_METADATA
이상이고,
다음 중 하나입니다.
또는 다음과 같습니다.
현재 재생 위치가 가능한 가장 이른 위치이고,
재생 방향이 역방향입니다.
ended
속성은 이벤트 루프가 마지막으로
1단계에 도달했을 때 미디어
요소의
재생이 끝난 상태이고
재생 방향이 정방향이었다면 true를,
그렇지 않으면 false를 반환해야 합니다.
미디어 요소의
readyState
속성이 HAVE_METADATA
이상이고, 사용자 에이전트가 미디어 데이터를 처리하는 동안
치명적이지 않은 오류를 마주쳤으며, 그 오류로 인해
현재 재생 위치의
콘텐츠를 재생할 수
없는 경우, 해당 요소는 오류로 인해 중지됨 상태라고 합니다.
미디어 요소의
paused
속성이 false이고, readyState
속성이 HAVE_FUTURE_DATA
또는 HAVE_ENOUGH_DATA이며,
사용자 에이전트가 리소스를 계속하려면 사용자가 선택해야 하는
미디어 리소스의 지점에 도달한 경우,
해당 요소는 사용자 상호 작용을 위해 일시 정지됨 상태라고
합니다.
미디어 요소는 재생이 끝난 상태와 사용자 상호 작용을 위해 일시 정지된 상태를 동시에 가질 수 있습니다.
잠재적으로 재생 중인
미디어 요소가
사용자 상호 작용을 위해
일시 정지되어
재생을 중지하면, 사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여
요소에서 timeupdate라는
이름의 이벤트를 발생시켜야 합니다.
미디어 요소의
paused
속성이 false이고, readyState
속성이 HAVE_FUTURE_DATA
또는 HAVE_ENOUGH_DATA이며,
사용자 에이전트가 미디어 리소스에 시간적으로 고정되어 있고
길이가
0이 아닌 콘텐츠를 재생하기 위해, 또는 미디어 리소스의 한
구간에 시간적으로 고정되어
있지만 해당 구간보다 긴 콘텐츠를 재생하기 위해
미디어 리소스의 재생을 일시 중단한 경우,
해당 요소는 대역 내 콘텐츠를 위해 일시 정지됨 상태라고
합니다.
미디어 요소가 대역 내 콘텐츠를 위해 일시 정지되는 한 가지 예는 사용자 에이전트가 외부 WebVTT 파일의 오디오 설명을 재생하고 있으며, 큐에 대해 생성된 합성 음성이 텍스트 트랙 큐 시작 시간과 텍스트 트랙 큐 종료 시간 사이의 시간보다 긴 경우입니다.
재생 방향이 정방향일 때 현재 재생 위치가 미디어 리소스의 끝에 도달하면, 사용자 에이전트는 다음 단계를 따라야 합니다.
미디어 요소에
loop
속성이 지정되어 있다면, 미디어 리소스의
가능한 가장 이른
위치로
탐색하고 반환합니다.
위에서 정의한 대로 ended
IDL
속성은 이벤트 루프가
1단계로 돌아오면 true를 반환하기 시작합니다.
미디어 요소와 다음 단계가 주어졌을 때 미디어 요소 태스크를 큐에 추가합니다.
미디어 요소에서
timeupdate라는
이름의 이벤트를
발생시킵니다.
미디어 요소의 재생이 끝났고, 재생 방향이 정방향이며, paused가 false이면 다음을 수행합니다.
paused
속성을 true로 설정합니다.
대기
중인 재생 프로미스를 가져오고,
그 결과와 "AbortError"
DOMException을
사용하여 대기 중인 재생 프로미스를
거부합니다.
재생 방향이 역방향일 때
현재 재생 위치가
미디어 리소스의
가능한 가장 이른
위치에 도달하면,
사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여
요소에서 timeupdate라는
이름의 이벤트를 발생시키기만 해야 합니다.
여기서 "도달"이라는 단어는 현재 재생 위치가 일반 재생 중에 변경되어야 한다는 것을 의미하지 않습니다. 예를 들어 탐색을 통해 도달할 수도 있습니다.
defaultPlaybackRate 속성은
미디어 리소스가 재생되어야 하는 원하는 속도를
고유 속도의 배수로 제공합니다. 이 속성은 변경할 수 있습니다. 가져올 때 마지막으로 설정된 값을
반환해야 하며, 아직 설정되지 않았다면 1.0을 반환해야 합니다. 설정할 때 속성을 새 값으로 설정해야
합니다.
defaultPlaybackRate는
사용자 에이전트가 사용자에게 사용자 인터페이스를
노출할 때 사용합니다.
playbackRate 속성은
미디어 리소스가 재생되는 속도인 유효 재생
속도를 고유 속도의 배수로 제공합니다. 이 값이 defaultPlaybackRate와
같지 않다면 사용자가 빨리 감기 또는 느린 재생 같은 기능을 사용 중임을 의미합니다. 이 속성은 변경할 수
있습니다. 가져올 때 마지막으로 설정된 값을 반환해야 하며, 아직 설정되지 않았다면 1.0을 반환해야
합니다. 설정할 때 사용자 에이전트는 다음 단계를 따라야 합니다.
주어진 값을 사용자 에이전트가 지원하지 않으면
"NotSupportedError"
DOMException을
throw합니다.
playbackRate를
새 값으로 설정하고, 요소가 잠재적으로 재생
중이면 재생 속도를
변경합니다.
defaultPlaybackRate
또는 playbackRate
속성의 값이 변경되면(스크립트로 설정되거나 사용자 컨트롤에 대한 응답 등으로 사용자 에이전트가 직접
변경한 경우), 사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여
미디어 요소에서
ratechange라는
이름의 이벤트를 발생시켜야 합니다. 사용자 에이전트는 속성 변경을
부드럽게 처리해야 하며, 이에 대한 응답으로 인지할 수 있는 재생 공백이나 음소거를 발생시켜서는 안
됩니다.
preservesPitch getter 단계는 재생 중 피치 보존 알고리즘이
적용 중이면 true를 반환하는 것입니다. setter 단계는 인지할 수 있는 재생 공백이나 음소거 없이
피치 보존 알고리즘을 그에 따라 켜거나 끄는 것입니다. 기본적으로 이러한 피치 보존 알고리즘이 적용되어야
합니다(즉, getter는 처음에 true를 반환합니다).
played
getter 단계는 일반 재생 중 this의
현재 재생 위치가
일반적으로 단조
증가하여 도달한, this의
미디어 리소스의
미디어 타임라인 지점 범위를 나타내는 새로운
정규화된
TimeRanges
객체를 반환하는 것입니다.
접근할 때마다 새 객체를 반환하는 것은 속성 getter에 좋지 않은 패턴이며, 변경 비용이 크기 때문에 여기에만 유지되어 있습니다. 새로운 API에서 이를 모방해서는 안 됩니다.
각 미디어 요소에는 대기 중인 재생 프로미스 목록이 있으며, 처음에는 비어 있어야 합니다.
미디어 요소에 대해 대기 중인 재생 프로미스를 가져오려면, 사용자 에이전트는 다음 단계를 실행해야 합니다.
promises를 비어 있는 프로미스 목록으로 둡니다.
미디어 요소의 대기 중인 재생 프로미스 목록을 promises에 복사합니다.
미디어 요소의 대기 중인 재생 프로미스 목록을 비웁니다.
프로미스 목록 promises가 있는 미디어 요소에 대해 대기 중인 재생 프로미스를 이행하려면, 사용자 에이전트는 promises의 각 프로미스를 undefined로 이행해야 합니다.
프로미스 목록 promises와 예외 이름 error가 있는 미디어 요소에 대해 대기 중인 재생 프로미스를 거부하려면, 사용자 에이전트는 promises의 각 프로미스를 error로 거부해야 합니다.
미디어 요소에 대해 재생 중임을 알리려면, 사용자 에이전트는 다음 단계를 실행해야 합니다.
대기 중인 재생 프로미스를 가져오고, 그 결과를 promises로 둡니다.
요소와 다음 단계가 주어졌을 때 미디어 요소 태스크를 큐에 추가합니다.
promises를 사용하여 대기 중인 재생 프로미스를 이행합니다.
미디어 요소에서
play() 메서드가
호출되면 사용자 에이전트는 다음 단계를
실행해야 합니다.
미디어 요소가 재생 허용됨 상태가 아니라면
다음으로
거부된 프로미스, 즉 "NotAllowedError"
DOMException으로
거부된 프로미스를 반환합니다.
미디어 요소의 error 속성이
null이 아니고 해당 code가 MEDIA_ERR_SRC_NOT_SUPPORTED라면
다음으로
거부된 프로미스, 즉 "NotSupportedError"
DOMException으로
거부된 프로미스를
반환합니다.
이는 전용 미디어 소스 실패 단계가
실행되었음을 의미합니다. 미디어 요소 로드 알고리즘이
error
속성을 지울 때까지 재생할 수 없습니다.
resumptionSteps를 미디어 요소의 지연 로드 재개 단계로 둡니다.
resumptionSteps가 null이 아니면 다음을 수행합니다.
미디어 요소의 지연 로드 재개 단계를 null로 설정합니다.
resumptionSteps를 호출합니다.
promise를 새로운 프로미스로 두고 promise를 대기 중인 재생 프로미스 목록에 추가합니다.
promise를 반환합니다.
미디어 요소의 내부 재생 단계는 다음과 같습니다.
미디어 요소의
networkState
속성 값이 NETWORK_EMPTY이면,
미디어 요소의
리소스 선택
알고리즘을 호출합니다.
재생이 끝났고 재생 방향이 정방향이면 미디어 리소스의 가능한 가장 이른 위치로 탐색합니다.
이 작업은 사용자 에이전트가
미디어 요소가 주어졌을 때
미디어 요소 태스크를
큐에 추가하여
미디어 요소에서
timeupdate라는
이름의 이벤트를 발생시키게
합니다.
미디어 요소의
paused
속성이 true이면 다음을 수행합니다.
paused
값을 false로 변경합니다.
포스터 표시 플래그가 true이면 요소의 포스터 표시 플래그를 false로 설정하고 시간 진행 단계를 실행합니다.
미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에
추가하여 요소에서 play라는
이름의 이벤트를
발생시킵니다.
미디어 요소의
readyState
속성 값이 HAVE_NOTHING,
HAVE_METADATA
또는 HAVE_CURRENT_DATA이면,
미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에 추가하여
요소에서 waiting이라는
이름의 이벤트를
발생시킵니다.
그렇지 않으면 미디어 요소의
readyState
속성 값은 HAVE_FUTURE_DATA
또는 HAVE_ENOUGH_DATA입니다.
요소에 대해 재생 중임을
알림합니다.
그렇지 않고 미디어 요소의
readyState
속성 값이 HAVE_FUTURE_DATA
또는 HAVE_ENOUGH_DATA이면,
대기 중인 재생
프로미스를 가져오고,
미디어 요소가 주어졌을 때
미디어 요소 태스크를
큐에 추가하여
그 결과로 대기 중인 재생 프로미스를
이행합니다.
미디어 요소는 이미 재생 중입니다. 그러나 큐에 추가된 태스크가 실행되기 전에 promise가 거부될 수도 있습니다.
미디어 요소의 자동 재생 가능 플래그를 false로 설정합니다.
pause() 메서드가
호출되거나 사용자 에이전트가
미디어 요소를 일시 정지해야 할 때,
사용자 에이전트는 다음 단계를 실행해야 합니다.
미디어 요소의
networkState
속성 값이 NETWORK_EMPTY이면,
미디어 요소의
리소스 선택
알고리즘을
호출합니다.
미디어 요소에 대해 내부 일시 정지 단계를 실행합니다.
미디어 요소의 내부 일시 정지 단계는 다음과 같습니다.
미디어 요소의 자동 재생 가능 플래그를 false로 설정합니다.
미디어 요소의
paused
속성이 false이면 다음 단계를 실행합니다.
paused
값을 true로 변경합니다.
대기 중인 재생 프로미스를 가져오고, 그 결과를 promises로 둡니다.
미디어 요소와 다음 단계가 주어졌을 때 미디어 요소 태스크를 큐에 추가합니다.
요소에서 timeupdate라는
이름의 이벤트를
발생시킵니다.
promises와
"AbortError"
DOMException을
사용하여 대기 중인 재생 프로미스를
거부합니다.
요소의 playbackRate가
양수 또는 0이면 재생 방향은 정방향입니다.
그렇지 않으면 역방향입니다.
미디어 요소가
잠재적으로 재생 중이고
그 Document가
완전히 활성 상태인
Document이면,
해당 요소의 현재 재생
위치는
미디어 타임라인 시계의 단위 시간당 요소의
playbackRate
단위의 미디어 시간으로 단조 증가해야 합니다. (이 명세에서는 항상 이를 증가라고 하지만,
요소의 playbackRate가
음수이면 실제로는 감소일 수 있습니다.)
요소의 playbackRate는
0.0일 수 있습니다. 이 경우 재생이 일시 정지되어 있지 않더라도
현재 재생 위치는 움직이지
않습니다
(paused가 true가
되지 않고, pause 이벤트도
발생하지 않습니다).
이 명세는 사용자 에이전트가 적절한 재생 속도를 달성하는 방법을 정의하지 않습니다. 사용 가능한 프로토콜과 미디어에 따라 사용자 에이전트가 서버와 협상하여 서버가 적절한 속도로 미디어 데이터를 제공하도록 할 수도 있습니다. 그러면 속도가 변경된 시점과 서버가 스트림의 재생 속도를 업데이트한 시점 사이의 기간을 제외하면 클라이언트가 실제로 프레임을 삭제하거나 보간할 필요가 없습니다.
요소의 playbackRate가
1.0이 아니고 preservesPitch가
true이면 사용자 에이전트는 오디오의 원래 피치를 보존하기 위해 피치 조절을 적용해야 합니다.
그렇지 않으면 피치 조절 없이 오디오 속도를 높이거나 낮춰야 합니다.
미디어 요소가 잠재적으로 재생 중일 때 재생되는 오디오 데이터는 요소의 유효 미디어 볼륨으로 현재 재생 위치와 동기화되어야 합니다. 사용자 에이전트는 이벤트 루프가 마지막으로 1단계에 도달했을 때 활성화되어 있던 오디오 트랙의 오디오를 재생해야 합니다.
미디어 요소가 잠재적으로 재생 중이 아니면 요소의 오디오를 재생해서는 안 됩니다.
미디어 요소가 문서 안에 있지 않은 동안 잠재적으로 재생 중이면 비디오는 재생해서는 안 되지만, 오디오 구성 요소는 재생하는 것이 좋습니다. 미디어 요소에 대한 모든 참조가 제거되었다는 이유만으로 재생을 중지해서는 안 됩니다. 해당 미디어 요소가 더 이상 어떤 오디오도 재생할 수 없는 상태가 된 뒤에만 가비지 컬렉션할 수 있습니다.
명시적인 참조가 없는 요소도 오디오를 재생할 수 있습니다. 이러한 요소가 여전히
능동적으로 재생 중이지 않더라도 가능합니다. 예를 들어 일시 정지되지 않았지만 콘텐츠가 버퍼링되기를
기다리며 정지되어 있거나, 아직 버퍼링 중이지만 재생을 시작하는
suspend
이벤트 리스너가 있을 수 있습니다. 미디어 리소스에 오디오 트랙이
없는 미디어
요소조차도 미디어 리소스를 변경하는 이벤트 리스너가
있다면 나중에 다시 오디오를 재생할 수 있습니다.
각 미디어 요소에는 새로 도입된 큐 목록이 있으며, 처음에는 비어 있어야 합니다. 미디어 요소의 텍스트 트랙 목록에 있는 텍스트 트랙의 큐 목록에 텍스트 트랙 큐가 추가될 때마다, 해당 큐를 미디어 요소의 새로 도입된 큐 목록에 추가해야 합니다. 미디어 요소의 텍스트 트랙 목록에 텍스트 트랙이 추가될 때마다, 해당 텍스트 트랙의 큐 목록에 있는 모든 큐를 미디어 요소의 새로 도입된 큐 목록에 추가해야 합니다. 미디어 요소의 포스터 표시 플래그가 설정되어 있지 않은 동안 새로 도입된 큐 목록에 새 큐가 추가되면, 사용자 에이전트는 시간 진행 단계를 실행해야 합니다.
미디어 요소의 텍스트 트랙 목록에 있는 텍스트 트랙의 큐 목록에서 텍스트 트랙 큐가 제거될 때마다, 그리고 미디어 요소의 텍스트 트랙 목록에서 텍스트 트랙이 제거될 때마다, 미디어 요소의 포스터 표시 플래그가 설정되어 있지 않다면 사용자 에이전트는 시간 진행 단계를 실행해야 합니다.
미디어 요소의 현재 재생 위치가 변경되면 (예: 재생 또는 탐색으로 인해) 사용자 에이전트는 시간 진행 단계를 실행해야 합니다. 비디오의 장면 전환과 자막을 동기화하는 경우처럼 큐 이벤트 발생의 시간 정확도에 의존하는 사용 사례를 지원하기 위해 사용자 에이전트는 큐 이벤트를 미디어 타임라인상의 위치에 가능한 한 가깝게, 이상적으로는 20밀리초 이내에 발생시키는 것이 좋습니다. 단계가 실행되는 동안 현재 재생 위치가 변경되면, 사용자 에이전트는 단계가 완료될 때까지 기다린 다음 즉시 단계를 다시 실행해야 합니다. 따라서 이 단계는 가능한 한 자주 또는 필요한 만큼 실행됩니다.
한 번의 반복에 오랜 시간이 걸리면 사용자 에이전트가 "따라잡기" 위해 앞으로
빠르게 진행하면서 재생 시간이 짧은 큐를 건너뛸 수 있습니다.
그러면 이러한 큐는 activeCues
목록에 나타나지 않습니다.
시간 진행 단계는 다음과 같습니다.
current cues를 큐 목록으로 둡니다. 이 목록은 미디어 요소의 또는 표시 중인 모든 텍스트 트랙 (단, 비활성화된 트랙은 제외)의 모든 큐 중, 시작 시간이 현재 재생 위치 이하이고 종료 시간이 현재 재생 위치보다 큰 모든 큐를 포함하도록 초기화합니다.
other cues를 큐 목록으로 둡니다. 이 목록은 current cues에 없는 미디어 요소의 및 표시 중인 텍스트 트랙의 모든 큐를 포함하도록 초기화합니다.
이 알고리즘이 이 미디어 요소에 대해 처음 실행된 것이 아니라면, last time을 이 알고리즘이 마지막으로 실행되었을 때의 현재 재생 위치로 둡니다.
현재 재생 위치가 이 알고리즘이 마지막으로 실행된 이후 일반 재생 중의 일반적인 단조 증가를 통해서만 변경되었다면, missed cues를 other cues에 있는 큐 중 시작 시간이 last time 이상이고 종료 시간이 현재 재생 위치 이하인 큐의 목록으로 둡니다. 그렇지 않으면 missed cues를 빈 목록으로 둡니다.
missed cues에 있는 큐 중 미디어 요소의 새로 도입된 큐 목록에도 있는 모든 큐를 제거한 다음, 요소의 새로 도입된 큐 목록을 비웁니다.
일반 재생 중 현재
재생 위치의 일반적인 단조
증가를 통해 해당 시간에 도달했고, 사용자 에이전트가 지난 15~250ms 동안 요소에서
timeupdate
이벤트를 발생시키지 않았으며 해당 이벤트의 이벤트 처리기를 여전히 실행 중이지 않다면,
사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에
추가하여 요소에서 timeupdate라는
이름의 이벤트를 발생시켜야
합니다. (명시적 탐색 같은 다른
경우에는 현재 재생
위치를 변경하는 전체
과정의 일부로 관련 이벤트가 발생합니다.)
따라서 이 이벤트는 약 66Hz보다 빠르거나 4Hz보다 느리게 발생해서는 안 됩니다 (이벤트 처리기를 실행하는 데 250ms보다 오래 걸리지 않는다고 가정). 사용자 에이전트는 비디오를 디코딩하면서 편안하게 처리할 수 있는 빈도보다 UI 업데이트가 더 자주 발생하지 않도록 시스템 부하와 매번 이벤트를 처리하는 평균 비용을 기반으로 이벤트 빈도를 변경하는 것이 권장됩니다.
current cues의 모든 큐에 텍스트 트랙 큐 활성 플래그가 설정되어 있고, other cues의 어떤 큐에도 텍스트 트랙 큐 활성 플래그가 설정되어 있지 않으며, missed cues가 비어 있다면 반환합니다.
일반 재생 중 현재 재생 위치의 일반적인 단조 증가를 통해 해당 시간에 도달했고, other cues에 텍스트 트랙 큐 종료 시 일시 정지 플래그가 설정되어 있으며 텍스트 트랙 큐 활성 플래그도 설정되어 있거나 missed cues에도 있는 큐가 있다면, 미디어 요소를 즉시 일시 정지합니다.
명시적 탐색 같은 다른 경우에는 큐에 텍스트 트랙 큐 종료 시 일시 정지 플래그가 설정되어 있더라도 해당 큐의 종료 시간을 지나갔다고 재생이 일시 정지되지는 않습니다.
events를 처음에는 비어 있는 태스크 목록으로 둡니다. 이 목록의 각 태스크는 텍스트 트랙, 텍스트 트랙 큐 및 시간과 연결되며, 이는 태스크가 큐에 추가되기 전에 목록을 정렬하는 데 사용됩니다.
affected tracks를 처음에는 비어 있는 텍스트 트랙 목록으로 둡니다.
아래 단계에서 시간 time과 함께 텍스트 트랙 큐 target에 대해 event라는 이름의 이벤트를 준비하라고 하면 사용자 에이전트는 다음 단계를 실행해야 합니다.
missed cues의 각 텍스트 트랙
큐에 대해,
텍스트 트랙 큐 시작
시간을 사용하여
TextTrackCue
객체에 대해 enter라는
이름의 이벤트를 준비합니다.
other cues의 각 텍스트 트랙
큐 중
텍스트 트랙 큐 활성
플래그가
설정되어 있거나 missed cues에 있는 큐에 대해,
텍스트 트랙 큐 종료
시간과
텍스트 트랙 큐 시작
시간 중 더 늦은
시간을 사용하여 TextTrackCue
객체에 대해 exit라는
이름의 이벤트를 준비합니다.
current cues의 각 텍스트 트랙
큐 중
텍스트 트랙 큐 활성
플래그가
설정되어 있지 않은 큐에 대해, 텍스트 트랙 큐 시작 시간을 사용하여
TextTrackCue
객체에 대해 enter라는
이름의 이벤트를 준비합니다.
events의 태스크를 시간 오름차순 (시간이 더 이른 태스크가 먼저)으로 정렬합니다.
시간이 같은 events의 태스크를 해당 태스크와 연결된 텍스트 트랙 큐의 상대적인 텍스트 트랙 큐 순서로 추가 정렬합니다.
마지막으로 시간과 텍스트 트랙 큐
순서가 모두 같은
events의 태스크를
exit
이벤트를 발생시키는 태스크보다 enter
이벤트를 발생시키는 태스크가 먼저 오도록 정렬합니다.
events의 각 태스크에 대해 목록 순서대로 미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가합니다.
affected tracks를 미디어 요소의 텍스트 트랙 목록에 텍스트 트랙이 나타나는 것과 같은 순서로 정렬하고 중복을 제거합니다.
affected tracks의 각 텍스트 트랙에
대해 목록 순서대로
미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에
추가하여 TextTrack 객체에서
cuechange라는
이름의 이벤트를 발생시킵니다.
또한
텍스트 트랙에 대응하는
track 요소가
있다면, 이어서 track
요소에서도 cuechange라는
이름의 이벤트를 발생시킵니다.
current cues의 모든 큐에 텍스트 트랙 큐 활성 플래그를 설정하고, other cues의 모든 큐에서 텍스트 트랙 큐 활성 플래그를 해제합니다.
affected tracks에서 표시 중인 각 텍스트 트랙에 대해 텍스트 트랙 렌더링을 업데이트하는 규칙을 실행합니다. 이때 텍스트 트랙의 텍스트 트랙 언어가 빈 문자열이 아니라면 대체 언어로 제공합니다. 예를 들어 WebVTT 기반 텍스트 트랙의 경우 WebVTT 텍스트 트랙 표시를 업데이트하는 규칙입니다. [WEBVTT]
위 알고리즘의 목적상 텍스트 트랙 큐는 단순히 텍스트 트랙과 연결되어 있는 경우가 아니라, 텍스트 트랙 큐 목록에 나열된 경우에만 텍스트 트랙의 일부로 간주됩니다.
미디어 요소의 노드 문서가 완전히 활성 상태인 문서가 아니게 되면, 문서가 다시 활성 상태가 될 때까지 재생이 중지됩니다.
미디어 요소가
Document에서 제거되면,
사용자 에이전트는 다음 단계를 실행해야 합니다.
안정 상태를 기다려,
미디어 요소를
Document에서
제거한 태스크가 계속 진행할 수 있게 합니다.
동기 구간은 이 알고리즘의 나머지 모든
단계로 구성됩니다. (동기 구간의
단계는 ⌛로 표시됩니다.)
⌛ 미디어 요소에 대해 내부 일시 정지 단계를 실행합니다.
media.seeking사용자 에이전트가 현재 탐색 중이면 true를 반환합니다.
media.seekable
현재 모든 엔진에서 지원됩니다.
사용자 에이전트가 탐색할 수 있는 미디어
리소스의 범위를 나타내는 TimeRanges 객체를 반환합니다.
media.fastSeek(time)
정밀도보다 속도를 우선하여 가능한 한 빠르게 주어진 time에 가까운 위치로 탐색합니다.
(정확한 시간으로 탐색하려면 currentTime
속성을 사용합니다.)
미디어 리소스가 로드되지 않았다면 아무 작업도 하지 않습니다.
seeking
속성의 초기값은 false여야 합니다.
fastSeek(time) 메서드는
속도를 위해 근사 플래그를 설정한 상태로 time이 지정한 시간으로
탐색해야 합니다.
사용자 에이전트가 미디어 리소스에서 특정 new playback position으로 탐색해야 할 때, 선택적으로 속도를 위해 근사 플래그를 설정할 수 있으며, 이는 사용자 에이전트가 다음 단계를 실행해야 함을 의미합니다. 이 알고리즘은 이벤트 루프 메커니즘과 밀접하게 상호 작용합니다. 특히 이벤트 루프 알고리즘의 일부로 트리거되는 동기 구간이 있습니다. 해당 구간의 단계는 ⌛로 표시됩니다.
미디어 요소의 포스터 표시 플래그를 false로 설정합니다.
미디어 요소의 readyState가
HAVE_NOTHING이면
반환합니다.
요소의 seeking IDL
속성이 true이면 이 알고리즘의 다른 인스턴스가 이미 실행 중입니다. 해당 인스턴스가 실행 중인
단계가 완료되기를 기다리지 않고 그 알고리즘 인스턴스를 중단합니다.
seeking IDL 속성을
true로 설정합니다.
탐색이 DOM 메서드 호출 또는 IDL 속성 설정에 대한 응답으로 이루어졌다면 스크립트를 계속합니다. 나머지 단계는 병렬로 실행해야 합니다. ⌛로 표시된 단계를 제외하면 이 알고리즘의 다른 인스턴스가 호출되어 언제든 중단될 수 있습니다.
new playback position이 미디어 리소스의 끝보다 뒤에 있다면, 대신 미디어 리소스의 끝으로 둡니다.
new playback position이 가능한 가장 이른 위치보다 작다면, 대신 해당 위치로 둡니다.
현재 변경되었을 수도 있는 new playback position이 seekable 속성에 지정된
범위 중 하나에 포함되지 않는다면, seekable
속성에 지정된
범위의 위치 중 new playback position에 가장 가까운 위치로 둡니다. 두 위치가 이
제약을 모두 충족한다면, 즉 new playback position이 seekable 속성의 두
범위 사이 정중앙에 있다면, 현재 재생 위치에 가장
가까운 위치를 사용합니다.
seekable 속성에 지정된
범위가 없다면 seeking IDL 속성을
false로 설정하고 반환합니다.
속도를 위해 근사 플래그가 설정되어 있다면 재생을 신속하게 재개할 수 있는 값으로 new playback position을 조정합니다. 이 단계 이전의 new playback position이 현재 재생 위치보다 앞에 있었다면, 조정된 new playback position도 현재 재생 위치보다 앞에 있어야 합니다. 마찬가지로 이 단계 이전의 new playback position이 현재 재생 위치보다 뒤에 있었다면, 조정된 new playback position도 현재 재생 위치보다 뒤에 있어야 합니다.
예를 들어 사용자 에이전트는 재생을 재개하기 전에 중간 프레임을 디코딩한 뒤 폐기하는 데 시간을 소비하지 않아도 되도록 인접한 키 프레임에 맞출 수 있습니다.
미디어 요소가 주어졌을 때
미디어 요소 태스크를
큐에 추가하여 요소에서 seeking이라는
이름의
이벤트를 발생시킵니다.
현재 재생 위치를 new playback position으로 설정합니다.
미디어 요소가 탐색을 시작하기
직전에 잠재적으로 재생 중이었지만
탐색으로 인해 readyState 속성이
HAVE_FUTURE_DATA보다
낮은 값으로 변경되었다면 요소에서 waiting
이벤트가
발생합니다.
이 단계는 현재 재생 위치를 설정하므로 사용자 에이전트가 해당 위치의 미디어 데이터를 실제로 렌더링할 수 있게 되기 전에도, 다음 단계에서 결정되는 것과 별개로 반복 처리를 다루는 논리의 일부인 재생이 "미디어 리소스의 끝에 도달"하는 시점에 관한 규칙과 같은 다른 조건을 즉시 트리거할 수 있습니다.
currentTime 속성은
현재 재생 위치가
아니라 공식 재생 위치를 반환하므로 이 알고리즘과
별개로
스크립트 실행 전에 업데이트됩니다.
사용자 에이전트가 new playback position에 대한 미디어 데이터를 사용할 수 있는지 여부를 확정할 때까지 기다리고, 사용할 수 있다면 해당 위치를 재생할 수 있을 만큼 충분한 데이터를 디코딩할 때까지 기다립니다.
안정 상태를 기다립니다. 동기 구간은 이 알고리즘의 나머지 모든 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)
⌛ seeking IDL
속성을 false로 설정합니다.
⌛ 시간 진행 단계를 실행합니다.
⌛ 미디어 요소가 주어졌을 때
미디어 요소 태스크를
큐에 추가하여 요소에서 timeupdate라는
이름의 이벤트를 발생시킵니다.
⌛ 미디어 요소가 주어졌을 때
미디어 요소 태스크를
큐에 추가하여 요소에서 seeked라는 이름의
이벤트를 발생시킵니다.
seekable getter 단계는 사용자 에이전트가 탐색할 수 있는
this의
미디어 리소스 범위가 있다면 이를 나타내는
새로운 정규화된 TimeRanges
객체를 반환하는
것입니다.
예를 들어 단순한 동영상 파일이고 사용자 에이전트와 서버가 HTTP Range 요청을 지원하기
때문에 사용자 에이전트가 미디어 리소스의 어느 위치로든 탐색할 수 있다면, 이 속성은 하나의
범위를 가진 객체를 반환합니다. 해당 범위의 시작은 첫 번째 프레임의 시간
(일반적으로 0인 가능한 가장 이른 위치)이고, 끝은 첫
번째 프레임의
시간에 duration 속성 값을 더한 것과
같습니다. 이는 마지막 프레임의 시간과 같으며 양의 Infinity일 수도 있습니다.
사용자 에이전트가 무한 스트림에서 이동하는 창을 버퍼링하는 경우처럼 범위는 계속 변경될 수 있습니다. 예를 들어 라이브 TV를 시청하는 DVR에서 이러한 동작을 볼 수 있습니다.
접근할 때마다 새 객체를 반환하는 것은 속성 getter에 좋지 않은 패턴이며, 변경 비용이 크기 때문에 여기에만 유지되어 있습니다. 새로운 API에서 이를 모방해서는 안 됩니다.
사용자 에이전트는 탐색 가능한 범위를 매우 관대하고 낙관적으로 판단하는 것이 좋습니다. 또한 탐색을 빠르게 수행할 수 있도록 가능한 경우 최근 콘텐츠를 버퍼링하는 것이 좋습니다.
예를 들어 HTTP Range 요청을 지원하지 않는 HTTP 서버에서 제공되는 대용량 비디오 파일을 생각해 보겠습니다. 브라우저는 현재 프레임과 이후 프레임에 대해 얻은 데이터만 버퍼링하고, 재생을 다시 시작하여 맨 처음으로 탐색하는 경우를 제외하면 탐색을 전혀 허용하지 않는 방식으로 이를 구현할 수도 있습니다. 그러나 이는 좋지 않은 구현입니다. 고품질 구현이라면 최근 몇 분간의 콘텐츠를 버퍼링하고, 충분한 저장 공간이 있다면 그 이상을 버퍼링하여 사용자가 놀라운 장면으로 지연 없이 되돌아가 다시 볼 수 있게 합니다. 또한 필요한 경우 파일을 처음부터 다시 로드하여 임의의 위치로 탐색할 수 있게 합니다. 이는 더 느리지만 이전에 버퍼링되지 않은 지점에 도달하기 위해 비디오를 실제로 처음부터 다시 시작하고 끝까지 시청해야 하는 것보다는 편리합니다.
미디어 리소스는 내부적으로 스크립팅되거나 상호 작용형일 수 있습니다. 따라서 미디어 요소는 비선형 방식으로 재생될 수 있습니다. 이러한 일이 발생하면 사용자 에이전트는 현재 재생 위치가 불연속적으로 변경될 때마다 관련 이벤트가 발생하도록 탐색 알고리즘이 사용된 것처럼 동작해야 합니다.
미디어 리소스에는 내장된 오디오 및 비디오 트랙이 여러 개 있을 수 있습니다. 예를 들어 기본 비디오 및 오디오 트랙 외에도 미디어 리소스에는 외국어 더빙 대화, 감독 해설, 오디오 설명, 대체 각도 또는 수어 오버레이가 있을 수 있습니다.
media.audioTracks
현재 모든 엔진에서 지원됩니다.
미디어 리소스에서 사용할 수
있는
오디오 트랙을 나타내는 AudioTrackList
객체를 반환합니다.
media.videoTracks
현재 모든 엔진에서 지원됩니다.
미디어 리소스에서 사용할 수
있는
비디오 트랙을 나타내는 VideoTrackList
객체를 반환합니다.
미디어 요소의
audioTracks 속성은
미디어 요소의
미디어 리소스에서 사용할 수 있는
오디오 트랙을 나타내는 라이브 AudioTrackList
객체를 반환해야 합니다.
미디어 요소의
videoTracks 속성은
미디어 요소의
미디어 리소스에서 사용할 수 있는
비디오 트랙을 나타내는 라이브 VideoTrackList
객체를 반환해야 합니다.
다른 미디어
리소스가 요소에 로드되더라도,
각 미디어 요소에는 항상 하나의
AudioTrackList
객체와 하나의 VideoTrackList
객체만 있으며 객체는 재사용됩니다. (그러나 AudioTrack
및 VideoTrack
객체는 재사용되지 않습니다.)
AudioTrackList
및 VideoTrackList
객체현재 모든 엔진에서 지원됩니다.
현재 모든 엔진에서 지원됩니다.
현재 모든 엔진에서 지원됩니다.
AudioTrackList
및 VideoTrackList
인터페이스는 이전 절에서 정의한 속성에 사용됩니다.
현재 모든 엔진에서 지원됩니다.
현재 모든 엔진에서 지원됩니다.
[Exposed =Window ]
interface AudioTrackList : EventTarget {
readonly attribute unsigned long length ;
getter AudioTrack (unsigned long index );
AudioTrack ? getTrackById (DOMString id );
attribute EventHandler onchange ;
attribute EventHandler onaddtrack ;
attribute EventHandler onremovetrack ;
};
[Exposed =Window ]
interface AudioTrack {
readonly attribute DOMString id ;
readonly attribute DOMString kind ;
readonly attribute DOMString label ;
readonly attribute DOMString language ;
attribute boolean enabled ;
};
[Exposed =Window ]
interface VideoTrackList : EventTarget {
readonly attribute unsigned long length ;
getter VideoTrack (unsigned long index );
VideoTrack ? getTrackById (DOMString id );
readonly attribute long selectedIndex ;
attribute EventHandler onchange ;
attribute EventHandler onaddtrack ;
attribute EventHandler onremovetrack ;
};
[Exposed =Window ]
interface VideoTrack {
readonly attribute DOMString id ;
readonly attribute DOMString kind ;
readonly attribute DOMString label ;
readonly attribute DOMString language ;
attribute boolean selected ;
};
media.audioTracks.length
현재 모든 엔진에서 지원됩니다.
media.videoTracks.length
현재 모든 엔진에서 지원됩니다.
목록에 있는 트랙 수를 반환합니다.
audioTrack = media.audioTracks[index]
videoTrack = media.videoTracks[index]
지정된 AudioTrack 또는
VideoTrack
객체를 반환합니다.
audioTrack = media.audioTracks.getTrackById(id)
현재 모든 엔진에서 지원됩니다.
videoTrack = media.videoTracks.getTrackById(id)
현재 모든 엔진에서 지원됩니다.
주어진 식별자를 가진 AudioTrack 또는
VideoTrack
객체를 반환하고, 해당 식별자를 가진 트랙이 없다면 null을 반환합니다.
audioTrack.id
현재 모든 엔진에서 지원됩니다.
videoTrack.id
현재 모든 엔진에서 지원됩니다.
주어진 트랙의 ID를 반환합니다. 형식이 미디어
프래그먼트 구문을 지원한다면 이 ID를 프래그먼트와 함께 사용할 수 있으며,
getTrackById() 메서드와 함께 사용할 수도 있습니다.
audioTrack.kind
현재 모든 엔진에서 지원됩니다.
videoTrack.kind
현재 모든 엔진에서 지원됩니다.
주어진 트랙이 속하는 범주를 반환합니다. 가능한 트랙 범주는 아래에 제시되어 있습니다.
audioTrack.label
현재 모든 엔진에서 지원됩니다.
videoTrack.label
현재 모든 엔진에서 지원됩니다.
알려져 있다면 주어진 트랙의 레이블을 반환하고, 그렇지 않으면 빈 문자열을 반환합니다.
audioTrack.language
현재 모든 엔진에서 지원됩니다.
videoTrack.language
현재 모든 엔진에서 지원됩니다.
알려져 있다면 주어진 트랙의 언어를 반환하고, 그렇지 않으면 빈 문자열을 반환합니다.
audioTrack.enabled [ = value ]
현재 모든 엔진에서 지원됩니다.
주어진 트랙이 활성 상태이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
트랙의 활성화 여부를 변경하도록 설정할 수 있습니다. 여러 오디오 트랙이 동시에 활성화되면 서로 믹싱됩니다.
media.videoTracks.selectedIndex
현재 모든 엔진에서 지원됩니다.
현재 선택된 트랙이 있다면 그 인덱스를 반환하고, 그렇지 않으면 −1을 반환합니다.
videoTrack.selected [ = value ]
현재 모든 엔진에서 지원됩니다.
주어진 트랙이 활성 상태이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
트랙의 선택 여부를 변경하도록 설정할 수 있습니다. 선택되는 비디오 트랙은 0개 또는 1개이며, 이전 트랙이 선택된 상태에서 새로운 트랙을 선택하면 이전 트랙의 선택이 해제됩니다.
AudioTrackList
객체는 0개 이상의 오디오 트랙으로 구성된 동적 목록을 나타내며, 한 번에 0개 이상의 트랙을 활성화할 수
있습니다. 각 오디오 트랙은 AudioTrack
객체로 나타냅니다.
VideoTrackList
객체는 0개 이상의 비디오 트랙으로 구성된 동적 목록을 나타내며, 한 번에 0개 또는 1개의 트랙을 선택할 수
있습니다. 각 비디오 트랙은 VideoTrack
객체로 나타냅니다.
AudioTrackList
및 VideoTrackList
객체의 트랙은 일관된 순서로 정렬되어야 합니다. 미디어 리소스가 순서를 정의하는
형식이라면 해당 순서를 사용해야 합니다. 그렇지 않으면 트랙이
미디어 리소스에 선언된 상대적인
순서를 사용해야 합니다. 사용되는 순서를 목록의 자연 순서라고 합니다.
따라서 이러한 객체의 각 트랙에는 인덱스가 있습니다. 첫 번째 트랙의 인덱스는 0이고, 이후 각 트랙에는 이전 트랙보다 1 큰 번호가 지정됩니다. 미디어 리소스가 오디오 또는 비디오 트랙을 동적으로 추가하거나 제거하면 트랙의 인덱스도 동적으로 변경됩니다. 미디어 리소스가 완전히 변경되면 이전의 모든 트랙이 제거되고 새로운 트랙으로 교체됩니다.
AudioTrackList
length 및 VideoTrackList
length 속성 getter는 가져오는 시점에 해당 객체가
나타내는 트랙 수를 반환해야 합니다.
특정 시점의 AudioTrackList
및 VideoTrackList
객체의 지원되는 속성 인덱스는 트랙이 나타내어지는 경우
0부터 해당 객체가 나타내는 트랙 수에서 1을 뺀 값까지의 숫자입니다.
AudioTrackList
또는 VideoTrackList
객체가 트랙을 나타내지 않는다면
지원되는 속성 인덱스가 없습니다.
AudioTrackList
또는 VideoTrackList
객체 list에서 주어진 인덱스 index에 대한
인덱스 속성의 값을 결정하려면,
사용자 에이전트는 list에서 index번째 트랙을 나타내는
AudioTrack 또는
VideoTrack
객체를 반환해야 합니다.
AudioTrackList
getTrackById(id) 및
VideoTrackList
getTrackById(id) 메서드는 각각
AudioTrackList
또는 VideoTrackList
객체에서 식별자가 id 인수의 값과 같은 첫 번째
AudioTrack 또는
VideoTrack
객체를 위에서 정의한 목록의 자연 순서에 따라 반환해야 합니다. 주어진 인수와 일치하는 트랙이 없다면
메서드는 null을 반환해야 합니다.
AudioTrack
및 VideoTrack
객체는 미디어 리소스의 특정 트랙을
나타냅니다. 각 트랙에는 식별자, 범주, 레이블 및 언어가 있을 수 있습니다. 트랙의 이러한 측면은 트랙의
수명 동안 영구적입니다. 트랙이 미디어
리소스의
AudioTrackList
또는 VideoTrackList
객체에서 제거되더라도 이러한 측면은 변경되지 않습니다.
또한 각 AudioTrack
객체는 활성화하거나 비활성화할 수 있습니다. 이를 오디오 트랙의 활성화 상태라고 합니다.
AudioTrack이
생성되면 그 활성화 상태를 false(비활성화됨)로 설정해야 합니다.
리소스 가져오기 알고리즘이
이를 재정의할 수 있습니다.
마찬가지로 각 VideoTrackList
객체에서 하나의 VideoTrack
객체를 선택할 수 있으며, 이를 비디오 트랙의 선택 상태라고 합니다.
VideoTrack이
생성되면 그 선택 상태를 false(선택되지 않음)로 설정해야 합니다.
리소스 가져오기 알고리즘이
이를 재정의할 수 있습니다.
AudioTrack
id 및 VideoTrack
id 속성은 트랙에 식별자가
있다면 이를 반환하고,
그렇지 않으면 빈 문자열을 반환해야 합니다. 미디어 리소스가
미디어
프래그먼트 구문을 지원하는 형식이라면 특정 트랙에
대해 반환되는 식별자는 그러한 프래그먼트의 트랙 차원에서 트랙 이름으로 사용했을 때
해당 트랙을 활성화하는 식별자와 같아야 합니다. [INBAND]
예를 들어 Ogg 파일에서는 트랙의 Name 헤더 필드가 이에 해당합니다. [OGGSKELETONHEADERS]
AudioTrack
kind 및 VideoTrack
kind 속성은 트랙에
범주가 있다면 이를 반환하고,
그렇지 않으면 빈 문자열을 반환해야 합니다.
트랙의 범주는 미디어 리소스의 트랙에
포함된
메타데이터를 기반으로 표의 두 번째 및 세 번째 열에 있는 정의에 따라 해당 트랙에 가장 적합한 아래 표의
첫 번째 열 문자열입니다. 행의 세 번째 열 셀은 해당 행의 첫 번째 열 셀에 있는 범주가 무엇에 적용되는지를
나타냅니다. 범주가 오디오 트랙에 적용되는 경우에만 오디오 트랙에 적합하며, 비디오 트랙에 적용되는
경우에만 비디오 트랙에 적합합니다. 범주는 오디오에 적합한 경우에만
AudioTrack
객체에 대해 반환해야 하며, 비디오에 적합한 경우에만
VideoTrack
객체에 대해 반환해야 합니다.
Ogg 파일에서는 트랙의 Role 헤더 필드가 관련 메타데이터를 제공합니다. DASH 미디어 리소스에서는
Role 요소가 정보를 전달합니다. WebM에서는 현재 FlagDefault 요소만 값에
매핑됩니다. 미디어 컨테이너의 대역 내 미디어 리소스 트랙을 HTML로 가져오기에 자세한
내용이 있습니다.
[OGGSKELETONHEADERS] [DASH] [WEBMCG] [INBAND]
| 범주 | 정의 | 적용 대상... | 예 |
|---|---|---|---|
"alternative"
|
기본 트랙을 대체할 수 있는 트랙입니다. 예를 들어 노래의 다른 테이크(오디오) 또는 다른 각도 (비디오)입니다. | 오디오 및 비디오. | Ogg: "audio/alternate" 또는 "video/alternate"; DASH: "main" 및 "commentary" 역할이 없는 "alternate", 오디오의 경우 "dub" 역할도 없음(다른 역할은 무시). |
"captions"
|
캡션이 영상에 삽입된 기본 비디오 트랙 버전입니다. (레거시 콘텐츠용이며 새로운 콘텐츠는 텍스트 트랙을 사용합니다.) | 비디오 전용. | DASH: "caption" 및 "main" 역할을 함께 사용(다른 역할은 무시). |
"descriptions"
|
비디오 트랙의 오디오 설명입니다. | 오디오 전용. | Ogg: "audio/audiodesc". |
"main"
|
기본 오디오 또는 비디오 트랙입니다. | 오디오 및 비디오. | Ogg: "audio/main" 또는 "video/main"; WebM: "FlagDefault" 요소가 설정됨; DASH: "caption", "subtitle" 및 "dub" 역할이 없는 "main" 역할(다른 역할은 무시). |
"main-desc"
|
오디오 설명이 믹싱된 기본 오디오 트랙입니다. | 오디오 전용. | MPEG-2 TS의 AC3 오디오: bsmod=2 및 full_svc=1. |
"sign"
|
오디오 트랙의 수어 통역입니다. | 비디오 전용. | Ogg: "video/sign". |
"subtitles"
|
자막이 영상에 삽입된 기본 비디오 트랙 버전입니다. (레거시 콘텐츠용이며 새로운 콘텐츠는 텍스트 트랙을 사용합니다.) | 비디오 전용. | DASH: "subtitle" 및 "main" 역할을 함께 사용(다른 역할은 무시). |
"translation"
|
기본 오디오 트랙의 번역된 버전입니다. | 오디오 전용. | Ogg: "audio/dub". DASH: "dub" 및 "main" 역할을 함께 사용(다른 역할은 무시). |
"commentary"
|
감독 해설과 같은 기본 오디오 또는 비디오 트랙에 대한 해설입니다. | 오디오 및 비디오. | DASH: "main" 역할이 없는 "commentary" 역할(다른 역할은 무시). |
"" (빈 문자열)
|
명시적인 종류가 없거나, 트랙 메타데이터가 지정한 종류를 사용자 에이전트가 인식하지 못합니다. | 오디오 및 비디오. |
AudioTrack
label 및
VideoTrack
label 속성은
트랙에 레이블이 있다면 이를 반환하고,
그렇지 않으면 빈 문자열을 반환해야 합니다. [INBAND]
AudioTrack
language
및
VideoTrack
language
속성은 트랙에 언어가 있다면 해당 언어의
BCP 47 언어 태그를 반환하고, 그렇지 않으면 빈 문자열을 반환해야 합니다. 사용자 에이전트가 해당 언어를
BCP 47 언어 태그로 표현할 수 없다면, 예를 들어 미디어 리소스 형식의 언어 정보가
정의된 해석이 없는 자유 형식 문자열이라면, 메서드는 트랙에 언어가 없는 것처럼 빈 문자열을 반환해야
합니다. [INBAND]
AudioTrack
enabled
속성은 가져올 때 트랙이 현재 활성화되어 있다면
true를 반환하고, 그렇지 않으면 false를 반환해야 합니다. 설정할 때 새 값이 true이면 트랙을
활성화하고, 그렇지 않으면 비활성화해야 합니다. (트랙이 더 이상
AudioTrackList
객체에 없으면 트랙의 활성화 또는 비활성화는 AudioTrack
객체의 속성 값을 변경하는 것 외에는 아무런 효과가 없습니다.)
AudioTrackList에서
비활성화되어 있던 오디오 트랙이 활성화될 때마다, 그리고 활성화되어 있던 트랙이 비활성화될 때마다,
사용자 에이전트는 미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 AudioTrackList
객체에서 change라는
이름의 이벤트를
발생시켜야 합니다.
미디어 타임라인의 특정 위치에 대한 데이터가 없거나 해당 위치에 존재하지 않는 오디오 트랙은 타임라인의 해당 지점에서 무음인 것으로 해석해야 합니다.
VideoTrackList
selectedIndex 속성은 현재 선택된 트랙이 있다면 그
인덱스를 반환해야 합니다. VideoTrackList
객체가 현재 트랙을 나타내지 않거나 어떤 트랙도 선택되지 않았다면 대신 −1을 반환해야 합니다.
VideoTrack
selected
속성은 가져올 때 트랙이 현재 선택되어 있다면
true를 반환하고, 그렇지 않으면 false를 반환해야 합니다. 설정할 때 새 값이 true이면 트랙을
선택하고, 그렇지 않으면 선택을 해제해야 합니다. 트랙이 VideoTrackList에
있다면 해당 목록의 다른 모든 VideoTrack
객체의 선택을 해제해야 합니다. (트랙이 더 이상 VideoTrackList
객체에 없으면 트랙의 선택 또는 선택 해제는 VideoTrack
객체의 속성 값을 변경하는 것 외에는 아무런 효과가 없습니다.)
VideoTrackList에서
이전에 선택되지 않았던 트랙이 선택될 때마다, 그리고 VideoTrackList에서
선택되어 있던 트랙이 새로운 트랙으로 대체되지 않은 상태에서 선택 해제될 때마다, 사용자 에이전트는
미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에
추가하여 VideoTrackList
객체에서 change라는
이름의 이벤트를
발생시켜야 합니다. 이
태스크는
resize
이벤트를 발생시키는 태스크가 있다면 그
태스크보다 먼저
큐에 추가되어야
합니다.
미디어 타임라인의 특정 위치에 대한 데이터가 없는 비디오 트랙은 해당 위치 이전의 마지막 프레임과 같은 크기로 타임라인의 해당 지점에서 투명한 검은색인 것으로 해석해야 합니다. 해당 위치가 그 트랙의 모든 데이터보다 앞에 있다면 트랙의 첫 번째 프레임과 같은 크기를 사용합니다. 현재 위치에 전혀 존재하지 않는 트랙은 존재하지만 데이터가 없는 것처럼 처리해야 합니다.
예를 들어 비디오에 재생 시작 후 한 시간이 지나서야 도입되는 트랙이 있고 사용자가 해당 트랙을 선택한 다음 시작 부분으로 돌아가면, 사용자 에이전트는 해당 트랙이 미디어 리소스의 시작 부분에서 시작했지만 한 시간이 될 때까지 투명했던 것처럼 동작합니다.
다음은 AudioTrackList
및 VideoTrackList
인터페이스를 구현하는 모든 객체가 이벤트 처리기 IDL 속성으로
지원해야 하는 이벤트 처리기와 이에 대응하는
이벤트 처리기
이벤트 유형입니다.
| 이벤트 처리기 | 이벤트 처리기 이벤트 유형 |
|---|---|
onchange
현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? 현재 모든 엔진에서 지원됩니다. Firefox31+Safari7+Chrome33+
Opera?Edge79+ Edge (Legacy)18Internet Explorer아니요 Firefox Android?Safari iOS?Chrome Android?WebView Android4.4+Samsung Internet?Opera Android? 현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? |
change
|
onaddtrack
현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? 현재 모든 엔진에서 지원됩니다. Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer11 Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ 현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? |
addtrack
|
onremovetrack
AudioTrackList/removetrack_event 현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? TextTrackList/removetrack_event 현재 모든 엔진에서 지원됩니다. Firefox31+Safari7+Chrome33+
Opera20+Edge79+ Edge (Legacy)18Internet Explorer아니요 Firefox Android?Safari iOS?Chrome Android?WebView Android4.4+Samsung Internet?Opera Android20+ VideoTrackList/removetrack_event 현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? |
removetrack
|
audioTracks
및 videoTracks
속성을 사용하면 스크립트가 재생할 트랙을 선택할 수 있지만, 미디어 리소스의
URL의 프래그먼트에 특정 트랙을 지정하여 특정 트랙을 선언적으로
선택할 수도 있습니다. 프래그먼트의 형식은 MIME 유형과
미디어
리소스의 형식에 따라 달라집니다. [RFC2046] [URL]
이 예에서는 미디어 프래그먼트 구문을 지원하는 형식을 사용하는 비디오를 기본 비디오 트랙 대신 "Alternative"라는 레이블이 붙은 대체 각도가 활성화되도록 삽입합니다.
< video src = "myvideo#track=Alternative" ></ video >
미디어 요소에는 연관된 텍스트 트랙 그룹이 있을 수 있으며, 이를 미디어 요소의 텍스트 트랙 목록이라고 합니다. 텍스트 트랙은 다음과 같이 정렬됩니다.
addTextTrack()
메서드를 사용하여 추가된 모든 텍스트 트랙을 추가된 순서대로, 가장 오래된 것부터
정렬합니다.
모든 미디어 리소스별 텍스트 트랙 (미디어 리소스의 데이터에 대응하는 텍스트 트랙)을 미디어 리소스의 형식 명세가 정의한 순서로 정렬합니다.
텍스트 트랙은 TextTrack 객체이며 다음 항목으로
구성됩니다.
이는 사용자 에이전트가 트랙을 처리하는 방법을 결정합니다. 종류는 문자열로 나타냅니다. 가능한 문자열은 다음과 같습니다.
subtitles
captions
descriptions
chapters
metadata
사용자가 트랙을 식별할 수 있도록 제공되는 사람이 읽을 수 있는 문자열입니다.
track 요소에 대응하는
텍스트 트랙의 경우
트랙의 레이블은 동적으로
변경될 수 있습니다.
텍스트 트랙 레이블이 빈 문자열이면 사용자 에이전트는 사용자 인터페이스에서 사용할 수 있도록 텍스트 트랙의 다른 속성 (예: 텍스트 트랙의 종류 및 텍스트 트랙의 언어)에서 적절한 레이블을 자동으로 생성하는 것이 좋습니다. 이렇게 자동 생성된 레이블은 API에 노출되지 않습니다.
문서에서 이러한 트랙을 서로 다른 스크립트에 디스패치할 수 있도록 특별히 대역 내 메타데이터 트랙에 대해 미디어 리소스에서 추출한 문자열입니다.
예를 들어 웹에서 스트리밍되고 웹 전용 상호 작용 기능으로 보강된 전통적인 TV 방송에는 광고 타기팅용 메타데이터, 퀴즈 프로그램 중의 퀴즈 게임 데이터, 스포츠 경기 중의 선수 상태, 요리 프로그램 중의 조리법 정보 등을 포함하는 텍스트 트랙이 있을 수 있습니다. 각 프로그램이 시작되고 종료될 때 스트림에 새로운 트랙이 추가되거나 제거될 수 있으며, 각 트랙이 추가될 때 사용자 에이전트는 이 속성의 값을 사용하여 이를 전용 스크립트 모듈에 바인딩할 수 있습니다.
대역 내 메타데이터 텍스트 트랙이 아닌 경우 대역 내 메타데이터 트랙 디스패치 유형은 빈 문자열입니다. 서로 다른 미디어 형식에서 이 값을 채우는 방법은 미디어 리소스별 텍스트 트랙을 노출하는 단계에 설명되어 있습니다.
텍스트 트랙 큐의 언어를 나타내는 문자열(BCP 47 언어 태그)입니다. [BCP47]
track 요소에
대응하는 텍스트 트랙의 경우
텍스트 트랙의 언어는
동적으로 변경될 수 있습니다.
문자열입니다.
다음 중 하나입니다.
텍스트 트랙의 큐를 아직 가져오지 않았음을 나타냅니다.
텍스트 트랙이 로드 중이며 지금까지 치명적인 오류가 발생하지 않았음을 나타냅니다. 파서가 트랙에 추가 큐를 계속 추가할 수도 있습니다.
텍스트 트랙이 치명적인 오류 없이 로드되었음을 나타냅니다.
텍스트 트랙이 활성화되었지만 사용자 에이전트가 이를 가져오려고 시도했을 때 어떤 이유로 실패했음을 나타냅니다(예: URL을 파싱할 수 없음, 네트워크 오류, 알 수 없는 텍스트 트랙 형식). 일부 또는 모든 큐가 누락되었을 가능성이 높으며 가져오지 못합니다.
다음 중 하나입니다.
텍스트 트랙이 활성 상태가 아님을 나타냅니다. DOM에 트랙을 노출하기 위한 목적을 제외하면 사용자 에이전트는 텍스트 트랙을 무시합니다. 활성 큐가 없고 이벤트도 발생하지 않으며 사용자 에이전트는 트랙의 큐를 가져오려고 시도하지 않습니다.
텍스트 트랙은 활성 상태이지만 사용자 에이전트가 큐를 능동적으로 표시하지 않음을 나타냅니다. 아직 트랙의 큐를 가져오려는 시도가 없었다면 사용자 에이전트는 곧 이러한 시도를 수행합니다. 사용자 에이전트는 활성 상태인 큐 목록을 유지하며 이에 따라 이벤트가 발생합니다.
텍스트 트랙이 활성 상태임을 나타냅니다. 아직 트랙의 큐를 가져오려는 시도가 없었다면 사용자
에이전트는 곧 이러한 시도를 수행합니다. 사용자 에이전트는 활성 상태인 큐 목록을 유지하며
이에 따라 이벤트가 발생합니다. 또한 종류가 subtitles
또는 captions인
텍스트 트랙의 경우 큐가 적절하게 비디오 위에 오버레이됩니다.
종류가 descriptions인
텍스트 트랙의 경우 사용자 에이전트는 큐를 비시각적인 방식으로 사용자에게 제공합니다.
종류가 chapters인
텍스트 트랙의 경우 사용자 에이전트는 사용자가 큐를 선택하여 미디어
리소스의 임의의 지점으로 이동할 수 있는
메커니즘을 제공합니다.
텍스트 트랙 렌더링을 업데이트하는 규칙과 함께 제공되는 텍스트 트랙 큐 목록입니다. 예를 들어 WebVTT의 경우 WebVTT 텍스트 트랙 표시를 업데이트하는 규칙입니다. [WEBVTT]
텍스트 트랙이 아직 로드되지 않았거나 여전히 로드 중이거나 DOM 조작으로 인해 텍스트 트랙의 큐 목록은 동적으로 변경될 수 있습니다.
각 미디어 요소에는 초기값이 비어 있어야 하는 대기 중인 텍스트 트랙 목록, 초기값이 false여야 하는 파서에서 차단됨 플래그, 역시 초기값이 false여야 하는 자동 트랙 선택 수행 완료 플래그가 있습니다.
사용자 에이전트가 미디어 요소의 대기 중인 텍스트 트랙 목록을 채워야 할 때, 사용자 에이전트는 요소의 텍스트 트랙 목록에 있는 각 텍스트 트랙 중 텍스트 트랙 모드가 비활성화됨이 아니고 텍스트 트랙 준비 상태가 로드 중인 트랙을 요소의 대기 중인 텍스트 트랙 목록에 추가해야 합니다.
track 요소의
부모 노드가 변경될 때마다 사용자 에이전트는 이에 대응하는
텍스트 트랙을 포함하고 있는 모든
대기 중인 텍스트 트랙 목록에서
제거해야
합니다.
텍스트 트랙의 텍스트 트랙 준비 상태가 로드됨 또는 로드 실패로 변경될 때마다 사용자 에이전트는 해당 트랙을 포함하고 있는 모든 대기 중인 텍스트 트랙 목록에서 제거해야 합니다.
HTML 파서 또는 XML 파서가 미디어 요소를 생성하면 사용자 에이전트는 요소의 파서에서 차단됨 플래그를 true로 설정해야 합니다. 미디어 요소가 HTML 파서 또는 XML 파서의 열린 요소 스택에서 꺼내지면 사용자 에이전트는 자동 텍스트 트랙 선택에 대한 사용자 환경설정을 따르고, 대기 중인 텍스트 트랙 목록을 채운 다음 요소의 파서에서 차단됨 플래그를 false로 설정해야 합니다.
미디어 요소의 텍스트 트랙은 요소의 대기 중인 텍스트 트랙 목록이 비어 있고 요소의 파서에서 차단됨 플래그가 false일 때 준비된 상태입니다.
각 미디어 요소에는 초기에는 설정되지 않아야 하는 대기 중인 텍스트 트랙 변경 알림 플래그가 있습니다.
미디어 요소의 텍스트 트랙 목록에 있는 텍스트 트랙의 텍스트 트랙 모드 값이 변경될 때마다 사용자 에이전트는 미디어 요소에 대해 다음 단계를 실행해야 합니다.
미디어 요소의 대기 중인 텍스트 트랙 변경 알림 플래그가 설정되어 있다면 반환합니다.
미디어 요소의 대기 중인 텍스트 트랙 변경 알림 플래그를 설정합니다.
미디어 요소가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여 다음 단계를 실행합니다.
미디어 요소의 대기 중인 텍스트 트랙 변경 알림 플래그를 설정 해제합니다.
미디어 요소의 textTracks
속성의 TextTrackList 객체에서
change라는
이름의 이벤트를 발생시킵니다.
미디어 요소의 포스터 표시 플래그가 설정되어 있지 않다면 시간 진행 단계를 실행합니다.
이 절에 나열된 태스크의 태스크 소스는 DOM 조작 태스크 소스입니다.
텍스트 트랙 큐는 텍스트 트랙에서 시간에 민감한 데이터의 단위이며, 예를 들어 자막과 캡션의 경우 특정 시간에 나타나고 다른 시간에 사라지는 텍스트에 대응합니다.
각 텍스트 트랙 큐는 다음 항목으로 구성됩니다.
임의의 문자열입니다.
큐가 적용되는 미디어 데이터 범위의 시작을 설명하는 초 및 초의 소수 단위 시간입니다.
큐가 적용되는 미디어 데이터 범위의 끝을 설명하는 초 및 초의 소수 단위 시간이거나, 경계가 없는 텍스트 트랙 큐의 경우 양의 Infinity입니다.
큐가 적용되는 범위의 끝에 도달했을 때 미디어 리소스의 재생을 일시 정지할지를 나타내는 불리언입니다.
큐의 실제 데이터를 포함하여 형식에 필요한 추가 필드입니다. 예를 들어 WebVTT에는 텍스트 트랙 큐 쓰기 방향 등이 있습니다. [WEBVTT]
경계가 없는 텍스트 트랙 큐는 텍스트 트랙 큐 종료 시간이 양의 Infinity로 설정된 텍스트 트랙 큐입니다. 활성 상태인 경계가 없는 텍스트 트랙 큐는 정상 재생 중 현재 재생 위치가 일반적으로 단조 증가하는 것만으로는 비활성 상태가 될 수 없습니다(예: 종료 시간이 발표되지 않은 라이브 이벤트의 챕터용 메타데이터 큐).
텍스트 트랙 큐 시작 시간과 텍스트 트랙 큐 종료 시간은 음수일 수 있습니다. (그러나 현재 재생 위치는 절대 음수가 될 수 없으므로 시간 0보다 완전히 앞에 있는 큐는 활성 상태가 될 수 없습니다.)
각 텍스트 트랙 큐에는 이에 대응하는
TextTrackCue 객체
(보다 구체적으로는 TextTrackCue를 상속하는 객체,
예를 들어 WebVTT 큐는 VTTCue
인터페이스를 사용함)가 있습니다. 텍스트 트랙 큐의 메모리 내 표현은 이 TextTrackCue API를 통해
동적으로 변경할 수 있습니다.
[WEBVTT]
텍스트 트랙 큐에는 특정 종류의
텍스트 트랙 큐에 대한 명세에서
정의한 텍스트 트랙 렌더링을 업데이트하는
규칙이 연결됩니다. 이러한 규칙은 특히 큐를 나타내는 객체를 addCue() 메서드를
사용하여 TextTrack 객체에
추가할 때 사용됩니다.
또한 각 텍스트 트랙 큐에는 두 가지 동적 정보가 있습니다.
이 플래그는 초기에는 설정되지 않아야 합니다. 큐가 활성 또는 비활성 상태가 될 때 이벤트가 적절하게 발생하도록 하고 올바른 큐가 렌더링되도록 하는 데 사용됩니다.
사용자 에이전트는 텍스트 트랙 큐가 해당
텍스트 트랙의
텍스트 트랙 큐
목록에서 제거될 때마다, 텍스트 트랙 자체가 해당
미디어 요소의
텍스트 트랙 목록에서
제거되거나 텍스트 트랙 모드가
비활성화됨으로 변경될 때마다, 그리고
미디어 요소의 readyState가
다시 HAVE_NOTHING으로
변경될 때마다 이 플래그를 동기적으로 설정 해제해야 합니다. 관련 상황이 발생하기 전에
표시 중이었던
텍스트 트랙의 하나 이상의 큐에 대해
이러한 방식으로 플래그가 설정 해제되면, 사용자 에이전트는 영향을 받은 모든 큐의 플래그를 설정
해제한 후 해당 텍스트 트랙의
텍스트 트랙 렌더링을 업데이트하는
규칙을 적용해야 합니다. 예를 들어 WebVTT 기반
텍스트 트랙의 경우
WebVTT 텍스트 트랙 표시를
업데이트하는 규칙입니다. [WEBVTT]
이는 렌더링 모델의 일부로 사용되어 큐를 일관된 위치에 유지합니다. 초기에는 비어 있어야 합니다. 텍스트 트랙 큐 활성 플래그가 설정 해제될 때마다 사용자 에이전트는 텍스트 트랙 큐 표시 상태를 비워야 합니다.
미디어 요소의 텍스트 트랙에 있는 텍스트 트랙 큐는 텍스트 트랙 큐 순서에 따라 서로 상대적으로 정렬되며, 이는 다음과 같이 결정됩니다. 먼저 큐를 해당 텍스트 트랙별로 그룹화하며, 그룹은 해당 텍스트 트랙이 미디어 요소의 텍스트 트랙 목록에 나타나는 것과 같은 순서로 정렬합니다. 그런 다음 각 그룹 내에서 큐를 시작 시간이 가장 이른 것부터 정렬합니다. 다음으로 시작 시간이 같은 모든 큐를 종료 시간이 가장 늦은 것부터 정렬합니다. 마지막으로 종료 시간이 동일한 모든 큐는 각자의 텍스트 트랙 큐 목록에 마지막으로 추가된 순서에 따라 가장 오래된 것부터 정렬해야 합니다(예를 들어 WebVTT 파일의 큐라면 처음에는 파일에 나열된 순서가 됩니다). [WEBVTT]
미디어 리소스별 텍스트 트랙은 미디어 리소스에서 발견되는 데이터에 대응하는 텍스트 트랙입니다.
이러한 데이터를 처리하고 렌더링하는 규칙은 관련 명세, 예를 들어 미디어 리소스가 비디오인 경우 비디오 형식 명세에서 정의합니다. 일부 레거시 형식에 대한 자세한 내용은 미디어 컨테이너의 대역 내 미디어 리소스 트랙을 HTML로 가져오기에서 확인할 수 있습니다. [INBAND]
미디어 리소스에 사용자 에이전트가 텍스트 트랙과 동등한 것으로 인식하고 지원하는 데이터가 포함된 경우 사용자 에이전트는 다음과 같이 관련 데이터를 사용하여 미디어 리소스별 텍스트 트랙을 노출하는 단계를 실행합니다.
관련 데이터를 새로운 텍스트 트랙과 연결합니다. 이 텍스트 트랙은 미디어 리소스별 텍스트 트랙입니다.
관련 명세에서 정의한 관련 데이터의 의미에 따라 새로운 텍스트 트랙의 종류, 레이블, 언어 및 식별자를 설정합니다. 해당 데이터에 레이블이 없다면 레이블을 빈 문자열로 설정해야 합니다.
미디어 리소스가 미디어 프래그먼트 구문을 지원하는 형식이라면 식별자는 그러한 프래그먼트의 트랙 차원에서 트랙 이름으로 사용했을 때 해당 트랙을 활성화하는 식별자와 같아야 합니다.
텍스트 트랙 큐 목록을 해당 형식에 적합한 텍스트 트랙 렌더링을 업데이트하는 규칙과 연결합니다.
새로운 텍스트 트랙의
종류가
chapters
또는 metadata라면
미디어 리소스의
유형에 따라 텍스트 트랙 대역 내
메타데이터 트랙 디스패치 유형을 다음과 같이 설정합니다.
CodecID 요소의 값으로 설정해야 합니다.
[WEBMCG]
moov 상자에 있는
텍스트 트랙의
trak 상자에서 첫 번째 mdia 상자의 첫 번째
minf 상자의 첫 번째 stbl 상자의 첫 번째
stsd 상자로 두거나, 그러한 stsd 상자가 존재하지 않으면 null로
둡니다.
stsd box가 null이거나 stsd box에 mett 상자와
metx 상자가 모두 없다면 텍스트 트랙 대역
내 메타데이터 트랙 디스패치 유형을 빈 문자열로 설정해야 합니다.
그렇지 않고 stsd box에 mett 상자가 있다면
텍스트 트랙 대역
내 메타데이터 트랙 디스패치 유형을 문자열 "mett", U+0020 SPACE 문자 및
stsd box의 첫 번째 mett 상자에 있는 첫 번째
mime_format 필드의 값을 연결한 값으로 설정해야 하며, 해당 상자에 그 필드가
없다면 빈 문자열로 설정해야 합니다.
그렇지 않고 stsd box에 mett 상자는 없지만 metx 상자가
있다면 텍스트 트랙 대역
내 메타데이터 트랙 디스패치 유형을 문자열 "metx", U+0020 SPACE 문자 및
stsd box의 첫 번째 metx 상자에 있는 첫 번째
namespace 필드의 값을 연결한 값으로 설정해야 하며, 해당 상자에 그 필드가 없다면
빈 문자열로 설정해야 합니다.
[MPEG4]
큐를 노출하기 위한 지침에 따라 지금까지 파싱된 큐로 새로운 텍스트 트랙의 큐 목록을 채우고 필요에 따라 이를 동적으로 업데이트하기 시작합니다.
데이터에 대한 관련 명세의 요구사항 및 사용자의 환경설정과 일치하는 모드로 새로운 텍스트 트랙의 모드를 설정합니다.
예를 들어 활성 상태인 다른 자막이 없고 이것이 강제 자막 트랙 (오디오 트랙의 기본 언어로 된 자막이지만 실제로 다른 언어로 된 오디오에 대해서만 자막을 제공하는 트랙)이라면 여기에서 해당 자막이 활성화될 수 있습니다.
미디어 요소의
textTracks
속성의 TextTrackList
객체에서 addtrack이라는
이름의 이벤트를 발생시킵니다.
이때 TrackEvent를
사용하고 track
속성을 텍스트 트랙으로
초기화합니다.
텍스트 트랙 종류는 다음 표에 따라 요소의
kind 속성
상태에서 결정됩니다. 첫 번째 열의 셀에 주어진 상태에 대해
종류는 두 번째
열에 주어진 문자열입니다.
| 상태 | 문자열 |
|---|---|
| 자막 | subtitles
|
| 캡션 | captions
|
| 설명 | descriptions
|
| 챕터 메타데이터 | chapters
|
| 메타데이터 | metadata
|
텍스트 트랙 레이블은 요소의 트랙 레이블입니다.
텍스트 트랙 식별자는 존재하는
경우
요소의 id
속성 값이고, 그렇지 않으면 빈 문자열입니다.
kind,
label,
srclang 및
id
속성이 설정, 변경 또는 제거되면 텍스트 트랙은 위 정의에 따라 함께
업데이트되어야 합니다.
트랙 URL의 변경은 아래 알고리즘에서 처리합니다.
텍스트 트랙 준비 상태의 초기값은 로드되지 않음이고, 텍스트 트랙 모드의 초기값은 비활성화됨입니다.
텍스트 트랙 큐 목록의 초기값은 비어 있습니다. 참조된 파일이 파싱되면 동적으로 변경됩니다. 목록에는 해당 형식에 적합한 텍스트 트랙 렌더링을 업데이트하는 규칙이 연결됩니다. WebVTT의 경우 이는 WebVTT 텍스트 트랙 표시를 업데이트하는 규칙입니다. [WEBVTT]
track
요소의 부모 요소가 변경되고 새로운 부모가 미디어 요소인
경우 사용자 에이전트는
track
요소에 대응하는 텍스트 트랙을
미디어 요소의
텍스트 트랙 목록에 추가해야 합니다.
그런 다음 미디어 요소가 주어졌을 때
미디어 요소 태스크를
큐에
추가하여 미디어 요소의 textTracks
속성의 TextTrackList
객체에서 addtrack이라는
이름의 이벤트를 발생시켜야
합니다. 이때 TrackEvent를 사용하고
track
속성을 텍스트 트랙으로 초기화합니다.
track
요소의 부모 요소가 변경되고 이전 부모가 미디어 요소였던
경우 사용자 에이전트는
track
요소에 대응하는 텍스트 트랙을
미디어 요소의
텍스트 트랙 목록에서 제거해야
합니다.
그런 다음 미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에
추가하여 미디어 요소의 textTracks
속성의 TextTrackList
객체에서 removetrack이라는
이름의 이벤트를 발생시켜야
합니다. 이때 TrackEvent를
사용하고 track
속성을 텍스트 트랙으로 초기화합니다.
track
요소에 대응하는 텍스트 트랙이
미디어 요소의
텍스트 트랙 목록에 추가되면 사용자
에이전트는 미디어 요소가 주어졌을 때
미디어 요소
태스크를 큐에
추가하여 미디어 요소에 대해 다음 단계를
실행해야
합니다.
요소의 파서에서 차단됨 플래그가 true라면 반환합니다.
요소의 자동 트랙 선택 수행 완료 플래그가 true라면 반환합니다.
이 요소에 대해 자동 텍스트 트랙 선택에 대한 사용자 환경설정을 따릅니다.
사용자 에이전트가 미디어 요소에 대해 자동 텍스트 트랙 선택에 대한 사용자 환경설정을 따라야 할 때 사용자 에이전트는 다음 단계를 실행해야 합니다.
위 단계에서 하나 이상의 텍스트 트랙 종류에 대해 자동 텍스트 트랙 선택을 수행하라고 명시한 경우 이는 다음 단계를 실행함을 의미합니다.
candidates를 미디어 요소의 텍스트 트랙 목록에 있는 텍스트 트랙 중 텍스트 트랙 종류가 알고리즘에 전달된 종류 중 하나인 트랙으로 구성된 목록으로 두며, 존재하는 경우 텍스트 트랙 목록에 주어진 순서를 사용합니다.
candidates가 비어 있다면 반환합니다.
사용자가 candidates에 있는 트랙의 텍스트 트랙 종류, 텍스트 트랙 언어 및 텍스트 트랙 레이블을 기반으로 해당 트랙을 활성화하고 싶다는 선호를 표시했다면 그 트랙의 텍스트 트랙 모드를 표시 중으로 설정합니다.
예를 들어 사용자는 브라우저 환경설정을 "가능하면 항상 프랑스어 캡션을 표시", "제목에 'Commentary'가 있는 자막 트랙이 있으면 활성화" 또는 "오디오 설명 트랙을 사용할 수 있다면 하나를 활성화하되 가능하면 스위스 독일어를 사용하고, 그렇지 않으면 표준 스위스 독일어 또는 표준 독일어를 사용"하도록 설정할 수 있습니다.
그렇지 않고 candidates의 텍스트
트랙 중 default
속성이 설정된 track
요소에 대응하며 텍스트 트랙 모드가
비활성화됨으로 설정된 트랙이
있다면 그러한 첫 번째 트랙의 텍스트 트랙
모드를
표시 중으로 설정합니다.
track
요소에 대응하는 텍스트 트랙에서 다음 상황 중 하나가
발생하면 사용자 에이전트는 해당 텍스트 트랙 및 해당 track
요소에 대해 track 처리 모델을
시작해야 합니다.
사용자 에이전트가 텍스트 트랙 및 해당 track
요소에 대해 track 처리 모델을 시작할
때 다음 알고리즘을 실행해야 합니다. 이 알고리즘은 이벤트 루프
메커니즘과 밀접하게 상호
작용합니다. 특히 이벤트 루프 알고리즘의 일부로
트리거되는 동기 구간이 있습니다.
해당 구간의 단계는 ⌛로 표시됩니다.
이 텍스트 트랙 및 해당 track
요소에 대해 이 알고리즘의 다른 실행이 이미 진행 중이라면 그 다른 알고리즘이 이 요소를
처리하도록 두고 반환합니다.
이 단계들을 실행하도록 만든 원인이 계속 진행되도록 두고 나머지 단계를 병렬로 실행합니다.
상단: 안정 상태를 기다립니다. 동기 구간은 다음 단계로 구성됩니다. (동기 구간의 단계는 ⌛로 표시됩니다.)
⌛ 텍스트 트랙 준비 상태를 로드 중으로 설정합니다.
⌛ track
요소의 부모가 미디어 요소라면
corsAttributeState를 부모 미디어 요소의 crossorigin
콘텐츠 속성 상태로 둡니다. 그렇지 않으면 corsAttributeState를
CORS 없음으로
둡니다.
URL이 빈 문자열이 아니라면 다음을 수행합니다.
request를 URL, "track" 및
corsAttributeState가 주어지고 동일 출처 폴백 플래그가 설정된 상태에서
잠재적 CORS 요청을
생성한 결과로 둡니다.
request의 개시자 유형을
"track"으로 설정합니다.
request를 가져옵니다.
데이터를 가져오는 동안 이를 처리하기 위해 가져오기 알고리즘이 네트워킹 태스크 소스에 큐에 추가한 태스크는 리소스의 유형을 결정해야 합니다. 리소스 유형이 지원되는 텍스트 트랙 형식이 아니라면 아래에서 설명한 대로 로드가 실패합니다. 그렇지 않으면 리소스의 데이터를 수신되는 대로 적절한 파서 (예: WebVTT 파서)에 전달해야 하며, 텍스트 트랙 큐 목록을 해당 파서의 출력으로 사용합니다. [WEBVTT]
적절한 파서는 이러한 네트워킹 태스크 소스 태스크 동안 각 태스크가 네트워크에서 수신한 데이터로 실행될 때 텍스트 트랙 큐 목록을 점진적으로 업데이트합니다.
이 명세는 현재 텍스트 트랙의 MIME 유형을 확인할지 또는 어떻게 확인할지, 실제 파일 데이터를 사용하여 파일 유형 스니핑을 수행할지 또는 어떻게 수행할지를 규정하지 않습니다. 구현자의 의도가 이 문제에 대해 서로 다르므로 올바른 해결책이 무엇인지 명확하지 않습니다. 여기에 요구사항이 없는 경우 Content-Type 헤더를 따라야 한다는 HTTP 명세의 엄격한 요구사항이 우선합니다("Content-Type은 기반 데이터의 미디어 유형을 지정합니다." ... "미디어 유형이 Content-Type 필드로 주어지지 않은 경우에만 수신자는 콘텐츠 검사 및/또는 리소스를 식별하는 데 사용된 URI의 이름 확장자를 통해 미디어 유형을 추측하려고 시도할 수 있습니다.").
어떤 이유로든 가져오기가 실패하거나(네트워크 오류, 서버가 오류 코드를 반환함, CORS 실패 등)
URL이 빈 문자열이라면 미디어
요소가 주어졌을 때
DOM
조작 태스크 소스에
요소 태스크를 큐에
추가하여
먼저 텍스트 트랙 준비 상태를
로드
실패로 변경한 다음
track
요소에서 error라는
이름의 이벤트를
발생시킵니다.
가져오기가 실패하지 않았지만 리소스 유형이 지원되는 텍스트 트랙 형식이 아니거나 파일을
성공적으로 처리하지 못했다면(예: 해당 형식이 XML 형식이고 파일에 XML이
감지하여 애플리케이션에 보고하도록 요구하는 올바른 형식 오류가 포함된 경우), 앞서 언급한 문제가
발견된 네트워킹 태스크
소스에
큐에 추가된
태스크는
텍스트
트랙 준비 상태를
로드
실패로 변경하고
track
요소에서 error라는
이름의 이벤트를
발생시켜야 합니다.
가져오기가 실패하지 않고 파일이 성공적으로 처리되었다면 데이터를 모두 파싱한 후
네트워킹 태스크
소스가
큐에 추가한 마지막
태스크는
텍스트
트랙 준비 상태를
로드됨으로 변경하고
track
요소에서 load라는
이름의 이벤트를
발생시켜야 합니다.
가져오기가 진행되는 동안 다음 중 하나가 발생한다면:
...사용자 에이전트는 가져오기를 중단하고 해당
알고리즘이 생성한 대기 중인
태스크를 폐기해야 합니다
(특히 URL이 변경된 시점 이후에는 텍스트 트랙 큐 목록에
큐를 추가하지 않음). 그런 다음 track
요소가 주어졌을 때 DOM 조작 태스크 소스에
요소 태스크를 큐에
추가하여
먼저 텍스트 트랙 준비 상태를
로드
실패로 변경한 다음
track
요소에서 error라는
이름의 이벤트를
발생시킵니다.
텍스트 트랙 준비 상태가 더 이상 로드 중으로 설정되어 있지 않을 때까지 기다립니다.
텍스트 트랙 모드가 또는 표시 중으로 설정된 동시에 트랙 URL이 더 이상 URL과 같지 않을 때까지 기다립니다.
상단으로 표시된 단계로 이동합니다.
track
요소의 src 속성이
설정, 변경 또는 제거될 때마다 사용자 에이전트는 즉시 요소의
텍스트 트랙의
텍스트 트랙 큐
목록을 비워야
합니다. (이로 인해 위 알고리즘이 이전에 지정된 URL을 사용하여 가져오던 리소스의 큐를 더 이상
추가하지 않게 됩니다.)
HTML 사용자 에이전트가 처리하기 위해 특정 형식의 텍스트 트랙 큐를 해석하는 방법은 해당 형식에서 정의합니다. 그러한 명세가 없는 경우 이 절은 구현이 해당 형식을 일관되게 노출하려고 시도할 수 있는 일부 제약을 제공합니다.
HTML의 텍스트 트랙 모델을 지원하기 위해 시간 지정 데이터의 각 단위를 텍스트 트랙 큐로 변환합니다. 형식의 기능을 이 명세에서 정의한 텍스트 트랙 큐의 측면에 매핑하는 방법이 정의되어 있지 않다면 구현은 해당 매핑이 위에서 정의한 텍스트 트랙 큐의 각 측면에 대한 정의 및 다음 제약과 일치하도록 해야 합니다.
형식에 각 큐 식별자와 명백하게 대응하는 항목이 없다면 빈 문자열로 설정하는 것이 좋습니다.
false로 설정하는 것이 좋습니다.
현재 모든 엔진에서 지원됩니다.
[Exposed =Window ]
interface TextTrackList : EventTarget {
readonly attribute unsigned long length ;
getter TextTrack (unsigned long index );
TextTrack ? getTrackById (DOMString id );
attribute EventHandler onchange ;
attribute EventHandler onaddtrack ;
attribute EventHandler onremovetrack ;
};
media.textTracks.length
현재 모든 엔진에서 지원됩니다.
미디어 요소와 연결된
텍스트 트랙의 수를 반환합니다(예:
track 요소에서
가져온 트랙). 이는 미디어 요소의
텍스트 트랙
목록에 있는 텍스트 트랙의
수입니다.
media.textTracks[ n ]
textTrack = media.textTracks.getTrackById(id)
현재 모든 엔진에서 지원됩니다.
주어진 식별자를 가진 TextTrack 객체를 반환하고,
해당 식별자를 가진 트랙이 없다면 null을 반환합니다.
TextTrackList 객체는 주어진
순서로 동적으로 업데이트되는 텍스트 트랙 목록을 나타냅니다.
미디어 요소의
textTracks 속성은
미디어 요소의
텍스트 트랙
목록에 있는 텍스트 트랙을
텍스트 트랙 목록과 같은 순서로 나타내는
TextTrackList 객체를
반환해야 합니다.
현재 모든 엔진에서 지원됩니다.
TextTrackList 객체의
length 속성은
TextTrackList 객체가
나타내는 목록의 텍스트 트랙 수를 반환해야 합니다.
특정 시점의 TextTrackList 객체의
지원되는 속성 인덱스는 존재하는 경우
0부터 TextTrackList 객체가
나타내는 목록의 텍스트 트랙 수에서 1을 뺀 값까지의 숫자입니다.
목록에 텍스트 트랙이 없다면
지원되는 속성 인덱스가 없습니다.
TextTrackList 객체의 주어진
인덱스 index에 대한
인덱스 속성의 값을 결정하려면,
사용자 에이전트는 TextTrackList 객체가 나타내는
목록의 index번째 텍스트 트랙을 반환해야 합니다.
getTrackById(id) 메서드는
TextTrackList 객체에서
id IDL 속성이
id 인수의 값과 같은 값을 반환하는 첫 번째 TextTrack을 반환해야 합니다.
주어진 인수와 일치하는 트랙이 없다면 메서드는 null을 반환해야 합니다.
현재 모든 엔진에서 지원됩니다.
enum TextTrackMode { " disabled " , " hidden " , " showing " };
enum TextTrackKind { " subtitles " , " captions " , " descriptions " , " chapters " , " metadata " };
[Exposed =Window ]
interface TextTrack : EventTarget {
readonly attribute TextTrackKind kind ;
readonly attribute DOMString label ;
readonly attribute DOMString language ;
readonly attribute DOMString id ;
readonly attribute DOMString inBandMetadataTrackDispatchType ;
attribute TextTrackMode mode ;
readonly attribute TextTrackCueList ? cues ;
readonly attribute TextTrackCueList ? activeCues ;
undefined addCue (TextTrackCue cue );
undefined removeCue (TextTrackCue cue );
attribute EventHandler oncuechange ;
};
textTrack = media.addTextTrack(kind [, label [, language ] ])
새로운 TextTrack 객체를 생성하여
반환하며, 이 객체는 미디어 요소의
텍스트 트랙 목록에도 추가됩니다.
textTrack.kind
현재 모든 엔진에서 지원됩니다.
텍스트 트랙 종류 문자열을 반환합니다.
textTrack.label
현재 모든 엔진에서 지원됩니다.
존재하는 경우 텍스트 트랙 레이블을 반환하고, 그렇지 않으면 빈 문자열을 반환합니다(객체가 사용자에게 노출되는 경우 객체의 다른 속성에서 사용자 지정 레이블을 생성해야 할 가능성이 있음을 나타냄).
textTrack.language
현재 모든 엔진에서 지원됩니다.
텍스트 트랙 언어 문자열을 반환합니다.
textTrack.id
현재 모든 엔진에서 지원됩니다.
주어진 트랙의 ID를 반환합니다.
대역 내 트랙의 경우 형식이 미디어
프래그먼트 구문을 지원한다면
프래그먼트와 함께 사용할 수 있으며,
getTrackById()
메서드와 함께 사용할 수도 있는 ID입니다.
textTrack.inBandMetadataTrackDispatchType
TextTrack/inBandMetadataTrackDispatchType
텍스트 트랙 대역 내 메타데이터 트랙 디스패치 유형 문자열을 반환합니다.
textTrack.mode [ = value ]
현재 모든 엔진에서 지원됩니다.
다음 목록의 문자열로 나타낸 텍스트 트랙 모드를 반환합니다.
disabled"
텍스트 트랙 비활성화됨 모드입니다.
모드입니다.
showing"텍스트 트랙 표시 중 모드입니다.
모드를 변경하도록 설정할 수 있습니다.
textTrack.cues
현재 모든 엔진에서 지원됩니다.
텍스트 트랙 큐 목록을 TextTrackCueList
객체로 반환합니다.
textTrack.activeCues
현재 모든 엔진에서 지원됩니다.
텍스트 트랙 큐 목록에서 현재 활성 상태인
(즉, 현재 재생 위치보다 먼저 시작하고 그
이후에
끝나는) 텍스트 트랙 큐를 TextTrackCueList
객체로 반환합니다.
textTrack.addCue(cue)
현재 모든 엔진에서 지원됩니다.
주어진 큐를 textTrack의 텍스트 트랙 큐 목록에 추가합니다.
textTrack.removeCue(cue)
현재 모든 엔진에서 지원됩니다.
주어진 큐를 textTrack의 텍스트 트랙 큐 목록에서 제거합니다.
미디어 요소의
addTextTrack(kind, label,
language) 메서드가 호출되면 다음 단계를 실행해야 합니다.
새로운 텍스트 트랙을 생성하고, 해당 텍스트 트랙 종류를 kind로, 텍스트 트랙 레이블을 label로, 텍스트 트랙 언어를 language로, 텍스트 트랙 준비 상태를 텍스트 트랙 로드됨 상태로, 텍스트 트랙 모드를 모드로, 텍스트 트랙 큐 목록을 빈 목록으로 설정합니다.
처음에는 텍스트 트랙 큐 목록에 텍스트 트랙 렌더링을 업데이트하는 규칙이 연결되어 있지 않습니다. 텍스트 트랙 큐가 추가되면 텍스트 트랙 큐 목록의 규칙이 그에 따라 영구적으로 설정됩니다.
미디어 요소가 주어졌을 때
미디어 요소 태스크를 큐에 추가하여
미디어 요소의 textTracks
속성의 TextTrackList 객체에서
addtrack이라는
이름의 이벤트를 발생시킵니다. 이때 TrackEvent를 사용하고,
track
속성을 새로운 텍스트 트랙으로 초기화합니다.
새로운 텍스트 트랙을 반환합니다.
inBandMetadataTrackDispatchType
getter 단계는 this의 대역 내 메타데이터 트랙 디스패치
유형을 반환하는 것입니다.
mode
getter 단계는 this의
모드에 따라 다음 문자열을
반환하는 것입니다.
disabled"hidden"showing"mode setter 단계는
주어진 값에 따라 this의
모드를 다음 모드로 설정하는
것입니다.
disabled"
showing"cues
getter 단계는 다음과 같습니다.
this의 모드가 텍스트 트랙 비활성화됨 모드라면 null을 반환합니다.
this의
텍스트 트랙 큐 목록 중
종료 시간이
스크립트가 시작되었을 때
가능한 가장 이른 위치와 같거나 그 이후인 부분집합을
텍스트 트랙 큐 순서로 나타내는
라이브 TextTrackCueList
객체를 반환합니다.
각 TextTrack 객체에 대해 객체가
반환될 때마다 동일한 TextTrackCueList
객체를 반환해야 합니다.
스크립트가 시작되었을 때 가능한 가장 이른 위치는 이벤트 루프가 마지막으로 1단계에 도달했을 때의 가능한 가장 이른 위치입니다.
activeCues getter 단계는 다음과 같습니다.
this의 모드가 텍스트 트랙 비활성화됨 모드라면 null을 반환합니다.
this의
텍스트 트랙 큐 목록 중
스크립트가 시작되었을 때 활성
플래그가 설정되어 있던 부분집합을
텍스트 트랙 큐 순서로 나타내는
라이브 TextTrackCueList
객체를 반환합니다.
각 TextTrack 객체에 대해 객체가
반환될 때마다 동일한 TextTrackCueList
객체를 반환해야 합니다.
텍스트 트랙 큐의 활성 플래그가 스크립트가 시작되었을 때 설정되어 있었음은 이벤트 루프가 마지막으로 1단계에 도달했을 때 해당 텍스트 트랙 큐 활성 플래그가 설정되어 있었음을 의미합니다.
addCue(cue) 메서드의 단계는 다음과 같습니다.
list를 this의 텍스트 트랙 큐 목록으로 둡니다.
list에 아직 연결된 텍스트 트랙 렌더링을 업데이트하는 규칙이 없다면 list를 cue에 적합한 텍스트 트랙 렌더링을 업데이트하는 규칙과 연결합니다.
list에 연결된 텍스트 트랙 렌더링을 업데이트하는
규칙이 cue에 적합한
텍스트 트랙 렌더링을 업데이트하는
규칙과 같지 않다면 "InvalidStateError"
DOMException을
예외로 던집니다.
주어진 cue가 텍스트 트랙 큐 목록에 있다면 cue를 해당 텍스트 트랙 큐 목록에서 제거합니다.
cue를 list에 추가합니다.
removeCue(cue) 메서드의 단계는 다음과 같습니다.
주어진 cue가 this의
텍스트 트랙 큐 목록에 없다면
"NotFoundError"
DOMException을
예외로 던집니다.
cue를 this의 텍스트 트랙 큐 목록에서 제거합니다.
이 예에서는 audio
요소를 사용하여 여러 음향 효과가 포함된 사운드 파일에서 특정 음향 효과를 재생합니다. 브라우저가
스크립트를 실행하느라 바쁜 경우에도 클립의 끝에서 정확히 종료되도록 큐를 사용하여 오디오를 일시
정지합니다. 페이지가 스크립트를 사용하여 오디오를 일시 정지하는 방식에 의존했다면 브라우저가
지정된 정확한 시간에 스크립트를 실행하지 못할 경우 다음 클립의 시작 부분이 들릴 수도 있습니다.
var sfx = new Audio( 'sfx.wav' );
var sounds = sfx. addTextTrack( 'metadata' );
// add sounds we care about
function addFX( start, end, name) {
var cue = new VTTCue( start, end, '' );
cue. id = name;
cue. pauseOnExit = true ;
sounds. addCue( cue);
}
addFX( 12.783 , 13.612 , 'dog bark' );
addFX( 13.612 , 15.091 , 'kitten mew' );
function playSound( id) {
sfx. currentTime = sounds. getCueById( id). startTime;
sfx. play();
}
// play a bark as soon as we can
sfx. oncanplaythrough = function () {
playSound( 'dog bark' );
}
// meow when the user tries to leave,
// and have the browser ask them to stay
window. onbeforeunload = function ( e) {
playSound( 'kitten mew' );
e. preventDefault();
}
현재 모든 엔진에서 지원됩니다.
[Exposed =Window ]
interface TextTrackCueList {
readonly attribute unsigned long length ;
getter TextTrackCue (unsigned long index );
TextTrackCue ? getCueById (DOMString id );
};
cuelist.length
목록에 있는 큐의 수를 반환합니다.
cuelist[index]목록에서 인덱스가 index인 텍스트 트랙 큐를 반환합니다. 큐는 텍스트 트랙 큐 순서로 정렬됩니다.
cuelist.getCueById(id)
텍스트 트랙 큐 식별자가 id인 첫 번째 텍스트 트랙 큐를 (텍스트 트랙 큐 순서로) 반환합니다.
해당 식별자를 가진 큐가 없거나 인수가 빈 문자열이면 null을 반환합니다.
TextTrackCueList 객체는 주어진
순서로 동적으로 업데이트되는 텍스트 트랙 큐 목록을 나타냅니다.
현재 모든 엔진에서 지원됩니다.
length 속성은 TextTrackCueList
객체가 나타내는 목록의 큐 수를 반환해야 합니다.
특정 시점의 TextTrackCueList 객체의
지원되는 속성 인덱스는 존재하는 경우 0부터
TextTrackCueList 객체가
나타내는 목록의 큐 수에서 1을 뺀 값까지의 숫자입니다. 목록에
큐가 없다면
지원되는 속성 인덱스가 없습니다.
주어진 인덱스 index에 대한
인덱스 속성의 값을 결정하려면 사용자
에이전트는 TextTrackCueList 객체가
나타내는 목록의 index번째 텍스트 트랙 큐를 반환해야
합니다.
현재 모든 엔진에서 지원됩니다.
getCueById(id) 메서드는 빈 문자열이 아닌 인수로
호출되면 TextTrackCueList
객체가 나타내는 목록에서 텍스트 트랙 큐
식별자가
id인 첫 번째 텍스트 트랙 큐가 있다면 이를 반환하고, 그렇지
않으면
null을 반환해야 합니다. 인수가 빈 문자열이면 메서드는 null을 반환해야 합니다.
현재 모든 엔진에서 지원됩니다.
[Exposed =Window ]
interface TextTrackCue : EventTarget {
readonly attribute TextTrack ? track ;
attribute DOMString id ;
attribute double startTime ;
attribute unrestricted double endTime ;
attribute boolean pauseOnExit ;
attribute EventHandler onenter ;
attribute EventHandler onexit ;
};
cue.track존재하는 경우 이 텍스트 트랙 큐가 속한
TextTrack 객체를 반환하고,
그렇지 않으면 null을 반환합니다.
cue.id [ = value ]
텍스트 트랙 큐 식별자를 반환합니다.
설정할 수 있습니다.
cue.startTime [ = value ]
텍스트 트랙 큐 시작 시간을 초 단위로 반환합니다.
설정할 수 있습니다.
cue.endTime [ = value ]
텍스트 트랙 큐 종료 시간을 초 단위로 반환합니다.
경계가 없는 텍스트 트랙 큐의 경우 양의 Infinity를 반환합니다.
설정할 수 있습니다.
cue.pauseOnExit [ = value ]
텍스트 트랙 큐 종료 시 일시 정지 플래그가 설정되어 있다면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
설정할 수 있습니다.
현재 모든 엔진에서 지원됩니다.
현재 모든 엔진에서 지원됩니다.
id 속성은 가져올
때
TextTrackCue 객체가
나타내는 텍스트 트랙 큐의
텍스트 트랙 큐 식별자를 반환해야 합니다.
설정할 때 텍스트 트랙 큐 식별자를 새 값으로
설정해야
합니다.
현재 모든 엔진에서 지원됩니다.
startTime 속성은 가져올 때
TextTrackCue 객체가 나타내는
텍스트 트랙 큐의
텍스트 트랙 큐 시작 시간을 초 단위로
반환해야
합니다. 설정할 때 텍스트 트랙 큐 시작
시간을 초 단위로 해석한
새 값으로 설정해야 합니다. 그런 다음 TextTrackCue 객체의
텍스트 트랙 큐가
텍스트 트랙의
큐 목록에 있고, 해당
텍스트 트랙이
미디어 요소의
텍스트 트랙 목록에 있으며,
미디어 요소의
포스터 표시 플래그가 설정되어 있지 않다면 해당
미디어 요소에 대해
시간 진행 단계를
실행합니다.
현재 모든 엔진에서 지원됩니다.
endTime 속성은 가져올 때
TextTrackCue 객체가 나타내는
텍스트 트랙 큐의
텍스트 트랙 큐 종료 시간을 초 단위 또는 양의
Infinity로 반환해야 합니다. 설정할 때 새 값이 음의 Infinity 또는 숫자가 아님(NaN) 값이라면
TypeError
예외를 던집니다. 그렇지 않으면 텍스트 트랙 큐
종료 시간을 새 값으로 설정해야
합니다. 그런 다음 TextTrackCue 객체의
텍스트 트랙 큐가
텍스트 트랙의
큐 목록에 있고, 해당
텍스트 트랙이
미디어 요소의
텍스트 트랙 목록에 있으며,
미디어 요소의
포스터 표시 플래그가 설정되어 있지 않다면 해당
미디어 요소에 대해
시간 진행 단계를
실행합니다.
현재 모든 엔진에서 지원됩니다.
pauseOnExit 속성은 가져올 때
TextTrackCue 객체가 나타내는
텍스트 트랙 큐의
텍스트 트랙 큐 종료 시
일시 정지 플래그가
설정되어 있다면 true를 반환하고, 그렇지 않으면 false를 반환해야 합니다. 설정할 때 새 값이
true이면 텍스트 트랙
큐 종료 시 일시 정지 플래그를
설정하고, 그렇지 않으면 설정 해제해야 합니다.
다음은 TextTrackList
인터페이스를 구현하는 모든 객체가 이벤트 처리기 IDL
속성으로 지원해야 하는
이벤트 처리기와 이에 대응하는
이벤트 처리기 이벤트
유형입니다.
| 이벤트 처리기 | 이벤트 처리기 이벤트 유형 |
|---|---|
onchange |
change
|
onaddtrack |
addtrack
|
onremovetrack |
removetrack
|
다음은 TextTrack 인터페이스를 구현하는
모든 객체가 이벤트 처리기 IDL 속성으로
지원해야 하는
이벤트 처리기와 이에 대응하는
이벤트 처리기 이벤트
유형입니다.
| 이벤트 처리기 | 이벤트 처리기 이벤트 유형 |
|---|---|
oncuechange
현재 모든 엔진에서 지원됩니다. Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer10+ Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ |
cuechange
|
다음은 TextTrackCue 인터페이스를
구현하는 모든 객체가 이벤트 처리기 IDL
속성으로 지원해야 하는
이벤트 처리기와 이에 대응하는
이벤트 처리기 이벤트
유형입니다.
| 이벤트 처리기 | 이벤트 처리기 이벤트 유형 |
|---|---|
onenter
현재 모든 엔진에서 지원됩니다. Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer10+ Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ |
enter
|
onexit
현재 모든 엔진에서 지원됩니다. Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer10+ Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ |
exit
|
이 절은 비규범적입니다.
텍스트 트랙은 상호 작용형 또는 보강된 보기를 위해 미디어 데이터와 관련된 데이터를 저장하는 데 사용할 수 있습니다.
예를 들어 스포츠 중계를 보여 주는 페이지에는 현재 점수에 대한 정보가 포함될 수 있습니다. 로봇 경기가 생중계되고 있다고 가정해 보겠습니다. 다음과 같이 영상 위에 점수를 오버레이할 수 있습니다.
사용자가 비디오의 임의의 지점으로 탐색할 때마다 점수 표시가 올바르게 렌더링되도록 하려면 메타데이터 텍스트 트랙 큐가 해당 점수에 적절한 기간만큼 길어야 합니다. 예를 들어 위 프레임에는 경기 번호를 제공하며 경기 전체 길이만큼 지속되는 큐 하나, 파란색 연합의 점수가 변경될 때까지 지속되는 큐 하나, 빨간색 연합의 점수가 변경될 때까지 지속되는 큐 하나가 있을 수 있습니다. 비디오가 단순히 라이브 이벤트 스트림이라면 오른쪽 아래의 시간은 큐를 기반으로 하지 않고 현재 비디오 시간에서 자동으로 파생될 것입니다. 그러나 비디오가 하이라이트만 보여 준다면 그 시간도 큐로 제공될 수 있습니다.
다음은 WebVTT 파일에서 이 내용의 일부가 어떻게 보일 수 있는지를 보여 줍니다.
WEBVTT ... 05:10:00.000 --> 05:12:15.000 matchtype:qual matchnumber:37 ... 05:11:02.251 --> 05:11:17.198 red:78 05:11:03.672 --> 05:11:54.198 blue:66 05:11:17.198 --> 05:11:25.912 red:80 05:11:25.912 --> 05:11:26.522 red:83 05:11:26.522 --> 05:11:26.982 red:86 05:11:26.982 --> 05:11:27.499 red:89 ...
여기서 핵심은 정보가 관련 이벤트가 적용되는 시간 전체에 걸쳐 있는 큐로 제공된다는 점입니다. 대신 점수가 변경될 때 점수를 길이가 0인(또는 매우 짧아 거의 0인) 큐로 제공하여, 예를 들어 05:11:17.198에 "red+2", 05:11:25.912에 "red+3" 등을 지정한다면 문제가 발생합니다. 주된 문제는 스크립트가 알림을 놓치지 않았는지 확인하기 위해 전체 큐 목록을 순회해야 하므로 탐색을 구현하기가 훨씬 어려워진다는 것입니다. 또한 큐가 짧다면 스크립트가 해당 큐를 특별히 수신 대기하지 않는 한 큐가 활성 상태인 것을 전혀 확인하지 못할 수도 있습니다.
이러한 방식으로 큐를 사용할 때 작성자는 현재 주석을 업데이트하기 위해 cuechange
이벤트를 사용하는 것이 좋습니다. (특히 timeupdate
이벤트를 사용하면 큐가 변경되지 않은 경우에도 작업을 수행해야 하므로 덜 적절합니다. 더 중요한 것은
timeupdate
이벤트는 발생 빈도가 제한되므로 메타데이터 큐가 활성 상태가 된 시점과 표시가 업데이트되는 시점
사이에 더 큰 지연이 발생한다는 점입니다.)
AudioTrack
kind
또는 VideoTrack
kind
IDL 속성의 반환값을 식별하거나 텍스트 트랙의
종류를 식별하기 위해
URL이 필요한 다른 명세 또는
형식은 about:html-kind
URL을 사용해야 합니다.
controls
속성은 불리언 속성입니다.
이 속성이 존재하면 작성자가 스크립트로 작성된 컨트롤러를 제공하지 않았으며 사용자 에이전트가 자체
컨트롤 세트를 제공하기를 원한다는 것을 나타냅니다.
속성이 존재하거나 미디어 요소에서 스크립팅이 비활성화되어 있다면 사용자 에이전트는 사용자에게 사용자 인터페이스를 노출하는 것이 좋습니다. 이 사용자 인터페이스에는 재생 시작, 재생 일시 정지, 콘텐츠의 임의 위치로 탐색(콘텐츠가 임의 탐색을 지원하는 경우), 음량 변경, 폐쇄 자막 또는 삽입된 수어 트랙의 표시 변경, 서로 다른 오디오 트랙 선택 또는 오디오 설명 활성화, 사용자에게 더 적합한 방식으로 미디어 콘텐츠 표시(예: 전체 화면 비디오 또는 독립적으로 크기를 조절할 수 있는 창) 기능이 포함되는 것이 좋습니다. 다른 컨트롤도 제공할 수 있습니다.
속성이 없는 경우에도 사용자 에이전트는 미디어 리소스의 재생에 영향을 주는 컨트롤
(예: 재생, 일시 정지, 탐색, 트랙 선택 및 음량 컨트롤)을 제공할 수 있지만, 이러한 기능이 페이지의
일반적인 렌더링을 방해해서는 안 됩니다. 예를 들어 이러한 기능은
미디어 요소의 컨텍스트 메뉴,
플랫폼 미디어 키 또는 리모컨에 노출할 수 있습니다. 사용자 에이전트는 위에서 설명한 대로
(controls
속성이 존재하는 것처럼) 사용자에게 사용자 인터페이스를 노출하는
방식으로 이를 간단히 구현할 수 있습니다.
사용자 에이전트가 미디어 요소 위에 컨트롤을 표시하여
사용자에게 사용자
인터페이스를
노출한다면 사용자 에이전트가 이 인터페이스와 상호 작용하는 동안 사용자 상호 작용 이벤트를
억제하는 것이 좋습니다. (예를 들어 사용자가 비디오 재생 컨트롤을 클릭할 경우 mousedown
이벤트 등이 페이지의 요소에서도 동시에 발생하지 않습니다.)
가능한 경우(특히 재생 시작, 중지, 일시 정지 및 재개, 탐색, 재생 속도 변경, 빨리 감기 또는 되감기, 텍스트 트랙 나열, 활성화 및 비활성화, 오디오 음소거 또는 음량 변경) 사용자 에이전트가 노출하는 사용자 인터페이스 기능은 예를 들어 동일한 이벤트가 모두 발생하도록 위에서 설명한 DOM API를 사용하여 구현해야 합니다.
빨리 감기나 되감기 같은 기능은 playbackRate 속성만 변경하여 구현해야 하며
defaultPlaybackRate 속성을 변경해서는 안 됩니다.
탐색은 미디어 요소의 미디어 타임라인에서 요청된 위치로 탐색하는 방식으로 구현해야 합니다. 임의 위치로 탐색하는 것이 느린 미디어 리소스의 경우 사용자 에이전트는 사용자가 탐색 막대와 같은 근사 위치 인터페이스를 조작한 것에 응답하여 탐색할 때 속도를 위해 근사 플래그를 사용하는 것이 좋습니다.
media.volume [ = value ]
현재 모든 엔진에서 지원됩니다.
현재 재생 음량을 0.0에서 1.0 범위의 숫자로 반환합니다. 0.0이 가장 조용하고 1.0이 가장 큽니다.
음량을 변경하도록 설정할 수 있습니다.
새 값이 0.0 .. 1.0 범위에 없으면 "IndexSizeError" DOMException을
예외로 던집니다.
media.muted [ = value ]
현재 모든 엔진에서 지원됩니다.
오디오가 음소거되어 volume 속성을 재정의하는
경우 true를 반환하고, volume 속성이
적용되는
경우 false를 반환합니다.
오디오 음소거 여부를 변경하도록 설정할 수 있습니다.
미디어 요소에는 0.0(무음)에서 1.0(가장 큰 음량) 범위의 비율인 재생 음량이 있습니다. 초기 음량은 1.0인 것이 좋지만 사용자 에이전트는 사이트별 또는 다른 방식으로 세션 간에 마지막으로 설정한 값을 기억할 수 있으므로 다른 값으로 시작할 수도 있습니다.
미디어 요소 element의 재생 음량을 설정하여 숫자 value로 만들려면 다음을 수행합니다.
element의 재생 음량이 value와 같다면 반환합니다.
element의 재생 음량을 value로 설정합니다.
element가 재생 허용됨 상태가 아니라면 element에 대해 내부 일시 정지 단계를 실행합니다.
element가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여
element에서 volumechange라는
이름의 이벤트를 발생시킵니다.
volume setter 단계는
다음과 같습니다.
주어진 값이 0.0 이상 1.0 이하의 범위에 없다면
"IndexSizeError" DOMException을
예외로 던집니다.
미디어 요소는 다음 중 하나라도 true이면 음소거됨 상태입니다.
해당 음소거 상태가 true입니다.
재생 방향이 뒤쪽입니다.
해당 playbackRate가
너무 낮거나 너무 높아서 사용자 에이전트가 오디오를 유용하게 재생할 수 없습니다.
각 미디어 요소에는 true, false 또는
"default" 중 하나인 음소거 상태가 있으며, 초기값은 "default"입니다.
사용자 에이전트는 사이트별 또는 다른 방식으로 세션 간에 마지막으로 설정한 값을 기억하는 등의 이유로
미디어 요소의
음소거 상태를 설정하여
true 또는 false로 만들 수 있습니다.
미디어 요소 element의 음소거 상태를 설정하여 불리언 value로 만들려면 다음을 수행합니다.
element의 음소거 상태가 value와 같다면 반환합니다.
element의 음소거 상태를 value로 설정합니다.
element가 재생 허용됨 상태가 아니라면 element에 대해 내부 일시 정지 단계를 실행합니다.
element가 주어졌을 때 미디어 요소 태스크를 큐에 추가하여
element에서 volumechange라는
이름의 이벤트를 발생시킵니다.
muted setter 단계는
this의 음소거 상태를 설정하여 주어진 값으로 만드는
것입니다.
사용자 에이전트에는 연결된 음량 잠금(불리언)이 있습니다. 해당 값은 구현 정의이며 재생 음량이 적용되는지를 결정합니다.
요소의 유효 미디어 음량은 다음과 같이 결정됩니다.
사용자가 사용자 에이전트가 요소의 음량을 재정의해야 한다고 지정했다면 사용자가 원하는 음량을 반환합니다.
사용자 에이전트의 음량 잠금이 true라면 시스템 음량을 반환합니다.
요소가 음소거됨 상태라면 0을 반환합니다.
volume을 미디어 요소 오디오 부분의 재생 음량으로 두며, 범위는 0.0(무음)에서 1.0(가장 큰 음량)입니다.
volume을 0.0에서 1.0 범위에 상대적으로 해석하여 반환합니다. 0.0은 무음이고 1.0은 가장 큰 설정이며 중간 값은 음량이 점점 커집니다. 범위는 선형일 필요가 없습니다. 가장 큰 설정은 시스템에서 가능한 가장 큰 설정보다 낮을 수 있습니다. 예를 들어 사용자가 최대 음량을 설정했을 수 있습니다.
미디어 요소의
muted 콘텐츠 속성은
음소거의 기본값을 제공하는
불리언 속성입니다.
muted setter가 호출되거나
사용자가 환경설정을 지정한 후에는 이 속성이 더 이상 영향을 주지 않습니다.
이 비디오(광고)는 자동으로 재생되지만 사용자를 방해하지 않도록 소리 없이 재생되며 사용자가 소리를 켤 수 있습니다. 사용자 상호 작용 없이 음소거가 해제되면 사용자 에이전트가 비디오를 일시 정지할 수 있습니다.
< video src = "adverts.cgi?kind=video" controls autoplay loop muted ></ video >
현재 모든 엔진에서 지원됩니다.
TimeRanges 인터페이스를 구현하는 객체는
시간 범위(기간) 목록을 나타냅니다.
[Exposed =Window ]
interface TimeRanges {
readonly attribute unsigned long length ;
double start (unsigned long index );
double end (unsigned long index );
};
media.length
현재 모든 엔진에서 지원됩니다.
객체의 범위 수를 반환합니다.
time = media.start(index)
현재 모든 엔진에서 지원됩니다.
주어진 인덱스에 해당하는 범위의 시작 시간을 반환합니다.
인덱스가 범위를 벗어나면 "IndexSizeError" DOMException을
예외로 던집니다.
time = media.end(index)
현재 모든 엔진에서 지원됩니다.
주어진 인덱스에 해당하는 범위의 종료 시간을 반환합니다.
인덱스가 범위를 벗어나면 "IndexSizeError" DOMException을
예외로 던집니다.
TimeRanges 객체에는 0개 이상의
시간 범위로 구성된
목록인 범위가 있습니다.
초 단위 숫자인 시작.
초 단위 숫자인 끝.
start(index) 메서드의 단계는 다음과 같습니다.
index가 this의
범위의
크기보다 크거나 같다면
"IndexSizeError" DOMException을
예외로 던집니다.
end(index) 메서드의 단계는 다음과 같습니다.
index가 this의
범위의
크기보다 크거나 같다면
"IndexSizeError" DOMException을
예외로 던집니다.
TimeRanges 객체의
범위에 있는 각
시간 범위에 대해 다음이
참이라면 해당 객체는 정규화된
TimeRanges 객체입니다.
즉, 이러한 객체의 시간 범위는 순서대로 정렬되어 있고 서로 겹치지 않으며 맞닿지도 않습니다(서로 인접한 범위는 하나의 더 큰 시간 범위로 합쳐집니다). 시간 범위는 비어 있을 수 있습니다(시간상의 단일 순간만 참조). 예를 들어 미디어 요소가 일시 정지되어 있을 때 사용자 에이전트가 현재 프레임을 제외한 전체 미디어 리소스를 폐기한 경우 현재 하나의 프레임만 버퍼링되어 있음을 나타낼 수 있습니다.
따라서 시간 범위의 끝은 그 뒤에 이어지는 인접한 (맞닿지만 겹치지는 않는) 시간 범위의 시작과 같습니다. 마찬가지로 0을 기준으로 하는 전체 타임라인을 포함하는 시간 범위는 시작이 0이고 끝이 타임라인의 재생 시간과 같습니다.
미디어 요소의
buffered,
seekable 및
played IDL 속성이
반환하는 객체에서 사용하는 타임라인은 해당 요소의
미디어 타임라인이어야 합니다.
TrackEvent 인터페이스현재 모든 엔진에서 지원됩니다.
[Exposed =Window ]
interface TrackEvent : Event {
constructor (DOMString type , optional TrackEventInit eventInitDict = {});
readonly attribute (VideoTrack or AudioTrack or TextTrack )? track ;
};
dictionary TrackEventInit : EventInit {
(VideoTrack or AudioTrack or TextTrack )? track = null ;
};
event.track
현재 모든 엔진에서 지원됩니다.
이벤트와 관련된 트랙 객체(TextTrack,
AudioTrack 또는
VideoTrack)를
반환합니다.
track
속성은 초기화된 값을 반환해야 합니다. 이는 이벤트의 컨텍스트 정보를 나타냅니다.
이 절은 비규범적입니다.
다음 이벤트는 위에서 설명한 처리 모델의 일부로 미디어 요소에서 발생합니다.
| 이벤트 이름 | 인터페이스 | 발생 시점... | 전제 조건 |
|---|---|---|---|
loadstart
HTMLMediaElement/loadstart_event 현재 모든 엔진에서 지원됩니다. Firefox6+Safari4+Chrome3+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ |
Event
|
사용자 에이전트가 리소스 선택 알고리즘의 일부로 미디어 데이터를 찾기 시작합니다. | networkState가
NETWORK_LOADING과
같습니다.
|
progress
HTMLMediaElement/progress_event 현재 모든 엔진에서 지원됩니다. Firefox6+Safari3.1+Chrome3+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ |
Event
|
사용자 에이전트가 미디어 데이터를 가져오는 중입니다. | networkState가
NETWORK_LOADING과
같습니다.
|
suspend
HTMLMediaElement/suspend_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
사용자 에이전트가 의도적으로 현재 미디어 데이터를 가져오지 않고 있습니다. | networkState가
NETWORK_IDLE과 같습니다.
|
abort
현재 모든 엔진에서 지원됩니다. Firefox9+Safari3.1+Chrome3+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ |
Event
|
사용자 에이전트가 미디어 데이터의 다운로드가 완료되기 전에 가져오기를 중지했지만, 오류로 인한 것은 아닙니다. | error는 코드가
MEDIA_ERR_ABORTED인
객체입니다. networkState는
다운로드가 중단된 시점에 따라 NETWORK_EMPTY 또는
NETWORK_IDLE 중
하나와 같습니다.
|
error
현재 모든 엔진에서 지원됩니다. Firefox6+Safari3.1+Chrome3+
Opera11.6+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android?Samsung Internet?Opera Android12+ |
Event
|
미디어 데이터를 가져오는 중에 오류가 발생했거나 리소스 유형이 지원되는 미디어 형식이 아닙니다. | error는 코드가
MEDIA_ERR_NETWORK
이상인 객체입니다. networkState는
다운로드가 중단된 시점에 따라 NETWORK_EMPTY 또는
NETWORK_IDLE 중
하나와 같습니다.
|
emptied
HTMLMediaElement/emptied_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
networkState가
이전에는 NETWORK_EMPTY
상태가 아니었던 미디어 요소가 방금 해당 상태로 전환되었습니다
(곧 보고될 로드 중 치명적 오류 때문이거나,
리소스 선택 알고리즘이 이미 실행
중일 때
load() 메서드가
호출되었기 때문입니다).
|
networkState가
NETWORK_EMPTY이며,
모든 IDL 속성이 초기 상태입니다.
|
stalled
HTMLMediaElement/stalled_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
사용자 에이전트가 미디어 데이터를 가져오려 하고 있지만 예기치 않게 데이터가 도착하지 않습니다. | networkState가
NETWORK_LOADING입니다.
|
loadedmetadata
HTMLMediaElement/loadedmetadata_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
사용자 에이전트가 방금 미디어 리소스의 재생 시간과 크기를 결정했으며 텍스트 트랙이 준비되었습니다. | readyState가
처음으로 새롭게 HAVE_METADATA
이상이 되었습니다.
|
loadeddata
HTMLMediaElement/loadeddata_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
사용자 에이전트가 처음으로 현재 재생 위치의 미디어 데이터를 렌더링할 수 있습니다. | readyState가
처음으로 새롭게 HAVE_CURRENT_DATA
이상으로 증가했습니다.
|
canplay
HTMLMediaElement/canplay_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
사용자 에이전트가 미디어 데이터의 재생을 재개할 수 있지만, 지금 재생을 시작하면 콘텐츠를 추가로 버퍼링하기 위해 중지하지 않고 현재 재생 속도로 미디어 리소스 끝까지 렌더링할 수 없다고 판단합니다. | readyState가
새롭게 HAVE_FUTURE_DATA
이상으로 증가했습니다.
|
canplaythrough
HTMLMediaElement/canplaythrough_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
사용자 에이전트가 지금 재생을 시작하면 추가 버퍼링을 위해 중지하지 않고 현재 재생 속도로 미디어 리소스 끝까지 렌더링할 수 있다고 판단합니다. | readyState가
새롭게 HAVE_ENOUGH_DATA와
같습니다.
|
playing
HTMLMediaElement/playing_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
미디어 데이터 부족으로 재생이 일시 정지되거나 지연된 후 다시 시작할 준비가 되었습니다. | readyState가
새롭게 HAVE_FUTURE_DATA
이상이고 paused가 false이거나,
paused가 새롭게 false이고
readyState가
HAVE_FUTURE_DATA
이상입니다. 이 이벤트가 발생하더라도 요소는 여전히
잠재적으로 재생 중이 아닐 수 있습니다. 예를 들어
요소가 사용자 상호 작용을 위해 일시
정지됨 상태이거나
대역 내 콘텐츠를 위해 일시 정지됨 상태일
수
있습니다.
|
waiting
HTMLMediaElement/waiting_event 현재 모든 엔진에서 지원됩니다. Firefox6+Safari3.1+Chrome3+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ |
Event
|
다음 프레임을 사용할 수 없어 재생이 중지되었지만 사용자 에이전트는 해당 프레임을 적절한 시기에 사용할 수 있게 될 것으로 예상합니다. | readyState가
HAVE_CURRENT_DATA
이하이고 paused가 false입니다.
seeking이 true이거나
현재 재생 위치가
buffered의 어떤 범위에도
포함되지 않습니다. 다른 이유로 재생이 중지되면서도
paused가 false일 수
있지만, 이러한 이유로는 이 이벤트가 발생하지 않습니다(그리고 해당 상황이 해결되더라도 별도의
playing 이벤트도
발생하지 않습니다). 예를 들어
재생이 끝났거나, 재생이
오류로 인해 중지되었거나, 요소가
사용자 상호 작용을 위해 일시 정지됨
상태이거나
대역 내 콘텐츠를 위해 일시 정지됨
상태일 수
있습니다.
|
seeking
HTMLMediaElement/seeking_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
seeking IDL 속성이 true로
변경되었으며 사용자 에이전트가 새 위치로 탐색을 시작했습니다.
|
|
seeked
현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
현재 재생 위치가 변경된 후
seeking IDL 속성이
false로 변경되었습니다.
|
|
ended
현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
미디어 리소스의 끝에 도달하여 재생이 중지되었습니다. | currentTime이
미디어 리소스의 끝과 같고
ended가 true입니다.
|
durationchange
HTMLMediaElement/durationchange_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
duration 속성이 방금
업데이트되었습니다.
|
|
timeupdate
HTMLMediaElement/timeupdate_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
현재 재생 위치가 일반 재생의 일부로 또는 불연속적인 변경처럼 특별히 주목할 만한 방식으로 변경되었습니다. | |
play
현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
요소가 더 이상 일시 정지되어 있지 않습니다. play()
메서드가 반환된 후
또는 autoplay 속성으로
인해 재생이 시작될 때 발생합니다.
|
paused가 새롭게
false입니다.
|
pause
현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
요소가 일시 정지되었습니다. pause() 메서드가
반환된 후
발생합니다.
|
paused가 새롭게
true입니다.
|
ratechange
HTMLMediaElement/ratechange_event 현재 모든 엔진에서 지원됩니다. Firefox3.5+Safari3.1+Chrome3+
Opera10.5+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android11+ |
Event
|
defaultPlaybackRate
또는 playbackRate
속성이 방금 업데이트되었습니다.
|
|
resize
|
Event
|
videoWidth 및
videoHeight 속성 중
하나 또는 둘 모두가 방금 업데이트되었습니다.
|
미디어 요소가
video 요소이고,
readyState가
HAVE_NOTHING이
아닙니다.
|
volumechange
HTMLMediaElement/volumechange_event 현재 모든 엔진에서 지원됩니다. Firefox6+Safari3.1+Chrome3+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer9+ Firefox Android?Safari iOS3+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+ |
Event
|
volume 속성 또는
muted 속성이 변경되었습니다.
관련 속성의 setter가 반환된 후 발생합니다.
|
다음 이벤트는 source 요소에서 발생합니다.
| 이벤트 이름 | 인터페이스 | 발생 시점... |
|---|---|---|
error
|
Event
|
미디어 데이터를 가져오는 중에 오류가 발생했거나 리소스 유형이 지원되는 미디어 형식이 아닙니다. |
다음 이벤트는 AudioTrackList,
VideoTrackList 및
TextTrackList 객체에서 발생합니다.
| 이벤트 이름 | 인터페이스 | 발생 시점... |
|---|---|---|
change
현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? 현재 모든 엔진에서 지원됩니다. Firefox31+Safari7+Chrome33+
Opera?Edge79+ Edge (Legacy)18Internet Explorer아니요 Firefox Android?Safari iOS?Chrome Android?WebView Android4.4+Samsung Internet?Opera Android? 현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? |
Event
|
트랙 목록에 있는 하나 이상의 트랙이 활성화되거나 비활성화되었습니다. |
addtrack
현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? 현재 모든 엔진에서 지원됩니다. Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer11 Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ 현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? |
TrackEvent
|
트랙 목록에 트랙이 추가되었습니다. |
removetrack
AudioTrackList/removetrack_event 현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? TextTrackList/removetrack_event 현재 모든 엔진에서 지원됩니다. Firefox31+Safari7+Chrome33+
Opera20+Edge79+ Edge (Legacy)18Internet Explorer아니요 Firefox Android?Safari iOS?Chrome Android?WebView Android4.4+Samsung Internet?Opera Android20+ VideoTrackList/removetrack_event 현재 모든 엔진에서 지원됩니다. Firefox🔰 33+Safari7+Chrome🔰
37+
Opera?Edge🔰 79+ Edge (Legacy)아니요Internet Explorer10+ Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android? |
TrackEvent
|
트랙 목록에서 트랙이 제거되었습니다. |
다음 이벤트는 TextTrack 객체와
track 요소에서 발생합니다.
| 이벤트 이름 | 인터페이스 | 발생 시점... |
|---|---|---|
cuechange
HTMLTrackElement/cuechange_event 현재 모든 엔진에서 지원됩니다. Firefox68+Safari10+Chrome32+
Opera19+Edge79+ Edge (Legacy)14+Internet Explorer아니요 Firefox Android?Safari iOS?Chrome Android?WebView Android4.4.3+Samsung Internet?Opera Android19+ 현재 모든 엔진에서 지원됩니다. Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer10+ Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ |
Event
|
트랙에 있는 하나 이상의 큐가 활성 상태가 되거나 더 이상 활성 상태가 아니게 되었습니다. |
다음 이벤트는 track 요소에서 발생합니다.
| 이벤트 이름 | 인터페이스 | 발생 시점... |
|---|---|---|
error
|
Event
|
트랙 데이터를 가져오는 중에 오류가 발생했거나 리소스 유형이 지원되는 텍스트 트랙 형식이 아닙니다. |
load
|
Event
|
트랙 데이터를 가져와 성공적으로 처리했습니다. |
다음 이벤트는 TextTrackCue 객체에서 발생합니다.
| 이벤트 이름 | 인터페이스 | 발생 시점... |
|---|---|---|
enter
현재 모든 엔진에서 지원됩니다. Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer10+ Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ |
Event
|
큐가 활성 상태가 되었습니다. |
exit
현재 모든 엔진에서 지원됩니다. Firefox31+Safari6+Chrome23+
Opera12.1+Edge79+ Edge (Legacy)12+Internet Explorer10+ Firefox Android?Safari iOS7+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+ |
Event
|
큐가 더 이상 활성 상태가 아닙니다. |
video 및
audio
요소의 주요 보안 및 개인정보 보호 문제는 교차 출처 미디어를 삽입할 수 있다는 점에서 발생합니다.
위협은 적대적인 콘텐츠에서 피해 페이지로, 그리고 적대적인 페이지에서 피해 콘텐츠로 두 방향으로
흐를 수 있습니다.
피해 페이지가 적대적인 콘텐츠를 삽입하는 경우 위협은 해당 콘텐츠가 콘텐츠를 삽입한
Document와 상호
작용하려는 스크립트 코드를 포함할 수 있다는 것입니다. 이를 방지하기 위해 사용자 에이전트는
콘텐츠에서 삽입 페이지로 접근할 수 없도록 해야 합니다. DOM 개념을 사용하는 미디어 콘텐츠의 경우
삽입된 콘텐츠는 자체적인 서로 관련 없는
최상위 탐색 가능 항목에 있는
것처럼
취급해야 합니다.
예를 들어 SVG 애니메이션이 video
요소에 삽입된 경우 사용자 에이전트는 해당 애니메이션에 외부 페이지의 DOM에 대한 접근 권한을
부여하지 않습니다. SVG 리소스 내 스크립트의 관점에서 SVG 파일은 부모가 없는 단독 최상위 탐색 가능
항목에 있는 것처럼 보입니다.
적대적인 페이지가 피해 콘텐츠를 삽입하는 경우 위협은 삽입 페이지가 원래는 접근할 수 없었던
정보를 콘텐츠에서 얻을 수 있다는 것입니다. API는 미디어의 존재, 유형, 재생 시간, 크기 및 호스트의
성능 특성과 같은 일부 정보를 노출합니다. 이러한 정보도 잠재적으로 문제가 될 수 있지만 실제로는
img 요소를
사용하여 거의 동일한 정보를 얻을 수 있으므로 허용 가능한 것으로 간주되었습니다.
그러나 사용자 에이전트가 자막과 같은 콘텐츠 내부의 메타데이터를 추가로 노출한다면 훨씬 더 민감한
정보를 얻을 수 있습니다. 따라서 해당 정보는 비디오 리소스가 CORS를 사용하는 경우에만 노출됩니다.
crossorigin
속성을 사용하면 작성자가 CORS를 활성화할 수 있습니다. [FETCH]
이 제한이 없다면 공격자는 기업 네트워크 내부에서 실행 중인 사용자를 속여 기업 인트라넷에서 이전에 유출된 위치의 비디오를 로드하려는 사이트를 방문하게 할 수 있습니다. 이러한 비디오에 신제품에 대한 기밀 계획이 포함되어 있다면 자막을 읽을 수 있는 것은 심각한 기밀성 침해로 이어질 수 있습니다.
이 절은 비규범적입니다.
셋톱 박스나 휴대전화와 같은 소형 기기에서 오디오 및 비디오 리소스를 재생하는 작업은
기기의 제한된 하드웨어 리소스로 인해 제약되는 경우가 많습니다. 예를 들어 기기가 동시에
세 개의 비디오만 지원할 수도 있습니다. 이러한 이유로 재생이 끝난 미디어
요소가 보유한 리소스를 해제하는 것이 좋습니다. 이를 위해
요소에 대한 모든 참조를 매우 주의 깊게 제거하고 가비지 컬렉션되도록 하거나, 더 나은 방법으로는
요소의 src
속성을 빈 문자열로 설정할 수 있습니다. srcObject가
설정된 경우에는 대신 srcObject를
null로 설정합니다.
마찬가지로 재생 속도가 정확히 1.0이 아닌 경우 하드웨어, 소프트웨어 또는 형식의 제한으로 인해 비디오 프레임이 누락되고 오디오가 끊기거나 음소거될 수 있습니다.
이 절은 비규범적입니다.
미디어 요소 API의 여러 측면이 얼마나 정확하게 구현되는지는 구현 품질 문제로 간주됩니다.
예를 들어 buffered
속성을 구현할 때,
구현이 버퍼링된 범위를 얼마나 정밀하게 보고하는지는 사용자 에이전트가 데이터를 얼마나 세심하게
검사하는지에 따라 달라집니다. API는 범위를 시간으로 보고하지만 데이터는 바이트 스트림으로
얻어지므로, 가변 비트 전송률 스트림을 수신하는 사용자 에이전트는 실제로 모든 데이터를 디코딩해야만
정확한 시간을 결정할 수 있을지도 모릅니다. 그러나 사용자 에이전트가 반드시 그렇게 해야 하는 것은
아닙니다. 대신 추정값(예: 지금까지 관찰한 평균 비트 전송률에 기반한 값)을 반환하고, 더 많은 정보를
사용할 수 있게 되면 이를 수정할 수 있습니다.
일반적으로 사용자 에이전트는 낙관적이기보다는 보수적으로 동작하는 것이 좋습니다. 예를 들어 모든 것이 버퍼링되지 않았는데도 모두 버퍼링되었다고 보고하는 것은 바람직하지 않습니다.
또 다른 구현 품질 문제는 코덱이 정방향 재생만을 위해 설계된 경우 비디오를 역방향으로 재생하는 것입니다(예: 키 프레임이 많지 않고 서로 멀리 떨어져 있으며, 중간 프레임은 이전 프레임과의 차이만을 포함하는 경우). 사용자 에이전트는 키 프레임만 표시하는 등 품질이 낮게 구현할 수도 있습니다. 그러나 더 나은 구현은 더 많은 작업을 수행하여 더 높은 품질을 제공할 수 있습니다. 예를 들어 실제로 비디오의 일부를 정방향으로 디코딩하고, 완전한 프레임을 저장한 뒤, 해당 프레임을 역방향으로 재생할 수 있습니다.
마찬가지로 구현은 언제든 버퍼링된 데이터를 폐기할 수 있지만(사용자 에이전트가 미디어 요소의 수명 동안 얻은 모든 미디어 데이터를 유지해야 한다는 요구 사항은 없습니다), 이 또한 구현 품질의 문제입니다. 모든 데이터를 유지할 수 있는 충분한 리소스가 있는 사용자 에이전트는 더 나은 사용자 경험을 제공할 수 있으므로 그렇게 하는 것이 좋습니다. 예를 들어 사용자가 라이브 스트림을 시청하는 경우 사용자 에이전트는 사용자가 라이브 비디오만 볼 수 있도록 할 수도 있습니다. 그러나 더 나은 사용자 에이전트라면 모든 내용을 버퍼링하여 사용자가 이전 자료를 탐색하고, 일시 정지하고, 정방향과 역방향으로 재생할 수 있도록 합니다.
일시 정지된 미디어 요소가 문서에서 제거되고, 다음에 이벤트 루프가 1단계에 도달하기 전에 다시 삽입되지 않은 경우, 리소스가 제한된 구현은 이 기회를 이용하여 미디어 요소가 사용하는 모든 하드웨어 리소스(예: 비디오 평면, 네트워크 리소스 및 데이터 버퍼)를 해제하는 것이 좋습니다. (다만 사용자 에이전트는 나중에 재생이 다시 시작될 경우를 대비해 재생 위치 등을 계속 추적해야 합니다.)
map
요소현재 모든 엔진에서 지원됩니다.
현재 모든 엔진에서 지원됩니다.
name — usemap 속성에서
참조할 이미지 맵의 이름
[Exposed =Window ]
interface HTMLMapElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , Reflect ] attribute DOMString name ;
[SameObject ] readonly attribute HTMLCollection areas ;
};
map 요소는
img 요소 및 그 하위의
모든 area 요소와 함께
이미지 맵을 정의합니다. 이 요소는
자신의 자식을 나타냅니다.
name 속성은
맵을 참조할 수 있도록 맵에 이름을
부여합니다. 이 속성은 반드시 존재해야 하며, ASCII 공백이
없는 비어 있지 않은 값을 가져야 합니다.
name 속성의 값은 같은
트리에 있는 다른
map 요소의 name 속성 값과 같아서는
안 됩니다. id
속성도 지정된 경우 두 속성은 같은 값을 가져야 합니다.
map.areasmap 안의
area 요소로
구성된 HTMLCollection을
반환합니다.
areas
속성은 map 요소를
루트로 하고 필터가 area 요소에만 일치하는
HTMLCollection을
반환해야 합니다.
유지 관리를 쉽게 하기 위해 이미지 맵은 페이지의 다른 콘텐츠와 함께 정의할 수 있습니다. 다음 예는 페이지 상단에 이미지 맵이 있고 하단에 이에 대응하는 텍스트 링크 집합이 있는 페이지입니다.
<!DOCTYPE HTML>
< HTML LANG = "EN" >
< TITLE > Babies™: Toys</ TITLE >
< HEADER >
< H1 > Toys</ H1 >
< IMG SRC = "/images/menu.gif"
ALT = "Babies™ navigation menu. Select a department to go to its page."
USEMAP = "#NAV" >
</ HEADER >
...
< FOOTER >
< MAP NAME = "NAV" >
< P >
< A HREF = "/clothes/" > Clothes</ A >
< AREA ALT = "Clothes" COORDS = "0,0,100,50" HREF = "/clothes/" > |
< A HREF = "/toys/" > Toys</ A >
< AREA ALT = "Toys" COORDS = "100,0,200,50" HREF = "/toys/" > |
< A HREF = "/food/" > Food</ A >
< AREA ALT = "Food" COORDS = "200,0,300,50" HREF = "/food/" > |
< A HREF = "/books/" > Books</ A >
< AREA ALT = "Books" COORDS = "300,0,400,50" HREF = "/books/" >
</ P >
</ MAP >
</ FOOTER >
area
요소현재 모든 엔진에서 지원됩니다.
현재 모든 엔진에서 지원됩니다.
현재 모든 엔진에서 지원됩니다.
현재 모든 엔진에서 지원됩니다.
map
요소가 있는 경우에만 해당합니다.alt — 이미지를 사용할 수
없을 때 사용할 대체 텍스트
coords —
이미지 맵에 생성할 도형의 좌표
shape —
이미지 맵에 생성할 도형의 종류
href —
하이퍼링크의 주소
target —
하이퍼링크
탐색을 위한
탐색 가능 항목
download —
리소스로 탐색하는 대신 다운로드할지 여부 및 다운로드할 경우의 파일 이름
ping — ping할
URL
rel —
하이퍼링크를 포함하는 문서 내 위치와
대상 리소스 사이의 관계
referrerpolicy
— 요소가 시작한 가져오기에 사용할
리퍼러 정책
hreflang —
연결된 리소스의 언어
type —
참조된 리소스 유형에 대한 힌트
href 속성이 있는 경우:
작성자용;
구현자용.
href를 포함하는
미분류.
[Exposed =Window ]
interface HTMLAreaElement : HTMLElement {
[HTMLConstructor ] constructor ();
[CEReactions , Reflect ] attribute DOMString alt ;
[CEReactions , Reflect ] attribute DOMString coords ;
[CEReactions , Reflect ] attribute DOMString shape ;
[CEReactions , Reflect ] attribute DOMString download ;
[CEReactions , Reflect ] attribute USVString ping ;
[CEReactions , Reflect ] attribute DOMString rel ;
[SameObject , PutForwards =value , Reflect="rel"] readonly attribute DOMTokenList relList ;
[CEReactions ] attribute DOMString referrerPolicy ;
// also has obsolete members
};
HTMLAreaElement includes HyperlinkElementUtils ;
HTMLAreaElement includes HTMLHyperlinkElementUtils ;
area 요소는 일부 텍스트와
이미지 맵의 대응하는 영역이 있는 하이퍼링크
또는 이미지 맵의 비활성 영역을 나타냅니다.
부모 노드가 있는 area
요소에는 조상으로 map 요소가 있어야 합니다.
area 요소에
href
속성이 있다면 area
요소는 하이퍼링크를 나타냅니다. 이 경우
alt 속성이
있어야 합니다. 이 속성은 하이퍼링크의 텍스트를 지정합니다. 그 값은 이미지 맵의 다른 하이퍼링크에
지정된 텍스트 및 이미지의
대체 텍스트와 함께 표시되되 이미지 자체는 표시되지 않을 때, 해당 하이퍼링크의 텍스트 없이 그
모양이 이미지에 적용된 상태로 사용했을 때와 동일한 종류의 선택지를 사용자에게 제공하는
텍스트여야 합니다. 같은 이미지 맵 안에 같은 리소스를 가리키며
비어 있지 않은 alt 속성을 가진 다른
area 요소가
있다면 alt 속성을 비워 둘 수 있습니다.
area 요소에
href
속성이 없다면 해당 요소가 나타내는 영역은 선택할 수 없으며, alt 속성을 생략해야 합니다.
두 경우 모두 shape 및
coords 속성이
영역을 지정합니다.
shape
속성은 다음 키워드와 상태를 갖는 열거형 속성입니다.
| 키워드 | 적합 | 상태 | 간략한 설명 |
|---|---|---|---|
circle
|
원 상태 | coords 속성에
정확히
세 개의 정수를 사용하여 원을 지정합니다.
|
|
circ
|
아니요 | ||
default
|
기본 상태 | 이 영역은 이미지 전체입니다. (coords
속성은 사용되지 않습니다.)
|
|
poly
|
다각형 상태 | coords 속성에
최소
여섯 개의 정수를 사용하여 다각형을 지정합니다.
|
|
polygon
|
아니요 | ||
rect
|
직사각형 상태 | coords 속성에
정확히
네 개의 정수를 사용하여 직사각형을 지정합니다.
|
|
rectangle
|
아니요 |
이 속성의 누락 값 기본값과 유효하지 않은 값 기본값은 모두 직사각형 상태입니다.
coords
속성이 지정된 경우 유효한 부동 소수점 숫자 목록을
포함해야 합니다. 이 속성은 shape 속성이 설명하는
도형의 좌표를 제공합니다. 이 속성의 처리는 이미지 맵 처리 모델의 일부로 설명됩니다.
원 상태에서
area 요소는
세 개의 정수를 가진 coords 속성을
반드시 가져야 하며, 마지막 정수는 음수가 아니어야 합니다. 첫 번째 정수는 이미지의 왼쪽 가장자리에서
원의 중심까지의 거리를 CSS
픽셀 단위로 나타내야 하고, 두 번째 정수는
이미지의 위쪽 가장자리에서 원의 중심까지의 거리를 CSS 픽셀 단위로 나타내야 하며, 세 번째 정수는 원의 반지름을 역시
CSS 픽셀 단위로
나타내야 합니다.
기본 상태에서
area 요소는
coords
속성을 가져서는 안 됩니다. (영역은 이미지 전체입니다.)
다각형 상태에서
area 요소는
최소 여섯 개의 정수를 가진 coords 속성을
반드시 가져야 하며, 정수의 개수는 짝수여야 합니다. 각 정수 쌍은 각각 이미지의 왼쪽과 위쪽으로부터의
거리를 CSS 픽셀
단위로 나타낸 좌표를 표현해야 하며,
모든 좌표는 순서대로 다각형의 점을 나타내야 합니다.
직사각형 상태에서
area 요소는
정확히 네 개의 정수를 가진 coords 속성을
반드시 가져야 하며, 첫 번째 정수는 세 번째 정수보다 작고 두 번째 정수는 네 번째 정수보다 작아야
합니다. 네 값은 각각 이미지의 왼쪽 가장자리에서 직사각형의 왼쪽 면까지의 거리, 위쪽 가장자리에서
위쪽 면까지의 거리, 왼쪽 가장자리에서 오른쪽 면까지의 거리, 위쪽 가장자리에서 아래쪽 면까지의
거리를 모두 CSS
픽셀 단위로 나타내야 합니다.
사용자 에이전트가 사용자가 area 요소를 사용하여
생성한 하이퍼링크를 따라가거나
하이퍼링크를 다운로드하도록 허용할 때,
href,
target,
download 및
ping 속성이 링크를 따라가는 방식을
결정합니다. rel 속성은 사용자가
링크를 따라가기 전에 대상 리소스의 예상되는 성격을 사용자에게 나타내는 데 사용할 수 있습니다.
href 속성이
없다면 target,
download,
ping,
rel,
referrerpolicy,
hreflang 및
type 속성을
생략해야 합니다.
itemprop
속성이 area 요소에 지정된 경우
href 속성도
지정해야 합니다.
HTMLAreaElement/referrerPolicy
현재 모든 엔진에서 지원됩니다.
IDL 속성 referrerPolicy는 referrerpolicy
콘텐츠 속성을 알려진 값으로만
제한하여
반영해야 합니다.
이미지 맵을 사용하면 이미지의 기하학적 영역을 하이퍼링크와 연결할 수 있습니다.
img 요소 형태의 이미지는
해당 img 요소에
usemap 속성을 지정하여
map 요소 형태의 이미지 맵과
연결할 수 있습니다. usemap 속성이 지정된
경우 해당 속성은 map 요소에 대한
유효한 해시 이름 참조여야
합니다.
다음과 같은 이미지를 살펴보겠습니다.

색칠된 영역만 클릭할 수 있도록 하려면 다음과 같이 할 수 있습니다.
< p >
Please select a shape:
< img src = "shapes.png" usemap = "#shapes"
alt = "Four shapes are available: a red hollow box, a green circle, a blue triangle, and a yellow four-pointed star." >
< map name = "shapes" >
< area shape = rect coords = "50,50,100,100" > <!-- the hole in the red box -->
< area shape = rect coords = "25,25,125,125" href = "red.html" alt = "Red box." >
< area shape = circle coords = "200,75,50" href = "green.html" alt = "Green circle." >
< area shape = poly coords = "325,25,262,125,388,125" href = "blue.html" alt = "Blue triangle." >
< area shape = poly coords = "450,25,435,60,400,75,435,90,450,125,465,90,500,75,465,60"
href = "yellow.html" alt = "Yellow star." >
</ map >
</ p >
img 요소에
usemap
속성이 지정된 경우 사용자 에이전트는 다음과 같이 처리해야 합니다.
해당 요소를 컨텍스트 노드로 사용하여 map 요소에 대한
해시 이름 참조 파싱 규칙으로
속성 값을 파싱합니다. 그러면 요소(map) 또는 null이 반환됩니다.
null이 반환되었다면 반환합니다. 결국 이미지는 이미지 맵과 연결되지 않은 것입니다.
그렇지 않다면 사용자 에이전트는 map의 하위 요소인 모든 area 요소를
수집해야 합니다. 이 목록을 areas라고 합니다.
이미지 맵을 구성하는 area
요소 목록
(areas)을 얻은 뒤, 대화형 사용자 에이전트는 이 목록을 두 가지 방법 중 하나로 처리해야
합니다.
사용자 에이전트가 img 요소가
나타내는 텍스트를 표시하려는 경우 다음 단계를 사용해야 합니다.
areas에 href
속성 값이 같고 비어 있지 않은 alt 속성을 가진
다른 area 요소가
있는 경우, alt
속성이 없거나
alt 속성 값이
빈 문자열인 모든 area
요소를
areas에서 제거합니다.
areas에 남아 있는 각 area 요소는
하이퍼링크를 나타냅니다.
이러한 모든 하이퍼링크는 img의 텍스트와
연결된 방식으로 사용자에게 제공하는 것이 좋습니다.
이 컨텍스트에서 사용자 에이전트는 area 및
img 요소에
alt 속성이 지정되지 않았거나, 해당 alt 속성이 빈 문자열 또는
그 밖의 보이지 않는 텍스트인 경우, 적절한 작성자 제공 텍스트가 없음을 나타내기 위한
구현
정의 방식으로 해당 요소를 나타낼 수 있습니다.
사용자 에이전트가 이미지를 표시하고 이미지와의 상호 작용을 통해 하이퍼링크를 선택할 수 있도록
하려는 경우, 이미지는 areas에 있는 area 요소에서
가져온 계층화된 도형 집합과 연결되어야 합니다. 도형은 역순
트리 순서로
배치됩니다. 따라서 map에서 마지막으로 지정된 area 요소가
가장 아래쪽 도형이 되고, map에서
트리 순서상
첫 번째 요소가 가장 위쪽 도형이 됩니다.
areas의 각 area 요소는
이미지 위에 계층화할 도형을 얻기 위해 다음과 같이 처리해야 합니다.
요소의 shape 속성이
나타내는 상태를 찾습니다.
요소의 coords 속성이
존재한다면 부동 소수점 숫자
목록 파싱 규칙을 사용하여 파싱하고, 결과를 coords 목록이라고 합니다.
속성이 없다면 coords 목록을 빈 목록으로 설정합니다.
다음 표에 따라 coords 목록의 항목 수가 area 요소의
현재 상태에 주어진 최소 항목 수보다 적다면 도형은 비어 있습니다. 반환합니다.
| 상태 | 최소 항목 수 |
|---|---|
| 원 상태 | 3 |
| 기본 상태 | 0 |
| 다각형 상태 | 6 |
| 직사각형 상태 | 4 |
shape 속성의
상태에 해당하는 다음 목록의 항목에 따라 coords 목록에서 초과 항목을 검사합니다.
shape 속성이
직사각형 상태를 나타내고 목록의 첫
번째
숫자가 세 번째 숫자보다 수치상 크다면 두 숫자를 서로 바꿉니다.
shape 속성이
직사각형 상태를 나타내고 목록의 두
번째
숫자가 네 번째 숫자보다 수치상 크다면 두 숫자를 서로 바꿉니다.
shape 속성이
원 상태를 나타내고 목록의
세 번째
숫자가 0 이하라면 도형은 비어 있습니다. 반환합니다.
이제 요소가 나타내는 도형은 shape 속성의
상태에 대응하는 다음 목록의 항목에 설명된 도형입니다.
x를 coords의 첫 번째 숫자, y를 두 번째 숫자, r을 세 번째 숫자라고 합니다.
도형은 중심이 이미지의 왼쪽 가장자리에서 x CSS 픽셀, 이미지의 위쪽 가장자리에서 y CSS 픽셀 떨어져 있고, 반지름이 r CSS 픽셀인 원입니다.
도형은 이미지 전체를 정확히 덮는 직사각형입니다.
xi를 coords의 (2i)번째 항목으로, yi를 coords의 (2i+1)번째 항목으로 설정합니다 (coords의 첫 번째 항목 인덱스는 0입니다).
좌표를 (xi, yi)로 설정합니다. 이는 이미지의 왼쪽 위를 기준으로 측정한 CSS 픽셀 단위로 해석하며, coords의 항목 수를 N이라고 할 때 0부터 (N/2)-1까지의 모든 정수 i 값에 대해 적용합니다.
도형은 꼭짓점이 좌표로 주어지고 내부가 짝수-홀수 규칙을 사용하여 설정되는 다각형입니다. [GRAPHICS]
x1을 coords의 첫 번째 숫자, y1을 두 번째 숫자, x2를 세 번째 숫자, y2를 네 번째 숫자라고 합니다.
도형은 왼쪽 위 모서리가 좌표 (x1, y1)로 주어지고 오른쪽 아래 모서리가 좌표 (x2, y2)로 주어지는 직사각형입니다. 해당 좌표는 이미지의 왼쪽 위 모서리를 기준으로 한 CSS 픽셀로 해석됩니다.
역사적인 이유로 좌표는 CSS 'width' 및
'height' 속성으로 인해 늘어난 후의
표시된 이미지를 기준으로 해석해야 합니다. CSS를 지원하지 않는 브라우저에서는 이미지
요소의 width 및 height 속성을 기준으로 합니다. CSS 브라우저는
이러한 속성을 앞서 언급한 CSS 속성에 매핑합니다.
브라우저 확대/축소 기능과 CSS 또는 SVG를 사용해 적용한 변환은 좌표에 영향을 주지 않습니다.
위 알고리즘에 따라 계층화된 도형 집합과 연결된 이미지와 포인팅 장치가 상호 작용할 때, 관련 사용자 상호 작용 이벤트는 포인팅 장치가 가리킨 지점을 덮는 가장 위쪽 도형이 있다