W3C DOM4
W3C Last Call Working Draft
- This version:
- http://www.w3.org/TR/2014/WD-dom-20140204/
- Latest published version:
- http://www.w3.org/TR/dom/
- Latest editor's draft:
- http://w3c.github.io/dom/
- Bug tracker:
- file a bug (open bugs)
- Previous version:
- http://www.w3.org/TR/2013/WD-dom-20131107/
- Editors:
- Anne van Kesteren, Mozilla (Upstream WHATWG version)
- Aryeh Gregor, Mozilla (Upstream WHATWG version)
- Ms2ger, Mozilla (Upstream WHATWG version)
- Alex Russell, Google
- Robin Berjon, W3C
Copyright © 2014 W3C® (MIT, ERCIM, Keio, Beihang), Some Rights Reserved: this document is dual-licensed, CC-BY and W3C Document License. W3C liability, trademark and document use rules apply.
Abstract
DOM defines a platform-neutral model for events and document nodes.
Status of This Document
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.
This document is published as a snapshot of the DOM Living Standard.
This document was published by the HTML Working Group as a Last Call Working Draft. This document is intended to become a W3C Recommendation. If you wish to make comments regarding this document, please send them to www-dom@w3.org (subscribe, archives). The Last Call period ends 04 March 2014. All comments are welcome.
Publication as a Last Call Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This is a Last Call Working Draft and thus the Working Group has determined that this document has satisfied the relevant technical requirements and is sufficiently stable to advance through the Technical Recommendation process.
This document was produced by a group operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
Table of Contents
- Goals
- 1 Conformance
- 2 Terminology
- 3 Errors
- 4 Events
- 5 Nodes
- 5.1 Introduction to "The DOM"
- 5.2 Node tree
- 5.3 Mutation observers
- 5.4 Interface
Node - 5.5 Interface
Document - 5.6 Interface
DocumentFragment - 5.7 Interface
DocumentType - 5.8 Interface
Element - 5.9 Interface
CharacterData - 5.10 Interface
Text - 5.11 Interface
ProcessingInstruction - 5.12 Interface
Comment
- 6 Ranges
- 7 Traversal
- 8 Sets
- 9 Historical
- References
- Acknowledgments
Goals
This specification standardizes the DOM. It does so as follows:
-
By consolidating DOM Level 3 Core [DOM3CORE], Element Traversal [ELEMENTTRAVERSAL], Selectors API Level 2 [SELECTORSAPI], the "DOM Event Architecture" and "Basic Event Interfaces" chapters of DOM Level 3 Events [DOM3EVENTS] (specific type of events do not belong in the base specification), and DOM Level 2 Traversal and Range [DOM2TR], and:
- Aligning them with the needs of JavaScript where possible.
- Aligning them with existing implementations.
- Simplifying them as much as possible.
By moving features from HTML5 that ought to be part of the DOM platform here, while preventing a dependency on HTML5. [HTML]
-
By defining a replacement for the "Mutation Events" and "Mutation Name Event Types" chapters of DOM Level 3 Events [DOM3EVENTS] as the old model was problematic.
The old model is expected to be removed from implementations in due course.
By defining new features that simplify common DOM operations.
1 Conformance
All diagrams, examples, and notes in this specification are non-normative, as are all sections explicitly marked non-normative. Everything else in this specification is normative.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119. For readability, these words do not appear in all uppercase letters in this specification. [RFC2119]
Requirements phrased in the imperative as part of algorithms (such as "strip any leading space characters" or "return false and terminate these steps") are to be interpreted with the meaning of the key word ("must", "should", "may", etc) used in introducing the algorithm.
Conformance requirements phrased as algorithms or specific steps may be implemented in any manner, so long as the end result is equivalent. (In particular, the algorithms defined in this specification are intended to be easy to follow, and not intended to be performant.)
User agents may impose implementation-specific limits on otherwise unconstrained inputs, e.g. to prevent denial of service attacks, to guard against running out of memory, or to work around platform-specific limitations.
When a method or an attribute is said to call another method or attribute, the user agent must invoke its internal API for that attribute or method so that e.g. the author can't change the behavior by overriding attributes or methods with custom properties or functions in JavaScript.
Unless otherwise stated, string comparisons are done in a case-sensitive manner.
1.1 Dependencies
The IDL fragments in this specification must be interpreted as required for conforming IDL fragments, as described in the Web IDL specification. [WEBIDL]
Some of the terms used in this specification are defined in Encoding, Selectors, Web IDL, XML, and Namespaces in XML. [ENCODING] [SELECTORS] [WEBIDL] [XML] [XMLNS]
1.2 Extensibility
Vendor-specific proprietary extensions to this specification are strongly discouraged. Authors must not use such extensions, as doing so reduces interoperability and fragments the user base, allowing only users of specific user agents to access the content in question.
If vendor-specific extensions are needed, the members should be prefixed by vendor-specific strings to prevent clashes with future versions of this specification. Extensions must be defined so that the use of extensions neither contradicts nor causes the non-conformance of functionality defined in the specification.
When vendor-neutral extensions to this specification are needed, either this specification can be updated accordingly, or an extension specification can be written that overrides the requirements in this specification. When someone applying this specification to their activities decides that they will recognize the requirements of such an extension specification, it becomes an applicable specification for the purposes of conformance requirements in this specification.
2 Terminology
The term context object means the object on which the algorithm, attribute getter, attribute setter, or method being discussed was called. When the context object is unambiguous, the term can be omitted.
2.1 Trees
A tree is a finite hierarchical tree structure. In tree order is preorder, depth-first traversal of a tree.
An object that participates in a tree has a parent, which is either another object or null, and an ordered list of zero or more child objects. An object A whose parent is object B is a child of B.
The root of an object is itself, if its parent is null, or else it is the root of its parent.
An object A is called a descendant of an object B, if either A is a child of B or A is a child of an object C that is a descendant of B.
An inclusive descendant is an object or one of its descendants.
An object A is called an ancestor of an object B if and only if B is a descendant of A.
An inclusive ancestor is an object or one of its ancestors.
An object A is called a sibling of an object B, if and only if B and A share the same non-null parent.
An object A is preceding an object B if A and B are in the same tree and A comes before B in tree order.
An object A is following an object B if A and B are in the same tree and A comes after B in tree order.
The first child of an object is its first child or null if it has no child.
The last child of an object is its last child or null if it has no child.
The previous sibling of an object is its first preceding sibling or null if it has no preceding sibling.
The next sibling of an object is its first following sibling or null if it has no following sibling.
The index of an object is its number of preceding siblings.
2.2 Strings
Comparing two strings in a case-sensitive manner means comparing them exactly, code point for code point.
Comparing two strings in a ASCII case-insensitive manner means comparing them exactly, code point for code point, except that the characters in the range U+0041 .. U+005A (i.e. LATIN CAPITAL LETTER A to LATIN CAPITAL LETTER Z) and the corresponding characters in the range U+0061 .. U+007A (i.e. LATIN SMALL LETTER A to LATIN SMALL LETTER Z) are considered to also match.
Converting a string to ASCII uppercase means replacing all characters in the range U+0061 to U+007A (i.e. LATIN SMALL LETTER A to LATIN SMALL LETTER Z) with the corresponding characters in the range U+0041 to U+005A (i.e. LATIN CAPITAL LETTER A to LATIN CAPITAL LETTER Z).
Converting a string to ASCII lowercase means replacing all characters in the range U+0041 to U+005A (i.e. LATIN CAPITAL LETTER A to LATIN CAPITAL LETTER Z) with the corresponding characters in the range U+0061 to U+007A (i.e. LATIN SMALL LETTER A to LATIN SMALL LETTER Z).
A string pattern is a prefix match for a string s when pattern is not longer than s and truncating s to pattern's length leaves the two strings as matches of each other.
2.3 Ordered sets
The ordered set parser takes a string input and then runs these steps:
Let position be a pointer into input, initially pointing at the start of the string.
Let tokens be an ordered set of tokens, initially empty.
While position is not past the end of input:
Collect a code point sequence of code points that are not ASCII whitespace.
If the collected string is not in tokens, append the collected string to tokens.
Return tokens.
To collect a code point sequence of code points, run these steps:
Let input and position be the same variables as those of the same name in the algorithm that invoked these steps.
Let result be the empty string.
While position does not point past the end of input and the code point at position is one of code points, append that code point to the end of result and advance position to the next code point in input.
Return result.
To skip ASCII whitespace means to collect a code point sequence of ASCII whitespace and discard the return value.
The ordered set serializer takes a set and returns the concatenation of the strings in set, separated from each other by U+0020.
2.4 Namespaces
The HTML namespace is
http://www.w3.org/1999/xhtml.
The XML namespace is
http://www.w3.org/XML/1998/namespace.
The XMLNS namespace is
http://www.w3.org/2000/xmlns/.
3 Errors
exception DOMException {
const unsigned short INDEX_SIZE_ERR = 1;
const unsigned short DOMSTRING_SIZE_ERR = 2; // historical
const unsigned short HIERARCHY_REQUEST_ERR = 3;
const unsigned short WRONG_DOCUMENT_ERR = 4;
const unsigned short INVALID_CHARACTER_ERR = 5;
const unsigned short NO_DATA_ALLOWED_ERR = 6; // historical
const unsigned short NO_MODIFICATION_ALLOWED_ERR = 7;
const unsigned short NOT_FOUND_ERR = 8;
const unsigned short NOT_SUPPORTED_ERR = 9;
const unsigned short INUSE_ATTRIBUTE_ERR = 10; // historical
const unsigned short INVALID_STATE_ERR = 11;
const unsigned short SYNTAX_ERR = 12;
const unsigned short INVALID_MODIFICATION_ERR = 13;
const unsigned short NAMESPACE_ERR = 14;
const unsigned short INVALID_ACCESS_ERR = 15;
const unsigned short VALIDATION_ERR = 16; // historical
const unsigned short TYPE_MISMATCH_ERR = 17; // historical; use JavaScript's TypeError instead
const unsigned short SECURITY_ERR = 18;
const unsigned short NETWORK_ERR = 19;
const unsigned short ABORT_ERR = 20;
const unsigned short URL_MISMATCH_ERR = 21;
const unsigned short QUOTA_EXCEEDED_ERR = 22;
const unsigned short TIMEOUT_ERR = 23;
const unsigned short INVALID_NODE_TYPE_ERR = 24;
const unsigned short DATA_CLONE_ERR = 25;
unsigned short code;
};
The code exception
field must return the value it was initialized to.
To throw a name exception run these steps:
Let code be zero.
If name is in the first column of the error names table and has a corresponding legacy
codeexception field value in the third column, set code to that value.Throw a new
DOMExceptionexception, whose message is a user agent-defined value, name is name, and whosecodeexception field is code.
To
throw a "TimeoutError" exception, a
user agent would construct a DOMException exception whose
name is
"TimeoutError" and
code exception field value is 23,
and actually throw that object as an exception. In JavaScript, this
exception will have a name property whose value is
"TimeoutError".
[Constructor(DOMString name, optional DOMString message = "")] interface DOMError { readonly attribute DOMString name; readonly attribute DOMString message; };
DOMError might be nuked in favor of using
DOMException exclusively. See Creating your own errors
on es-discuss for more details.
This interface is intended for other specifications that want to introduce error handling through other means than exceptions. As with exceptions, the error names table is used.
The DOMError(name, message)
constructor must return a new DOMError object whose
name attribute is initialized to
name and whose message attribute
is initialized to message.
The name attribute must
return the value it was initialized to.
The message attribute must
return the value it was initialized to.
The value of the message will
typically be implementation-dependent and for informational purposes only.
A
name DOMError
means a DOMError object whose
name attribute is initialized to
name and whose message attribute
is initialized to a helpful implementation-dependent message that explains the error.
A specification could say that an error
attribute must return a
"SyntaxError" DOMError.
3.3 Error names
The error names table below lists all the allowed error names,
a description, and legacy code
exception field values (when the error name is used for
throwing an exception).
If an error name is not listed here, please file a bug as indicated at the top of this specification and it will be addressed shortly. Thanks!
| Name | Description | Legacy code exception field value (if any)
|
|---|---|---|
"IndexSizeError"
| The index is not in the allowed range. | INDEX_SIZE_ERR (1)
|
"HierarchyRequestError"
| The operation would yield an incorrect node tree. | HIERARCHY_REQUEST_ERR (3)
|
"WrongDocumentError"
| The object is in the wrong document. | WRONG_DOCUMENT_ERR (4)
|
"InvalidCharacterError"
| The string contains invalid characters. | INVALID_CHARACTER_ERR (5)
|
"NoModificationAllowedError"
| The object can not be modified. | NO_MODIFICATION_ALLOWED_ERR (7)
|
"NotFoundError"
| The object can not be found here. | NOT_FOUND_ERR (8)
|
"NotSupportedError"
| The operation is not supported. | NOT_SUPPORTED_ERR (9)
|
"InvalidStateError"
| The object is in an invalid state. | INVALID_STATE_ERR (11)
|
"SyntaxError"
| The string did not match the expected pattern. | SYNTAX_ERR (12)
|
"InvalidModificationError"
| The object can not be modified in this way. | INVALID_MODIFICATION_ERR (13)
|
"NamespaceError"
| The operation is not allowed by Namespaces in XML. [XMLNS] | NAMESPACE_ERR (14)
|
"InvalidAccessError"
| The object does not support the operation or argument. | INVALID_ACCESS_ERR (15)
|
"SecurityError"
| The operation is insecure. | SECURITY_ERR (18)
|
"NetworkError"
| A network error occurred. | NETWORK_ERR (19)
|
"AbortError"
| The operation was aborted. | ABORT_ERR (20)
|
"URLMismatchError"
| The given URL does not match another URL. | URL_MISMATCH_ERR (21)
|
"QuotaExceededError"
| The quota has been exceeded. | QUOTA_EXCEEDED_ERR (22)
|
"TimeoutError"
| The operation timed out. | TIMEOUT_ERR (23)
|
"InvalidNodeTypeError"
| The supplied node is incorrect or has an incorrect ancestor for this operation. | INVALID_NODE_TYPE_ERR (24)
|
"DataCloneError"
| The object can not be cloned. | DATA_CLONE_ERR (25)
|
"EncodingError"
| The encoding operation (either encoded or decoding) failed. | — |
4 Events
4.1 Introduction to "DOM Events"
Throughout the web platform events are
dispatched to objects to signal an
occurrence, such as network activity or user interaction. These objects
implement the EventTarget interface and can therefore add
event listeners to observe
events:
obj.addEventListener("load", imgFetched)
function imgFetched(ev) {
// great success
…
}
Event listeners can be removed
by utilizing the
removeEventListener()
method, passing the same arguments.
Events are objects too and implement the
Event interface (or a derived interface). In the example above
ev is the event. It is
passed as argument to
event listener's callback
(typically a JavaScript Function as shown above).
Event listeners key off the
event's
type attribute value
("load" in the above example). The
event's
target attribute value returns the
object to which the event was
dispatched (obj
above).
Now while typically events are dispatched by the user agent as the result of user interaction or the completion of some task, applications can dispatch events themselves, commonly known as synthetic events:
// add an appropriate event listener
obj.addEventListener("cat", function(e) { process(e.detail) })
// create and dispatch the event
var event = new CustomEvent("cat", {"detail":{"hazcheeseburger":true}})
obj.dispatchEvent(event)
Apart from signaling, events are
sometimes also used to let an application control what happens next in an
operation. For instance as part of form submission an
event whose
type attribute value is
"submit" is
dispatched. If this
event's
preventDefault() method is
invoked, form submission will be terminated. Applications who wish to make
use of this functionality through events
dispatched by the application
(synthetic events) can make use of the return value of the
dispatchEvent() method:
if(obj.dispatchEvent(event)) {
// event was not canceled, time for some magic
…
}
When an event is dispatched to an object that participates in a tree (e.g. an element), it can reach event listeners on that object's ancestors too. First all object's ancestor event listeners whose capture variable is set to true are invoked, in tree order. Second, object's own event listeners are invoked. And finally, and only if event's bubbles attribute value is true, object's ancestor event listeners are invoked again, but now in reverse tree order.
Lets look at an example on how events work in a tree:
<!doctype html>
<html>
<head>
<title>Boring example</title>
</head>
<body>
<p>Hello <span id=x>world</span>!</p>
<script>
function test(e) {
debug(e.target, e.currentTarget, e.eventPhase)
}
document.addEventListener("hey", test, true)
document.body.addEventListener("hey", test)
var ev = new Event("hey", {bubbles:true})
document.getElementById("x").dispatchEvent(ev)
</script>
</body>
</html>
The debug function will be invoked twice. Each time
the events's
target attribute value will be the
span element. The
first time currentTarget attribute's
value will be the document, the second
time the body element.
eventPhase attribute's value
switches from CAPTURING_PHASE
to BUBBLING_PHASE. If an
event listener was registered for
the span element,
eventPhase attribute's value
would have been AT_TARGET.
4.2 Interface Event
[Constructor(DOMString type, optional EventInit eventInitDict)] interface Event { readonly attribute DOMString type; readonly attribute EventTarget? target; readonly attribute EventTarget? currentTarget; const unsigned short NONE = 0; const unsigned short CAPTURING_PHASE = 1; const unsigned short AT_TARGET = 2; const unsigned short BUBBLING_PHASE = 3; readonly attribute unsigned short eventPhase; void stopPropagation(); void stopImmediatePropagation(); readonly attribute boolean bubbles; readonly attribute boolean cancelable; void preventDefault(); readonly attribute boolean defaultPrevented; [Unforgeable] readonly attribute boolean isTrusted; readonly attribute DOMTimeStamp timeStamp; void initEvent(DOMString type, boolean bubbles, boolean cancelable); }; dictionary EventInit { boolean bubbles = false; boolean cancelable = false; };
An event allows for signaling that
something has occurred. E.g. that an image has completed downloading. It is
represented by the Event interface or an interface that
inherits from the Event interface.
var event = new Event(type [, eventInitDict])Returns a new event whose
typeattribute value is set to type. The optional eventInitDict argument allows for setting thebubblesandcancelableattributes via object members of the same name.event . typeReturns the type of event, e.g. "
click", "hashchange", or "submit".event . targetReturns the object event is dispatched to.
event . currentTargetReturns the object whose event listener's callback is invoked.
event . eventPhaseReturns the event's phase, which is one of
NONE,CAPTURING_PHASE,AT_TARGET, andBUBBLING_PHASE.event . stopPropagation()When dispatched in a tree, invoking this method prevents event from reaching any other objects than the current.
event . stopImmediatePropagation()Invoking this method prevents event from reaching any event listeners registered after the current one and when dispatched in a tree also prevents event from reaching any other objects.
event . bubblesReturns true if event's goes through its
targetattribute value's ancestors in reverse tree order, and false otherwise.event . cancelableReturns true or false depending on how event was initialized. Its return value does not always carry meaning, but true can indicate that part of the operation during which event was dispatched, can be canceled by invoking the
preventDefault()method.event . preventDefault()If invoked when the
cancelableattribute value is true, signals to the operation that caused event to be dispatched that it needs to be canceled.event . defaultPreventedReturns true if
preventDefault()was invoked while thecancelableattribute value is true, and false otherwise.event . isTrustedReturns true if event was dispatched by the user agent, and false otherwise.
event . timeStampReturns the creation time of event in the number of milliseconds that passed since 00:00:00 UTC on 1 January 1970.
The type attribute must
return the value it was initialized to. When an
event is created the attribute must be
initialized to the empty string.
The target and
currentTarget
attributes must return the values they were initialized to. When an
event is created the attributes must be
initialized to null.
The eventPhase
attribute must return the value it was initialized to, which must be one of
the following:
NONE(numeric value 0)Events not currently dispatched are in this phase.
CAPTURING_PHASE(numeric value 1)When an event is dispatched to an object that participates in a tree it will be in this phase before it reaches its
targetattribute value.AT_TARGET(numeric value 2)When an event is dispatched it will be in this phase on its
targetattribute value.BUBBLING_PHASE(numeric value 3)When an event is dispatched to an object that participates in a tree it will be in this phase after it reaches its
targetattribute value.
Initially the attribute must be initialized to
NONE.
Each event has the following associated flags that are all initially unset:
- stop propagation flag
- stop immediate propagation flag
- canceled flag
- initialized flag
- dispatch flag
The
stopPropagation()
method must set the stop propagation flag.
The
stopImmediatePropagation()
method must set both the stop propagation flag and
stop immediate propagation flag.
The bubbles and
cancelable attributes
must return the values they were initialized to. When an
event is created, they must be initialized
to false. The EventInit dictionary is not sufficient due to
the existence of the legacy
createEvent().
The
preventDefault()
method must set the canceled flag if the
cancelable attribute value is true.
The
defaultPrevented
attribute must return true if the canceled flag is set and
false otherwise.
The isTrusted attribute
must return the value it was initialized to. When an
event is created the attribute must be
initialized to false.
The timeStamp attribute
must return the value it was initialized to. When an
event is created the attribute must be
initialized to the number of milliseconds that has passed since
00:00:00 UTC on 1 January 1970.
To initialize an event, with type, bubbles, and cancelable, run these steps:
Set the initialized flag.
If the dispatch flag is set, terminate these steps.
Unset the stop propagation flag, stop immediate propagation flag, and canceled flag.
Set the
isTrustedattribute to false.Set the
targetattribute to null.Set the
typeattribute to type.Set the
bubblesattribute to bubbles.Set the
cancelableattribute to cancelable.
The
initEvent(type, bubbles, cancelable)
method must initialize the
context object with type,
bubbles, and cancelable.
As events have constructors
initEvent() is superfluous. However,
it has to be supported for legacy content.
[Constructor(DOMString type, optional CustomEventInit eventInitDict)] interface CustomEvent : Event { readonly attribute any detail; void initCustomEvent(DOMString type, boolean bubbles, boolean cancelable, any detail); }; dictionary CustomEventInit : EventInit { any detail = null; };
Events using the
CustomEvent interface can be used to carry custom data.
var event = new CustomEvent(type [, eventInitDict])Works analogously to the constructor for
Eventexcept that the optional eventInitDict argument now allows for setting thedetailattribute too.event . detailReturns any custom data event was created with. Typically used for synthetic events.
The detail attribute
must return the value it was initialized to. When an
event is created the attribute must be
initialized to null. The CustomEventInit dictionary is not
sufficient due to the existence of the legacy
createEvent().
The
initCustomEvent(type, bubbles, cancelable, detail)
method must initialize the
context object with type,
bubbles, and cancelable, and then set its
detail attribute to
detail.
4.4 Constructing events
When a constructor of the Event
interface, or of an interface that inherits from the Event interface, is
invoked, these steps must be run:
Create an event that uses the interface the constructor was invoked upon.
Set its initialized flag.
Initialize the
typeattribute to the type argument.If there is an eventInitDict argument then for each dictionary member defined therein find the attribute on event whose identifier matches the key of the dictionary member and then set the attribute to the value of that dictionary member.
Return the event.
4.5 Defining event interfaces
In general, when defining a new interface that inherits from
Event please always ask feedback from the WHATWG or the
W3C WebApps WG community.
The CustomEvent interface can be used as starting point.
However, do not introduce any init*Event()
methods as they are redundant with constructors. Interfaces that inherit
from the Event interface that have such a method only have it
for historical reasons.
interface EventTarget {
void addEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
void removeEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
boolean dispatchEvent(Event event);
};
callback interface EventListener {
void handleEvent(Event event);
};
EventTarget is an object to which an
event is
dispatched when something has
occurred. Each EventTarget has an associated list of
event listeners.
An event listener associates a callback with a specific event. Each event listener consists of a type (of the event), callback, and capture variable.
The callback is named EventListener for
historical reasons. As can be seen from the definition above, an
event listener is a more broad
concept.
target . addEventListener(type, callback [, capture = false])-
Appends an event listener for events whose
typeattribute value is type. The callback argument sets the callback that will be invoked when the event is dispatched. When set to true, the capture argument prevents callback from being invoked when the event'seventPhaseattribute value isBUBBLING_PHASE. When false, callback will not be invoked when event'seventPhaseattribute value isCAPTURING_PHASE. Either way, callback will be invoked when event'seventPhaseattribute value isAT_TARGET.The event listener is appended to target's list of event listeners and is not appended if it is a duplicate (the event listeners in the list are unique).
target . removeEventListener(type, callback [, capture = false])Remove the event listener in target's list of event listeners with the same type, callback, and capture.
target . dispatchEvent(event)Dispatches a synthetic event event to target and returns true if either event's
cancelableattribute value is false or it'spreventDefault()method was not invoked, and false otherwise.
The
addEventListener(type, callback, capture)
method must run these steps:
If callback is null, terminate these steps.
Append an event listener to the associated list of event listeners with type set to type, callback set to callback, and capture set to capture, unless there already is an event listener in that list with the same type, callback, and capture.
The
removeEventListener(type, callback, capture)
method must run these steps:
Remove an event listener from the associated list of event listeners, whose type is name, callback is callback, and capture is capture.
The
dispatchEvent(event)
method must run these steps:
If event's dispatch flag is set, or if its initialized flag is not set, throw an "
InvalidStateError" exception.Initialize event's
isTrustedattribute to false.Dispatch the event and return the value that returns.
4.7 Dispatching events
To dispatch an event to a given object, optionally with a target override, run these steps:
Let event be the event that is dispatched.
Set event's dispatch flag.
Initialize event's
targetattribute to target override, if it is given, or the object to which event is dispatched otherwise.If event's
targetattribute value is participating in a tree, let event path be a static ordered list of all its ancestors in tree order, and let event path be the empty list otherwise.Initialize event's
eventPhaseattribute toCAPTURING_PHASE.For each object in event path, invoke its event listeners with event event, as long as event's stop propagation flag is unset.
Initialize event's
eventPhaseattribute toAT_TARGET.Invoke the event listeners of event's
targetattribute value with event, if event's stop propagation flag is unset.-
If event's
bubblesattribute value is true, run these substeps:Reverse the order of event path.
Initialize event's
eventPhaseattribute toBUBBLING_PHASE.For each object in event path, invoke its event listeners, with event event as long as event's stop propagation flag is unset.
Unset event's dispatch flag.
Initialize event's
eventPhaseattribute toNONE.Initialize event's
currentTargetattribute to null.Return false if event's canceled flag is set, and true otherwise.
To invoke the event listeners for an object with an event run these steps:
Let event be the event for which the event listeners are invoked.
Let listeners be a copy of the event listeners associated with the object for which these steps are run.
Initialize event's
currentTargetattribute to the object for which these steps are run.-
Then run these substeps for each event listener in listeners:
If event's stop immediate propagation flag is set, terminate the invoke algorithm.
Let listener be the event listener.
If event's
typeattribute value is not listener's type, terminate these substeps (and run them for the next event listener).If event's
eventPhaseattribute value isCAPTURING_PHASEand listener's capture is false, terminate these substeps (and run them for the next event listener).If event's
eventPhaseattribute value isBUBBLING_PHASEand listener's capture is true, terminate these substeps (and run them for the next event listener).Call listener's callback's
handleEvent, with the event passed to this algorithm as the first argument and event'scurrentTargetattribute value as callback this value.
4.8 Firing events
To
fire an event named e
means that a new event using the
Event interface, with its
type attribute initialized to
e, and its isTrusted
attribute initialized to true, is to be
dispatched to the given object.
Fire in the context of DOM is short for creating, initializing, and
dispatching an
event.
Fire an event makes that process easier to write
down. If the event needs its bubbles or
cancelable attribute initialized, one could write
"fire an event named
submit with its cancelable attribute
initialized to true".
5 Nodes
5.1 Introduction to "The DOM"
In its original sense, "The DOM" is an API for accessing and manipulating documents (in particular, HTML and XML documents). In this specification, the term "document" is used for any markup-based resource, ranging from short static documents to long essays or reports with rich multimedia, as well as to fully-fledged interactive applications.
These documents are presented as a node tree. Some of the nodes in the tree can have children, while others are leaves.
To illustrate, consider this HTML document:
<!DOCTYPE html>
<html class=e>
<head><title>Aliens?</title></head>
<body>Why yes.</body>
</html>
It is represented as follows:
Note that, due to the magic that is
HTML parsing, not all
ASCII whitespace were turned into
Text nodes, but the general
concept is clear. Markup goes in, a tree of
nodes comes out.
The most excellent Live DOM Viewer can be used to explore this matter in more detail.
How much should be explained here? Ideas?
5.2 Node tree
Objects implementing the Document,
DocumentFragment, DocumentType,
Element, Text, ProcessingInstruction,
or Comment interface (simply called
nodes)
participate in a
tree, simply named the
node tree.
A node tree is constrained as follows, expressed as a relationship between the type of node and its allowed children:
Document-
In tree order:
Zero or more nodes each of which is either
ProcessingInstructionorComment.Optionally one
DocumentTypenode.Zero or more nodes each of which is either
ProcessingInstructionorComment.Optionally one
Elementnode.Zero or more nodes each of which is either
ProcessingInstructionorComment.
DocumentFragmentElementZero or more nodes each of which is one of
Element,ProcessingInstruction,Comment, orText.DocumentTypeTextProcessingInstructionCommentNone.
The length of a node node depends on node:
DocumentTypeZero.
TextProcessingInstructionCommentIts
lengthattribute value.- Any other node
Its number of children.
A node is considered empty if its length is zero.
5.2.1 Mutation algorithms
At certain points in the algorithms below it is said that a node is inserted or a node is removed. These are hooks for other applicable specifications to process the nodes that have been inserted or removed further and ensures that when multiple nodes are inserted or removed this happens atomically.
To pre-insert a node into a parent before a child, run these steps:
If parent is not a
Document,DocumentFragment, orElementnode, throw a "HierarchyRequestError".If node is a host-including inclusive ancestor of parent, throw a "
HierarchyRequestError".If child is not null and its parent is not parent, throw a "
NotFoundError" exception.If node is not a
DocumentFragment,DocumentType,Element,Text,ProcessingInstruction, orCommentnode, throw a "HierarchyRequestError".If either node is a
Textnode and parent is a document, or node is a doctype and parent is not a document, throw a "HierarchyRequestError".-
If parent is a document, and any of the statements below, switched on node, are true, throw a "
HierarchyRequestError".DocumentFragmentnode-
If node has more than one element child or has a
Textnode child.Otherwise, if node has one element child, and parent has an element child, child is a doctype, or child is not null and a doctype is following child.
- element
parent has an element child, child is a doctype, or child is not null and a doctype is following child.
- doctype
parent has a doctype child, an element is preceding child, or child is null and parent has an element child.
Let reference child be child.
If reference child is node, set it to node's next sibling.
Adopt node into parent's node document.
Insert node into parent before reference child.
Return node.
To insert a node into a parent before a child, optionally with a suppress observers flag, run these steps:
Let count be the number of children of node if it is a
DocumentFragmentnode, and one otherwise.For each range whose start node is parent and start offset is greater than child's index, increase its start offset by count.
For each range whose end node is parent and end offset is greater than child's index, increase its end offset by count.
Let nodes be node's children if node is a
DocumentFragmentnode, and a list containing solely node otherwise.-
If node is a
DocumentFragmentnode, queue a mutation record of "childList" for node with removedNodes nodes.This step does intentionally not pay attention to the suppress observers flag.
If node is a
DocumentFragmentnode, remove its children with the suppress observers flag set.If suppress observers flag is unset, queue a mutation record of "
childList" for parent with addedNodes nodes, nextSibling child, and previousSibling child's previous sibling or parent's last child if child is null.Insert all nodes in nodes before child or at the end of parent if child is null.
If suppress observers flag is unset, for each node in nodes, in tree order run node is inserted.
To append a node to a parent, pre-insert node into parent before null.
To replace a child with node within a parent, run these steps:
If parent is not a
Document,DocumentFragment, orElementnode, throw a "HierarchyRequestError".If node is a host-including inclusive ancestor of parent, throw a "
HierarchyRequestError".If child's parent is not parent, throw a "
NotFoundError" exception.If node is not a
DocumentFragment,DocumentType,Element,Text,ProcessingInstruction, orCommentnode, throw a "HierarchyRequestError".If either node is a
Textnode and parent is a document, or node is a doctype and parent is not a document, throw a "HierarchyRequestError".-
If parent is a document, and any of the statements below, switched on node, are true, throw a "
HierarchyRequestError".DocumentFragmentnode-
If node has more than one element child or has a
Textnode child.Otherwise, if node has one element child and either parent has an element child that is not child or a doctype is following child.
- element
parent has an element child that is not child or a doctype is following child.
- doctype
- parent has a doctype child that is not child, or an element is preceding child.
The above statements differ from the pre-insert algorithm.
Let reference child be child's next sibling.
If reference child is node, set it to node's next sibling.
Adopt node into parent's node document.
Remove child from its parent with the suppress observers flag set.
Insert node into parent before reference child with the suppress observers flag set.
Let nodes be node's children if node is a
DocumentFragmentnode, and a list containing solely node otherwise.Queue a mutation record of "
childList" for target parent with addedNodes nodes, removedNodes a list solely containing child, nextSibling reference child, and previousSibling child's previous sibling.Run node is removed for child, and then for each node in nodes, in tree order, run node is inserted.
Return child.
To replace all with a node within a parent, run these steps:
If node is not null, adopt node into parent's node document.
Let removedNodes be parent's children.
Let addedNodes be the empty list if node is null, node's children if node is a
DocumentFragmentnode, and a list containing node otherwise.Remove all parent's children, with the suppress observers flag set.
If node is not null, insert node into parent before null with the suppress observers flag set.
Queue a mutation record of "
childList" for parent with addedNodes addedNodes and removedNodes removedNodes.Run node is removed for each node in removedNodes, in tree order, and then run node is inserted for each node in addedNodes, in tree order.
This algorithm does not make any checks with regards to the node tree constraints. Use it wisely.
To pre-remove a child from a parent, run these steps:
If child's parent is not parent, throw a "
NotFoundError" exception.Remove child from parent.
Return child.
To remove a node from a parent, optionally with suppress observers flag set, run these steps:
Let index be node's index.
For each range whose start node is a descendant of node, set its start to (parent, index).
For each range whose end node is a descendant of node, set its end to (parent, index).
For each range whose start node is parent and start offset is greater than index, decrease its start offset by one.
For each range whose end node is parent and end offset is greater than index, decrease its end offset by one.
If suppress observers flag is unset, queue a mutation record of "
childList" for parent with removedNodes a list solely containing node, nextSibling node's next sibling, and previousSibling node's previous sibling.For each ancestor ancestor of node, if ancestor has any registered observers whose options's
subtreeis true, then for each such registered observer registered, append a transient registered observer whose observer and options are identical to those of registered and source which is registered to node's list of registered observers.Remove node from its parent.
If suppress observers flag is unset, run node is removed for node.
The
getElementById() method is not
on elements for compatibility with older versions of
jQuery. If a time comes where that version of jQuery has disappeared, we might be able to
support it.
[NoInterfaceObject]
interface NonElementParentNode {
Element? getElementById(DOMString elementId);
};
Document implements ParentNode;
DocumentFragment implements ParentNode;
node . getElementById(elementId)Returns the first element within node's descendants whose ID is elementId.
The
getElementById(elementId)
method must return the first element, in
tree order, within context object's
descendants, whose
ID is elementId, and null if there is no
such element otherwise.
The mutation method macro:
Let node be null.
Replace each string in nodes with a
Textnode whose data is the string value.-
If nodes contains more than one node, set node to a new
DocumentFragmentand append each node in nodes to it. If this throws an exception, re-throw the exception.Otherwise, set node to the single node nodes contains.
[NoInterfaceObject]
interface ParentNode {
readonly attribute HTMLCollection children;
readonly attribute Element? firstElementChild;
readonly attribute Element? lastElementChild;
readonly attribute unsigned long childElementCount;
void prepend((Node or DOMString)... nodes);
void append((Node or DOMString)... nodes);
Element? query(DOMString relativeSelectors);
[NewObject] Elements queryAll(DOMString relativeSelectors);
Element? querySelector(DOMString selectors);
[NewObject] NodeList querySelectorAll(DOMString selectors);
};
Document implements ParentNode;
DocumentFragment implements ParentNode;
Element implements ParentNode;
collection = node . childrenelement = node . firstElementChildReturns the first child that is an element, and null otherwise.
element = node . lastElementChildReturns the last child that is an element, and null otherwise.
node . prepend(nodes)-
Inserts nodes before the first child of node, while replacing strings in nodes with equivalent
Textnodes.Throws a "
HierarchyRequestError" if the constraints of the node tree are violated. node . append(nodes)-
Inserts nodes after the last child of node, while replacing strings in nodes with equivalent
Textnodes.Throws a "
HierarchyRequestError" if the constraints of the node tree are violated. node . query(relativeSelectors)-
Returns the first element that is a child of node that matches relativeSelectors.
node . queryAll(relativeSelectors)-
Returns all element children of node that match relativeSelectors.
node . querySelector(selectors)-
Returns the first element that is a child of node that matches selectors.
node . querySelectorAll(selectors)
The children
attribute must return an HTMLCollection
collection rooted at the
context object matching only
element
children.
The
firstElementChild
attribute must return the first child
that is an element, and null otherwise.
The
lastElementChild
attribute must return the last child
that is an element, and null otherwise.
The
childElementCount
attribute must return the number of
children of the
context object that are
elements.
The
prepend(nodes)
method must run these steps:
- Run the mutation method macro.
Pre-insert node into the context object before the context object's first child.
The
append(nodes)
method must run these steps:
- Run the mutation method macro.
Append node to the context object.
To evaluate a relative selectors string relativeSelectors against a node or a list, run these steps:
Let elementSet be node if that was given, and all elements in list, in the same order, otherwise.
Let s be the result of parse a relative selector from relativeSelectors against reference element set elementSet. [SELECTORS]
If s is failure, throw a JavaScript
TypeError.Return the result of match a selector s using scoping root e and reference element set elementSet. [SELECTORS]
The
query(relativeSelectors)
method must return the first result of running
evaluate a relative selectors string relativeSelectors
against the context object, and null if the result is an empty list.
The
queryAll(relativeSelectors)
method must return an Elements array initialized with the result of
running evaluate a relative selectors string
relativeSelectors against the context object.
To evaluate a selectors string selectors against a node, run these steps:
Let s be the result of parse a selector selectors. [SELECTORS]
If s is failure, throw a JavaScript
TypeError.Return the result of match a selector s against node's root using scoping root node. [SELECTORS].
The
querySelector(selectors)
method must return the first result of running evaluate a selectors string
selectors against the context object, and null if the result
is an empty list.
The
querySelectorAll(selectors)
method must return the static result of
running evaluate a selectors string selectors against the
context object.
The
previousElementSibling
and nextElementSibling
attributes have been removed from DocumentType nodes for compatibility
reasons. If these additions are deemed compatible enough in the future, they could be
reinstated.
[NoInterfaceObject]
interface NonDocumentTypeChildNode {
readonly attribute Element? previousElementSibling;
readonly attribute Element? nextElementSibling;
};
Element implements NonDocumentTypeChildNode;
CharacterData implements NonDocumentTypeChildNode;
element = node . previousElementSiblingReturns the first preceding sibling that is an element, and null otherwise.
element = node . nextElementSiblingReturns the first following sibling that is an element, and null otherwise.
The
previousElementSibling
attribute must return the first
preceding
sibling that is an
element, and null otherwise.
The
nextElementSibling
attribute must return the first
following
sibling that is an
element, and null otherwise.
[NoInterfaceObject]
interface ChildNode {
void before((Node or DOMString)... nodes);
void after((Node or DOMString)... nodes);
void replace((Node or DOMString)... nodes);
void remove();
};
DocumentType implements ChildNode;
Element implements ChildNode;
CharacterData implements ChildNode;
node . before(nodes)-
Inserts nodes just before node, while replacing strings in nodes with equivalent
Textnodes.Throws a "
HierarchyRequestError" if the constraints of the node tree are violated. node . after(nodes)-
Inserts nodes just after node, while replacing strings in nodes with equivalent
Textnodes.Throws a "
HierarchyRequestError" if the constraints of the node tree are violated. node . replace(nodes)-
Replaces node with nodes, while replacing strings in nodes with equivalent
Textnodes.Throws a "
HierarchyRequestError" if the constraints of the node tree are violated. node . remove()Removes node.
The
before(nodes)
method must run these steps:
If the context object does not have a parent, terminate these steps.
- Run the mutation method macro.
Pre-insert node into the context object's parent before the context object.
The
after(nodes)
method must run these steps:
If the context object does not have a parent, terminate these steps.
- Run the mutation method macro.
Pre-insert node into the context object's parent before the context object's next sibling.
The
replace(nodes)
method must run these steps:
If the context object does not have a parent, terminate these steps.
- Run the mutation method macro.
Replace the context object with node within the context object's parent.
The
remove()
method must run these steps:
If the context object does not have a parent, terminate these steps.
Remove the context object from the context object's parent.
5.2.6 Collections: Elements
class Elements extends Array { Element? query(DOMString relativeSelectors); Elements queryAll(DOMString relativeSelectors); };
elements . query(relativeSelectors)-
Returns the first element that is a child of elements that matches relativeSelectors.
elements . queryAll(relativeSelectors)-
Returns all element children of elements that match relativeSelectors.
The
query(relativeSelectors)
method must return the first result of running
evaluate a relative selectors string relativeSelectors
against the context object, and null if the result is an empty list.
The
queryAll(relativeSelectors)
method must return the result of running this.constructor with the
result of running evaluate a relative selectors string
relativeSelectors against the context object.
A collection is an object that represents a lists of DOM nodes. A collection can be either live or static. Unless otherwise stated, a collection must be live.
If a collection is live, then the attributes and methods on that object must operate on the actual underlying data, not a snapshot of the data.
When a collection is created, a filter and a root are associated with it.
The collection then represents a view of the subtree rooted at the collection's root, containing only nodes that match the given filter. The view is linear. In the absence of specific requirements to the contrary, the nodes within the collection must be sorted in tree order.
5.2.7.1 Interface NodeList
A NodeList object is a
collection of
nodes.
[ArrayClass]
interface NodeList {
getter Node? item(unsigned long index);
readonly attribute unsigned long length;
};
It is unclear if it will be possible to turn
NodeList into an ArrayClass interface.
Experimentation
is planned by the Chromium project.
- collection .
length -
Returns the number of nodes in the collection.
- element = collection .
item(index)- element = collection[index]
-
Returns the node with index index from the collection. The nodes are sorted in tree order.
interface HTMLCollection {
readonly attribute unsigned long length;
getter Element? item(unsigned long index);
getter Element? namedItem(DOMString name);
};
An HTMLCollection object is a
collection of
elements.
Elements is the better solution for representing a
collection of
elements. HTMLCollection is an historical
artifact we cannot rid the web of.
- collection .
length -
Returns the number of elements in the collection.
- element = collection .
item(index)- element = collection[index]
-
Returns the element with index index from the collection. The elements are sorted in tree order.
- element = collection .
namedItem(name)- element = collection[name]
-
Returns the first element with ID or name name from the collection.
5.3 Mutation observers
Each scripting environment has an associated list of
MutationObserver objects which is initially empty. To
invoke MutationObserver
objects, run these steps:
Let notify list be a copy of scripting environment's list of
MutationObserverobjects.-
For each
MutationObserverobject mo in notify list, run these substeps:Let queue be a copy of mo's record queue.
Empty mo's record queue.
Remove all transient registered observers whose observer is mo.
If queue is non-empty, invoke mo's callback with queue as first argument, and mo (itself) as second argument and callback this value.
If any
MutationObserverobject in scripting environment's list ofMutationObserverobjects has a non-empty record queue at this point, run these steps again (indeed, all of them).
The DOM standard does not define the scripting environment nor its scope. The HTML standard defines how this concept integrates with the rest of the platform as well as when invoke is invoked. [HTML]
Each node has an associated list of registered observers.
A registered observer consists of an observer (a
MutationObserver object) and options (a
MutationObserverInit dictionary). A
transient registered observer is a specific type of
registered observer that has a source which is a
registered observer.
[Constructor(MutationCallback callback)] interface MutationObserver { void observe(Node target, MutationObserverInit options); void disconnect(); sequence<MutationRecord> takeRecords(); }; callback MutationCallback = void (sequence<MutationRecord> mutations, MutationObserver observer); dictionary MutationObserverInit { boolean childList = false; boolean attributes; boolean characterData; boolean subtree = false; boolean attributeOldValue; boolean characterDataOldValue; sequence<DOMString> attributeFilter; };
A MutationObserver object can be used to observe mutations
to the tree of
nodes.
Each MutationObserver object has these associated concepts:
A callback set on creation.
A list of nodes on which it is a registered observer's observer that is initially empty.
A list of
MutationRecordobjects called the record queue that is initially empty.
var observer = new MutationObserver(callback)Constructs a
MutationObserverobject and sets its callback to callback. The callback is invoked with a list ofMutationRecordobjects as first argument and the constructedMutationObserverobject as second argument. It is invoked after nodes registered with theobserve()method, are mutated.observer . observe(target, options)-
Instructs the user agent to observe a given target (a node) and report any mutations based on the criteria given by options (an object).
The options argument allows for setting mutation observation options via object members. These are the object members that can be used:
childListSet to true if mutations to target's children are to be observed.
attributesSet to true if mutations to target's attributes are to be observed.
characterDataSet to true if mutations to target's data are to be observed.
subtreeSet to true if mutations to not just target, but also target's descendants are to be observed.
attributeOldValueSet to true if
attributesis set to true and target's attribute value before the mutation needs to be recorded.characterDataOldValueSet to true if
characterDatais set to true and target's data before the mutation needs to be recorded.attributeFilterSet to a list of attribute local names (without namespace) if not all attribute mutations need to be observed.
observer . disconnect()Stops observer from observing any mutations. Until the
observe()method is used again, observer's callback will not be invoked.observer . takeRecords()Empties the record queue and returns what was in there.
The
MutationObserver(callback)
constructor must create a new MutationObserver object with
callback set to callback,
append it to the scripting environment's list of
MutationObserver objects, and then return it.
The
observe(target, options)
method must run these steps:
If either options'
attributeOldValueorattributeFilteris present and options'attributesis omitted, set options'attributesto true.If options'
characterDataOldValueis present and options'characterDatais omitted, set options'characterDatato true.If options'
attributeOldValueis true and options'attributesis false, throw a JavaScriptTypeError.If options'
attributeFilteris present and options'attributesis false, throw a JavaScriptTypeError.If options'
characterDataOldValueis true and options'characterDatais false, throw a JavaScriptTypeError.-
For each registered observer registered in target's list of registered observers whose observer is the context object:
Remove all transient registered observers whose source is registered.
Replace registered's options with options.
Otherwise, add a new registered observer to target's list of registered observers with the context object as the observer and options as the options, and add target to context object's list of nodes on which it is registered.
The
disconnect()
method must, for each node
node in the context object's list of
nodes, remove any
registered observer on node
for which the context object is the observer, and also
empty context object's
record queue.
The
takeRecords()
method must return a copy of the
record queue and then empty the
record queue.
5.3.2 Queuing a mutation record
To queue a mutation record of type for target with one or more of (depends on type) name name, namespace namespace, oldValue oldValue, addedNodes addedNodes, removedNodes removedNodes, previousSibling previousSibling, and nextSibling nextSibling, run these steps:
Let interested observers be an initially empty set of
MutationObserverobjects optionally paired with a string.Let nodes be the inclusive ancestors of target.
-
Then, for each node in nodes, and then for each registered observer (with registered observer's options as options) in node's list of registered observers:
If node is not target and options's
subtreeis false, continue.If type is "
attributes" and options'sattributesis not true, continue.If type is "
attributes", options'sattributeFilteris present, and either options'sattributeFilterdoes not contain name or namespace is non-null, continue.If type is "
characterData" and options'scharacterDatais not true, continue.If type is "
childList" and options'schildListis false, continue.If registered observer's observer is not in interested observers, append registered observer's observer to interested observers.
If either type is "
attributes" and options'sattributeOldValueis true, or type is "characterData" and options'scharacterDataOldValueis true, set the paired string of registered observer's observer in interested observers to oldValue.
-
Then, for each observer in interested observers:
Let record be a new
MutationRecordobject with itstypeset to type andtargetset to target.If name and namespace are given, set record's
attributeNameto name, and record'sattributeNamespaceto namespace.If addedNodes is given, set record's
addedNodesto addedNodes.If removedNodes is given, set record's
removedNodesto removedNodes,If previousSibling is given, set record's
previousSiblingto previousSibling.If nextSibling is given, set record's
nextSiblingto nextSibling.If observer has a paired string, set record's
oldValueto observer's paired string.Append record to observer's record queue.
interface MutationRecord {
readonly attribute DOMString type;
readonly attribute Node target;
[SameObject] readonly attribute NodeList addedNodes;
[SameObject] readonly attribute NodeList removedNodes;
readonly attribute Node? previousSibling;
readonly attribute Node? nextSibling;
readonly attribute DOMString? attributeName;
readonly attribute DOMString? attributeNamespace;
readonly attribute DOMString? oldValue;
};
record . typeReturns "
attributes" if it was an attribute mutation. "characterData" if it was a mutation to aCharacterDatanode. And "childList" if it was a mutation to the tree of nodes.record . targetReturns the node the mutation affected, depending on the
type. For "attributes", it is the element whose attribute changed. For "characterData", it is theCharacterDatanode. For "childList", it is the node whose children changed.record . addedNodesrecord . removedNodesReturn the nodes added and removed respectively.
record . previousSiblingrecord . nextSiblingReturn the previous and next sibling respectively of the added or removed nodes, and null otherwise.
record . attributeNameReturns the local name of the changed attribute, and null otherwise.
record . attributeNamespaceReturns the namespace of the changed attribute, and null otherwise.
record . oldValueThe return value depends on
type. For "attributes", it is the value of the changed attribute before the change. For "characterData", it is the data of the changed node before the change. For "childList", it is null.
The type and
target
attributes must return the values they were initialized to.
The
addedNodes and
removedNodes
attributes must return the values they were initialized to. Unless stated
otherwise, when a MutationRecord object is created, they must
both be initialized to an empty NodeList.
The
previousSibling,
nextSibling,
attributeName,
attributeNamespace, and
oldValue
attributes must return the values they were initialized to. Unless stated
otherwise, when a MutationRecord object is created, they must
be initialized to null.
5.3.4 Garbage collection
Nodes have a strong reference to registered observers in their list of registered observers.
Registered observers in a node's list of registered observers have a weak reference to the node.
5.4 Interface Node
interface Node : EventTarget { const unsigned short ELEMENT_NODE = 1; const unsigned short ATTRIBUTE_NODE = 2; // historical const unsigned short TEXT_NODE = 3; const unsigned short CDATA_SECTION_NODE = 4; // historical const unsigned short ENTITY_REFERENCE_NODE = 5; // historical const unsigned short ENTITY_NODE = 6; // historical const unsigned short PROCESSING_INSTRUCTION_NODE = 7; const unsigned short COMMENT_NODE = 8; const unsigned short DOCUMENT_NODE = 9; const unsigned short DOCUMENT_TYPE_NODE = 10; const unsigned short DOCUMENT_FRAGMENT_NODE = 11; const unsigned short NOTATION_NODE = 12; // historical readonly attribute unsigned short nodeType; readonly attribute DOMString nodeName; readonly attribute DOMString? baseURI; readonly attribute Document? ownerDocument; readonly attribute Node? parentNode; readonly attribute Element? parentElement; boolean hasChildNodes(); [SameObject] readonly attribute NodeList childNodes; readonly attribute Node? firstChild; readonly attribute Node? lastChild; readonly attribute Node? previousSibling; readonly attribute Node? nextSibling; attribute DOMString? nodeValue; attribute DOMString? textContent; void normalize(); Node cloneNode(optional boolean deep = false); boolean isEqualNode(Node? node); const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01; const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02; const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04; const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08; const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10; const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20; unsigned short compareDocumentPosition(Node other); boolean contains(Node? other); DOMString? lookupPrefix(DOMString? namespace); DOMString? lookupNamespaceURI(DOMString? prefix); boolean isDefaultNamespace(DOMString? namespace); Node insertBefore(Node node, Node? child); Node appendChild(Node node); Node replaceChild(Node node, Node child); Node removeChild(Node child); };
Node is an abstract interface and does not exist
as node. It is used by all
nodes (Document,
DocumentFragment, DocumentType,
Element, Text, ProcessingInstruction,
and Comment).
Each node has an associated node document, set upon creation, that is a document.
A node's node document can be changed by the adopt algorithm.
Each node also has an associated base URL.
Other specifications define the value of the
base URL and its observable
behavior. This specification solely defines the concept and the
baseURI attribute.
node . nodeType-
Returns the type of node, represented by a number from the following list:
Node . ELEMENT_NODE(1)- node is an element.
Node . TEXT_NODE(3)- node is a
Textnode. Node . PROCESSING_INSTRUCTION_NODE(7)- node is a
ProcessingInstructionnode. Node . COMMENT_NODE(8)- node is a
Commentnode. Node . DOCUMENT_NODE(9)- node is a document.
Node . DOCUMENT_TYPE_NODE(10)- node is a doctype.
Node . DOCUMENT_FRAGMENT_NODE(11)- node is a
DocumentFragmentnode.
node . nodeName-
Returns a string appropriate for the type of node, as follows:
Element- Its
tagNameattribute value. Text- "
#text". ProcessingInstruction- Its target.
Comment- "
#comment". Document- "
#document". DocumentType- Its name.
DocumentFragment- "
#document-fragment".
The nodeType attribute
must return the type of the node, which must be one of the following:
ELEMENT_NODE(1);TEXT_NODE(3);PROCESSING_INSTRUCTION_NODE(7);- (8);
DOCUMENT_NODE(9);DOCUMENT_TYPE_NODE(10);DOCUMENT_FRAGMENT_NODE(11).
The nodeName attribute
must return the following, depending on the context object:
ElementIts
tagNameattribute value.Text"
#text".ProcessingInstructionIts target.
Comment"
#comment".Document"
#document".DocumentTypeIts name.
DocumentFragment"
#document-fragment".
The baseURI attribute must return the associated base URL.
node . ownerDocument-
Returns the node document.
Returns null for documents.
node . parentNodeReturns the parent.
node . parentElementReturns the parent element.
node . hasChildNodes()Returns whether node has children.
node . childNodesReturns the children.
node . firstChildReturns the first child.
node . lastChildReturns the last child.
node . previousSiblingReturns the previous sibling.
node . nextSiblingReturns the next sibling.
The nodeValue attribute
must return the following, depending on the context object:
TextCommentProcessingInstructionThe context object's data.
- Any other node
Null.
Setting the nodeValue attribute
must do as described below, depending on the context object:
TextCommentProcessingInstructionReplace data with node context object, offset 0, count
lengthattribute value, and data new value.- Any other node
Do nothing.
The textContent
attribute must return the following, depending on the
context object:
DocumentFragmentElementThe concatenation of data of all the
Textnode descendants of the context object, in tree order.TextProcessingInstructionCommentThe context object's data.
- Any other node
Null.
The textContent attribute must,
on setting, if the new value is null, act as if it was the empty string
instead, and then do as described below, depending on the context object:
DocumentFragmentElement-
Let node be null.
If new value is not the empty string, set node to a new
Textnode whose data is new value.Replace all with node within the context object.
TextProcessingInstructionCommentReplace data with node context object, offset 0, count
lengthattribute value, and data new value.- Any other node
Do nothing.
node . normalize()Removes empty
Textnodes and concatenates the data of remaining contiguousTextnodes into the first of their nodes.
The normalize() method
must run these steps:
For each Text node
descendant of the
context object:
Let node be the
Textnode descendant.Let length be node's
lengthattribute value.If length is zero, remove node and continue with the next
Textnode, if any.Let data be the concatenation of the data of node's contiguous
Textnodes (excluding itself), in tree order.Replace data with node node, offset length, count 0, and data data.
Let current node be node's next sibling.
While current node is a
Textnode:For each range whose start node is current node, add length to its start offset and set its start node to node.
For each range whose end node is current node, add length to its end offset and set its end node to node.
For each range whose start node is current node's parent and start offset is current node's index, set its start node to node and its start offset to length.
For each range whose end node is current node's parent and end offset is current node's index, set its end node to node and its end offset to length.
Add current node's
lengthattribute value to length.Set current node to its next sibling.
Remove node's contiguous
Textnodes (excluding itself), in tree order.
node . cloneNode([deep])Returns a copy of node. If deep is true or omitted, the copy also includes the node children.
node . isEqualNode(other)Returns whether node and other have the same properties.
Specifications may define cloning steps for all or some nodes. The algorithm is passed copy, node, document, and optionally a clone children flag, as indicated in the clone algorithm.
HTML defines
cloning steps for
script and
input elements. SVG ought to do the same
for its script elements, but does not call this out at
the moment.
To clone a node, optionally with a document and a clone children flag, run these steps:
If document is not given, let document be node's node document.
Let copy be a node that implements the same interfaces as node.
-
If copy is a document, set its node document and document to copy.
Otherwise, set copy's node document to document.
-
Copy the following from node to copy, depending on the type of node:
DocumentIts encoding, content type, URL, its mode (quirks mode, limited quirks mode, or no-quirks mode), and its type (XML document or HTML document).
DocumentTypeElementIts namespace, namespace prefix, local name, and its attribute list.
TextCommentIts data.
ProcessingInstruction- Any other node
—
Run any cloning steps defined for node in other applicable specifications and pass copy, node, document and the clone children flag if set, as parameters.
If the clone children flag is set, clone all the children of node and append them to copy, with document as specified and the clone children flag being set.
Return copy.
The
cloneNode(deep)
method must return a clone of the
context object, with the clone children flag set
if deep is true.
The
isEqualNode(node)
method must return true if all of the following conditions are true, and
false otherwise:
node is not null.
node's
nodeTypeattribute value is the same as the context object'snodeTypeattribute value.-
The following are also equal, depending on node:
DocumentTypeElement-
Its namespace, namespace prefix, local name, and its number of attributes in its attribute list.
ProcessingInstructionTextCommentIts data.
- Any other node
—
If node is an
Element, each attribute in its attribute list has an attribute with the same namespace, local name, and value in the context object's attribute list.node has the same number of children as the context object.
Calling
isEqualNode()on each child of the context object, with the child of the same index in node as argument returns true for every child.
node . compareDocumentPosition(other)-
Returns a bitmask indicating the position of other relative to node. These are the bits that can be set:
Node . DOCUMENT_POSITION_DISCONNECTED(1)- Set when node and other are not in the same document.
Node . DOCUMENT_POSITION_PRECEDING(2)- Set when other is preceding node.
Node . DOCUMENT_POSITION_FOLLOWING(4)- Set when other is following node.
Node . DOCUMENT_POSITION_CONTAINS(8)- Set when other is an ancestor of node.
Node . DOCUMENT_POSITION_CONTAINED_BY(16, 10 in hexadecimal)- Set when other is a descendant of node.
node . contains(other)Returns true if other is an inclusive descendant of node, and false otherwise.
These are the constants
compareDocumentPosition()
returns as mask:
DOCUMENT_POSITION_DISCONNECTED(1);DOCUMENT_POSITION_PRECEDING(2);DOCUMENT_POSITION_FOLLOWING(4);DOCUMENT_POSITION_CONTAINS(8);DOCUMENT_POSITION_CONTAINED_BY(16, 10 in hexadecimal);DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC(32, 20 in hexadecimal).
The compareDocumentPosition(other)
method must run these steps:
Let reference be the context object.
If other and reference are the same object, return zero.
-
If other and reference are not in the same tree, return the result of adding
DOCUMENT_POSITION_DISCONNECTED,DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, and eitherDOCUMENT_POSITION_PRECEDINGorDOCUMENT_POSITION_FOLLOWING, with the constraint that this is to be consistent, together.Whether to return
DOCUMENT_POSITION_PRECEDINGorDOCUMENT_POSITION_FOLLOWINGis typically implemented via pointer comparison. In JavaScript implementationsMath.random()can be used. If other is an ancestor of reference, return the result of adding
DOCUMENT_POSITION_CONTAINStoDOCUMENT_POSITION_PRECEDING.If other is a descendant of reference, return the result of adding
DOCUMENT_POSITION_CONTAINED_BYtoDOCUMENT_POSITION_FOLLOWING.If other is preceding reference return
DOCUMENT_POSITION_PRECEDING.Return
DOCUMENT_POSITION_FOLLOWING.
The
contains(other)
method must return true if other is an
inclusive descendant of
the context object, and false otherwise (including when
other is null).
To locate a namespace prefix for an element using namespace run these steps:
If element's namespace is namespace and its namespace prefix is not null, return its namespace prefix.
If, element has an attribute whose namespace prefix is "
xmlns" and value is namespace, then return element's first such attribute's local name.If element's parent element is not null, return the result of running locate a namespace prefix on that element using namespace. Otherwise, return null.
To locate a namespace for a node using prefix depends on node:
Element-
If its namespace is not null and its namespace prefix is prefix, return namespace.
-
If it has an attribute whose namespace is the XMLNS namespace, namespace prefix is "
xmlns" and local name is prefix, or if prefix is null and it has an attribute whose namespace is the XMLNS namespace, namespace prefix is null and local name is "xmlns":Let value be its value if it is not the empty string, and null otherwise.
Return value.
If its parent element is null, return null.
Return the result of running locate a namespace on its parent element using prefix.
Document-
If its document element is null, return null.
Return the result of running locate a namespace on its document element using prefix.
DocumentTypeDocumentFragmentReturn null.
- Any other node
-
If its parent element is null, return null.
Return the result of running locate a namespace on its parent element using prefix.
The
lookupPrefix(namespace)
method must run these steps:
If namespace is null or the empty string, return null.
-
Otherwise it depends on the context object:
ElementReturn the result of locating a namespace prefix for the node using namespace.
DocumentReturn the result of locating a namespace prefix for its document element, if that is not null, and null otherwise.
DocumentTypeDocumentFragmentReturn null.
- Any other node
Return the result of locating a namespace prefix for its parent element, or if that is null, null.
The
lookupNamespaceURI(prefix)
method must run these steps:
If prefix is the empty string, set it to null.
Return the result of running locate a namespace for the context object using prefix.
The
isDefaultNamespace(namespace)
method must run these steps:
If namespace is the empty string, set it to null.
Let defaultNamespace be the result of running locate a namespace for the context object using null.
Return true if defaultNamespace is the same as namespace, and false otherwise.
The
insertBefore(node, child)
method must return the result of
pre-inserting
node into the context object before
child.
The
appendChild(node)
method must return the result of
appending node to
the context object.
The
replaceChild(node, child)
method must return the result of
replacing child
with node within the context object.
The
removeChild(child)
method must return the result of
pre-removing
child from the context object.
The
list of elements with local name localName
for a node root is the
HTMLCollection returned by the following algorithm:
If localName is "
*" (U+002A), return aHTMLCollectionrooted at root, whose filter matches only elements.-
Otherwise, if root's node document is an HTML document, return a
HTMLCollectionrooted at root, whose filter matches only the following elements: Otherwise, return a
HTMLCollectionrooted at root, whose filter matches only elements whose local name is localName.
When invoked with the same argument, the same HTMLCollection
object may be returned as returned by an earlier call.
The
list of elements with namespace namespace and local name localName
for a node root is the
HTMLCollection returned by the following algorithm:
If namespace is the empty string, set it to null.
If both namespace and localName are "
*" (U+002A) return aHTMLCollectionrooted at root, whose filter matches only elements.Otherwise, if just namespace is "
*" (U+002A), return aHTMLCollectionrooted at root, whose filter matches only elements whose local name is localName.Otherwise, if just localName is "
*" (U+002A), return aHTMLCollectionrooted at root, whose filter matches only elements whose namespace is namespace.Otherwise, return a
HTMLCollectionrooted at root, whose filter matches only elements whose namespace is namespace and local name is localName.
When invoked with the same arguments, the same HTMLCollection
object may be returned as returned by an earlier call.
The
list of elements with class names classNames
for a node root is the
HTMLCollection returned by the following algorithm:
-
Let classes be the result of running the ordered set parser on classNames.
-
If classes is the empty set, return an empty
HTMLCollection. -
Return a
HTMLCollectionrooted at root, whose filter matches only elements that have all the classes in classes.If root's node document is in quirks mode, then the comparisons for the classes must be done in an ASCII case-insensitive manner, and in a case-sensitive manner otherwise.
When invoked with the same argument, the same HTMLCollection
object may be returned as returned by an earlier call.
[Constructor] interface Document : Node { [SameObject] readonly attribute DOMImplementation implementation; readonly attribute DOMString URL; readonly attribute DOMString documentURI; readonly attribute DOMString origin; readonly attribute DOMString compatMode; readonly attribute DOMString characterSet; readonly attribute DOMString contentType; readonly attribute DocumentType? doctype; readonly attribute Element? documentElement; HTMLCollection getElementsByTagName(DOMString localName); HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName); HTMLCollection getElementsByClassName(DOMString classNames); [NewObject] Element createElement(DOMString localName); [NewObject] Element createElementNS(DOMString? namespace, DOMString qualifiedName); [NewObject] DocumentFragment createDocumentFragment(); [NewObject] Text createTextNode(DOMString data); [NewObject] Comment createComment(DOMString data); [NewObject] ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data); Node importNode(Node node, optional boolean deep = false); Node adoptNode(Node node); [NewObject] Event createEvent(DOMString interface); [NewObject] Range createRange(); // NodeFilter.SHOW_ALL = 0xFFFFFFFF [NewObject] NodeIterator createNodeIterator(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null); [NewObject] TreeWalker createTreeWalker(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null); }; interface XMLDocument : Document {};
Document nodes are simply
known as documents.
Each document has an associated encoding, content type, and URL. [ENCODING] [URL]
Unless stated otherwise, a document's
encoding is the
utf-8
encoding, its
content type is
"application/xml", and its
URL is
"about:blank".
Unless stated otherwise, a document's origin is a globally unique identifier and its effective script origin is an alias of that origin. [HTML]
A document is assumed to be an XML document unless it is flagged as being an HTML document. Whether a document is an HTML document or an XML document affects the behavior of certain APIs.
A document is always set to one of three modes: no-quirks mode, the default; quirks mode, used typically for legacy documents; and limited-quirks mode. Unless stated otherwise, a document must be in no-quirks mode.
The mode is only ever changed from the default if the document is created by the HTML parser, based on the presence, absence, or value of the DOCTYPE string. [HTML]
No-quirks mode was originally known as "standards mode" and limited-quirks mode was once known as "almost standards mode". They have been renamed because their details are now defined by standards. (And because Ian Hickson vetoed their original names on the basis that they are nonsensical.)
document = new Document()Returns a new document.
document . implementationReturns document's
DOMImplementationobject.document . URLdocument . documentURIReturns document's URL.
document . originReturns document's origin.
document . compatMode-
Returns the string "
CSS1Compat" if document is in no-quirks mode or limited-quirks mode, and "BackCompat", if document is in quirks mode. document . characterSetReturns document's encoding.
document . contentTypeReturns document's content type.
The Document() constructor
must return a new document whose
origin is an
alias to the
origin of the global object's associated
document, and
effective script origin is an
alias to the
effective script origin of the
global object's associated document.
[HTML]
Unlike
createDocument()
this constructor does not return an XMLDocument object, but a
document (Document object).
The
implementation
attribute must return the DOMImplementation object that is
associated with the document.
The URL and
documentURI
attributes must return the URL.
The origin
attribute must return the Unicode serialization of
context object's origin.
[ORIGIN]
The compatMode
attribute must return "BackCompat" if the
context object is in
quirks mode, and
"CSS1Compat" otherwise.
The characterSet
attribute must return the name of the
encoding.
The contentType
attribute must return the
content type.
- document .
doctype Returns the doctype or null if there is none.
- document .
documentElement Returns the document element.
- collection = document .
getElementsByTagName(localName) -
If localName is "
*" returns aHTMLCollectionof all descendant elements.Otherwise, returns a
HTMLCollectionof all descendant elements whose local name is localName. (Matches case-insensitively against elements in the HTML namespace within an HTML document.) - collection = document .
getElementsByTagNameNS(namespace, localName) -
If namespace and localName are "
*" returns aHTMLCollectionof all descendant elements.If only namespace is "
*" returns aHTMLCollectionof all descendant elements whose local name is localName.If only localName is "
*" returns aHTMLCollectionof all descendant elements whose namespace is namespace.Otherwise, returns a
HTMLCollectionof all descendant elements whose namespace is namespace and local name is localName. - collection = document .
getElementsByClassName(classes)- collection = element .
getElementsByClassName(classes) - collection = element .
-
Returns a
HTMLCollectionof the elements in the object on which the method was invoked (a document or an element) that have all the classes given by classes.The classes argument is interpreted as a space-separated list of classes.
The doctype attribute
must return the child of the
document that is a
doctype, and null otherwise.
The
documentElement
attribute must return the document element.
The
getElementsByTagName(localName)
method must return the
list of elements with local name localName
for the context object.
Thus, in an HTML document,
document.getElementsByTagName("FOO") will match
FOO elements that are not in the
HTML namespace, and foo elements that are in
the HTML namespace, but not FOO elements
that are in the HTML namespace.
The
getElementsByTagNameNS(namespace, localName)
method must return the
list of elements with namespace namespace and local name localName
for the context object.
The
getElementsByClassName(classNames)
method must return the
list of elements with class names classNames
for the context object.
Given the following XHTML fragment:
<div id="example"> <p id="p1" class="aaa bbb"/> <p id="p2" class="aaa ccc"/> <p id="p3" class="bbb ccc"/> </div>
A call to
document.getElementById('example').getElementsByClassName('aaa')
would return a HTMLCollection with the two paragraphs
p1 and p2 in it.
A call to
getElementsByClassName('ccc bbb')
would only return one node, however, namely p3. A call to
document.getElementById('example').getElementsByClassName('bbb ccc ')
would return the same thing.
A call to
getElementsByClassName('aaa,bbb')
would return no nodes; none of the elements above are in the
aaa,bbb class.
- element = document .
createElement(localName) -
Returns an element in the HTML namespace with localName as local name. (In an HTML document localName is lowercased.)
If localName does not match the
Nameproduction an "InvalidCharacterError" exception will be thrown. - element = document .
createElementNS(namespace, qualifiedName) -
Returns an element with namespace namespace. Its namespace prefix will be everything before "
:" (U+003E) in qualifiedName or null. Its local name will be everything after ":" (U+003E) in qualifiedName or qualifiedName.If localName does not match the
Nameproduction an "InvalidCharacterError" exception will be thrown.If one of the following conditions is true a "
NamespaceError" exception will be thrown: - documentFragment = document .
createDocumentFragment() Returns a
DocumentFragmentnode.- text = document .
createTextNode(data) - comment = document .
createComment(data) - processingInstruction = document .
createProcessingInstruction(target, data) -
Returns a
ProcessingInstructionnode whose target is target and data is data.If target does not match the
Nameproduction an "InvalidCharacterError" exception will be thrown.If data contains "
?>" an "InvalidCharacterError" exception will be thrown.
The element interface for any
name and namespace is Element, unless
stated otherwise.
The HTML Standard will e.g. define that for html and the
HTML namespace, the HTMLHtmlElement interface is used.
[HTML]
The createElement(localName) method must run the these steps:
If localName does not match the
Nameproduction, throw an "InvalidCharacterError" exception.If the context object is an HTML document, let localName be converted to ASCII lowercase.
Let interface be the element interface for localName and the HTML namespace.
Return a new element that implements interface, with no attributes, namespace set to the HTML namespace, local name set to localName, and node document set to the context object.
The
createElementNS(namespace, qualifiedName)
method must run these steps:
If namespace is the empty string, set it to null.
If qualifiedName does not match the
Nameproduction, throw an "InvalidCharacterError" exception.If qualifiedName does not match the
QNameproduction, throw a "NamespaceError" exception.If qualifiedName contains a "
:" (U+003E), then split the string on it and let prefix be the part before and localName the part after. Otherwise, let prefix be null and localName be qualifiedName.If prefix is not null and namespace is null, throw a "
NamespaceError" exception.If prefix is "
xml" and namespace is not the XML namespace, throw a "NamespaceError" exception.If qualifiedName or prefix is "
xmlns" and namespace is not the XMLNS namespace, throw a "NamespaceError" exception.If namespace is the XMLNS namespace and neither qualifiedName nor prefix is "
xmlns", throw a "NamespaceError" exception.Let interface be the element interface for localName and namespace.
Return a new element that implements interface, with no attributes, namespace set to namespace, namespace prefix set to prefix, local name set to localName, and node document set to the context object.
The
createDocumentFragment()
method must return a new DocumentFragment
node with its
node document set to the
context object.
The
createTextNode(data)
method must return a new Text
node with its
data set to data and
node document set to the
context object.
No check is performed that data consists of
characters that match the Char production.
The
method must return a new Comment
node with its
data set to data and
node document set to the
context object.
No check is performed that data consists of
characters that match the Char production
or that it contains two adjacent hyphens or ends with a hyphen.
The createProcessingInstruction(target, data) method must run these steps:
If target does not match the
Nameproduction, throw an "InvalidCharacterError" exception.If data contains the string "
?>", throw an "InvalidCharacterError" exception.Return a new
ProcessingInstructionnode, with target set to target, data set to data, and node document set to the context object.
No check is performed that target contains
"xml" or ":", or that
data contains characters that match the
Char production.
- clone = document .
importNode(node [, deep]) -
Returns a copy of node. If deep is true or omitted, the copy also includes the node children.
If node is a document throws a "
NotSupportedError" exception. - node = document .
adoptNode(node) -
Moves node from another document and returns it.
If node is a document throws a "
NotSupportedError" exception.
The
importNode(node, deep)
method must run these steps:
If node is a document, throw a "
NotSupportedError" exception.Return a clone of node, with context object and the clone children flag set if deep is true.
To adopt a node into a document, run these steps:
Set node document for node and all its descendants to document.
If node is an element, it is affected by a base URL change.
The
adoptNode(node)
method must run these steps:
If node is a document, throw a "
NotSupportedError" exception.Adopt node into the context object.
Return node.
The
createEvent(interface)
method must run these steps:
Let event be null.
-
If interface is an ASCII case-insensitive match for any of the strings in the first column in the following table, let event be the interface in the second column on the same row as the matching string:
String Interface Notes " customevent"CustomEvent" event"Event" events"" htmlevents"" mouseevent"MouseEvent[UIEVENTS] " mouseevents"" uievent"UIEvent" uievents" If event is null, throw a "
NotSupportedError".Return a new event implementing the event interface.
Event constructors can be used instead.
The createRange()
method must return a new range with
(context object, 0) as its
start and
end.
The Range() constructor can be used instead.
The
createNodeIterator(root, whatToShow, filter)
method must run these steps:
Create a
NodeIteratorobject.Set root and initialize the
referenceNodeattribute to the root argument.Initialize the
pointerBeforeReferenceNodeattribute to true.Set whatToShow to the whatToShow argument.
Set filter to filter.
Return the newly created
NodeIteratorobject.
The
createTreeWalker(root, whatToShow, filter)
method must run these steps:
Create a
TreeWalkerobject.Set root and initialize the
currentNodeattribute to the root argument.Set whatToShow to the whatToShow argument.
Set filter to filter.
Return the newly created
TreeWalkerobject.
User agents must create a DOMImplementation object whenever
a document is created and associate it
with that document.
interface DOMImplementation {
[NewObject] DocumentType createDocumentType(DOMString qualifiedName, DOMString publicId, DOMString systemId);
[NewObject] XMLDocument createDocument(DOMString? namespace, [TreatNullAs=EmptyString] DOMString qualifiedName, optional DocumentType? doctype = null);
[NewObject] Document createHTMLDocument(optional DOMString title);
boolean hasFeature(DOMString feature, [TreatNullAs=EmptyString] DOMString version);
};
doctype = document . implementation . createDocumentType(qualifiedName, publicId, systemId)-
Returns a doctype, with the given qualifiedName, publicId, and systemId. If qualifiedName does not match the
Nameproduction, an "InvalidCharacterError" exception is thrown, and if it does not match theQNameproduction, a "NamespaceError" exception is thrown. doc = document . implementation . createDocument(namespace, qualifiedName [, doctype = null])-
Returns an
XMLDocument, with a document element whose local name is qualifiedName and whose namespace is namespace (unless qualifiedName is the empty string), and with doctype, if it is given, as its doctype.This method throws the same exceptions as the
createElementNSmethod, when invoked with the same arguments. doc = document . implementation . createHTMLDocument([title])-
Returns a document, with a basic tree already constructed including a
titleelement, unless the title argument is omitted. document . implementation . hasFeature( feature, version)-
If feature is an SVG feature string, returns whether that feature is supported. If feature is not the empty string, only returns true if the feature is supported as defined in the given version of the SVG specification (e.g., "
1.1").If feature is not an SVG feature, but rather some other string like "
HTML" or "flibbertigibbet", always returns true. Thus, this method is only useful for testing SVG features.
The
createDocumentType(qualifiedName, publicId, systemId)
method must run these steps:
If qualifiedName does not match the
Nameproduction, throw an "InvalidCharacterError" exception.If qualifiedName does not match the
QNameproduction, throw a "NamespaceError" exception.Return a new doctype, with qualifiedName as its name, publicId as its public ID, and systemId as its system ID, and with its node document set to the associated document of the context object.
No check is performed that publicId
matches the PublicChar production or that
systemId does not contain both a '"' and
"'".
The
createDocument(namespace, qualifiedName, doctype)
method must run these steps:
-
Let document be a new
XMLDocument.This method creates an
XMLDocumentrather than a normal document. They are identical except for the addition of theload()method deployed content relies upon. [HTML] Let element be null.
If qualifiedName is not the empty string, set element to the result of invoking the
createElementNS()method with the arguments namespace and qualifiedName on document. If that threw an exception, re-throw the exception.If doctype is not null, append doctype to document.
If element is not null, append element to document.
document's origin is an alias to the origin of the context object's associated document, and document's effective script origin is an alias to the effective script origin of the context object's associated document. [HTML]
Return document.
The
createHTMLDocument(title)
method must run these steps:
Let doc be a new document that is an HTML document.
Set doc's content type to "
text/html".Create a doctype, with "
html" as its name and with its node document set to doc. Append the newly created node to doc.Create an
htmlelement in the HTML namespace, and append it to doc.Create a
headelement in the HTML namespace, and append it to thehtmlelement created in the previous step.-
If the title argument is not omitted:
Create a
bodyelement in the HTML namespace, and append it to thehtmlelement created in the earlier step.doc's origin is an alias to the origin of the context object's associated document, and doc's effective script origin is an alias to the effective script origin of the context object's associated document. [HTML]
Return doc.
The hasFeature(feature, version) method must run
these steps:
If feature begins with an ASCII case-insensitive match for one of the strings "
http://www.w3.org/TR/SVG", "org.w3c.dom.svg", or "org.w3c.svg":If version is the empty string:
Return true if there is some SVG specification that defines a feature that is an ASCII case-insensitive match for feature, and the user agent meets all the requirements of that specification for that feature. Otherwise, return false.
Return true if version is the version identifier for a known SVG specification, and that specification defines a feature that is an ASCII case-insensitive match for feature, and the user agent meets all the requirements of that specification for that feature. Otherwise, return false.
What happens if a feature is only defined in 1.1 but the version string passed is 1.0? Most UAs return true in this case too, but do we want to spec that?
Return true.
hasFeature()
originally would report whether the user agent claimed to support a given DOM
feature, but experience proved it was not nearly as reliable or granular as
simply checking whether the desired interfaces, attributes, or methods existed.
As such, it should no longer be used, but continues to exist (and simply
returns true) so that old pages don't stop working. SVG features are a
separate mechanism that reused the existing method, so they continue to work as
a special case.
[Constructor] interface DocumentFragment : Node { };
A DocumentFragment node can have an
associated element named
host.
An object A is a host-including inclusive ancestor of an object B, if either A is an inclusive ancestor of B, or if B's root has an associated host and A is a host-including inclusive ancestor of B's root's host.
The DocumentFragment node's
host concept is useful for HTML's
template element and the ShadowRoot object and impacts the
pre-insert and
replace algorithms.
tree = new DocumentFragment()Returns a new
DocumentFragmentnode.
The DocumentFragment() constructor
must return a new DocumentFragment node whose
node document is the global object's associated
document.
interface DocumentType : Node { readonly attribute DOMString name; readonly attribute DOMString publicId; readonly attribute DOMString systemId; };
DocumentType nodes are
simply known as doctypes.
Doctypes have an associated name, public ID, and system ID.
When a doctype is created, its name is always given. Unless explicitly given when a doctype is created, its public ID and system ID are the empty string.
The name attribute
must return the name.
The publicId
attribute must return the
public ID.
The systemId
attribute must return the
system ID.
interface Element : Node { readonly attribute DOMString? namespaceURI; readonly attribute DOMString? prefix; readonly attribute DOMString localName; readonly attribute DOMString tagName; attribute DOMString id; attribute DOMString className; [SameObject] readonly attribute DOMTokenList classList; [SameObject] readonly attribute Attr[] attributes; DOMString? getAttribute(DOMString name); DOMString? getAttributeNS(DOMString? namespace, DOMString localName); void setAttribute(DOMString name, DOMString value); void setAttributeNS(DOMString? namespace, DOMString name, DOMString value); void removeAttribute(DOMString name); void removeAttributeNS(DOMString? namespace, DOMString localName); boolean hasAttribute(DOMString name); boolean hasAttributeNS(DOMString? namespace, DOMString localName); boolean matches(DOMString selectors); HTMLCollection getElementsByTagName(DOMString localName); HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName); HTMLCollection getElementsByClassName(DOMString classNames); };
Element nodes are simply
known as elements.
Elements have an associated namespace, namespace prefix, and local name. When an element is created, its local name is always given. Unless explicitly given when an element is created, its namespace and namespace prefix are null.
Elements also have an ordered attribute list. Unless explicitly given when an element is created, its attribute list is empty. An element has an attribute A if A is in its attribute list.
Applicable specifications and this specification (can) use the hooks an attribute is set, an attribute is changed, an attribute is added, and an attribute is removed, for further processing of the attribute's value.
To get an attribute for an element element using a localName and optionally a namespace, run these steps:
If namespace is not given, set it to null.
Return the value of the attribute in element's attribute list whose namespace is namespace and local name is localName, if it has one, and null otherwise.
To set an attribute for an element element using a localName and value, and optionally a name, prefix, and namespace, run these steps:
If name is not given, set it to localName.
If prefix is not given, set it to null.
If namespace is not given, set it to null.
Let attribute be the attribute in element's attribute list whose namespace is namespace and whose local name is localName, or null if there is no such attribute.
If attribute is null, create an attribute whose local name is localName, value is value, name is name, namespace is namespace, and namespace prefix is prefix, and then append this attribute to element and terminate these steps.
Change attribute from element to value.
To change an attribute attribute from an element element to value, run these steps:
Queue a mutation record of "
attributes" for element with name attribute's local name, namespace attribute's namespace, and oldValue attribute's value.Set attribute's value to value.
An attribute is set and an attribute is changed.
To append an attribute attribute to an element element, run these steps:
Queue a mutation record of "
attributes" for element with name attribute's local name, namespace attribute's namespace, and oldValue null.Append the attribute to the element's attribute list.
An attribute is set and an attribute is added.
To remove an attribute attribute from an element element, run these steps:
Queue a mutation record of "
attributes" for element with name attribute's local name, namespace attribute's namespace, and oldValue attribute's value.Remove attribute from the element's attribute list.
Elements can have an associated
unique identifier (ID) and have an associated
DOMTokenList object. The DOMTokenList object's
associated attribute's
local name is
class and its associated ordered set of tokens is called
the element's
classes.
Historically elements could
have multiple identifiers e.g. by using the HTML id
attribute and a DTD. This specification
makes ID a concept of the DOM and allows for
only one per element, given by an
id attribute.
Either when an element is created that
has an
id attribute whose
value is not the empty string or
when an element's
id attribute is
set to a
value other than the empty
string, set the element's
ID to the new
value.
When an element's
id attribute is
removed, unset the
element's
ID.
Either when an element is created that
has a
class attribute or
when an element's
class attribute is
set, set the
element's
classes to the new
value,
parsed.
When an element's
class attribute is
removed, set the
element's
classes to the empty set.
While this specification defines user agent processing
requirements for id and class
attributes on any
element, it makes no claims as to whether
using them is conforming or not.
A node's
parent of type
Element is known as a parent element. If the
node has a
parent of a different type, its
parent element is null.
The document element of a document is the element whose parent is that document, if it exists, and null otherwise.
Per the node tree constraints, there can only be one such element.
When an element or one of its ancestors is the document element, it is in a document.
Specifications may define base URL change steps.
When an element is affected by a base URL change, the user agent must run the base URL change steps, as defined in other applicable specifications.
- namespace = element .
namespaceURI Returns the namespace.
- prefix = element .
prefix Returns the namespace prefix.
- localName = element .
localName Returns the local name.
- qualifiedName = element .
tagName If namespace prefix is not null, returns the concatenation of namespace prefix, "
:", and local name. Otherwise it returns the local name. (The return value is uppercased in an HTML document.)
The namespaceURI
attribute must return the context object's
namespace.
The prefix attribute must return the context object's
namespace prefix.
The localName
attribute must return the context object's
local name.
The tagName attribute
must run these steps:
If context object's namespace prefix is not null, let qualified name be its namespace prefix, followed by a "
:" (U+003A), followed by its local name. Otherwise, let qualified name be its local name.If the context object is in the HTML namespace and its node document is an HTML document, let qualified name be converted to ASCII uppercase.
Return qualified name.
Some attributes are defined to reflect a particular content attribute. This means that on getting, these steps must be run:
Get an attribute for the context object using content attribute's name and let value be the result.
If value is null, return the empty string.
Return value.
On setting, set an attribute for the context object using the name of the attribute and the given value.
The id attribute must
reflect the "id"
content attribute.
The className
attribute must reflect the
"class" content attribute.
The classList
attribute must return the associated DOMTokenList object
representing the context object's
classes.
The attributes
attribute must return a read only array
of the context object's
attribute list.
The returned read only array must be
live. I.e. changes to the associated
attributes are reflected.
The getAttribute(name) method must run these steps:
If the context object is in the HTML namespace and its node document is an HTML document, let name be converted to ASCII lowercase.
Return the value of the first attribute in the context object's attribute list whose name is name, and null otherwise.
The
getAttributeNS(namespace, localName)
method must return the following steps:
If namespace is the empty string, set it to null.
Return getting an attribute for the context object using localName and namespace.
The
setAttribute(name, value)
method must run these steps:
If name does not match the
Nameproduction in XML, throw an "InvalidCharacterError" exception.If the context object is in the HTML namespace and its node document is an HTML document, let name be converted to ASCII lowercase.
Let attribute be the first attribute in the context object's attribute list whose name is name, or null if there is no such attribute.
If attribute is null, create an attribute whose local name is name and value is value, and then append this attribute to the context object and terminate these steps.
Change attribute from context object to value.
The
setAttributeNS(namespace, name, value)
method must run these steps:
If namespace is the empty string, set it to null.
If name does not match the
Nameproduction in XML, throw an "InvalidCharacterError" exception.If name does not match the
QNameproduction in Namespaces in XML, throw a "NamespaceError" exception.If name contains a "
:" (U+003E), then split the string on it and let prefix be the part before and localName the part after. Otherwise, let prefix be null and localName be name.If prefix is not null and namespace is null, throw a "
NamespaceError" exception.If prefix is "
xml" and namespace is not the XML namespace, throw a "NamespaceError" exception.If name or prefix is "
xmlns" and namespace is not the XMLNS namespace, throw a "NamespaceError" exception.If namespace is the XMLNS namespace and neither name nor prefix is "
xmlns", throw a "NamespaceError" exception.Set an attribute for the context object using localName, value, and also name, prefix, and namespace.
The
removeAttribute(name)
method must run these steps:
If the context object is in the HTML namespace and its node document is an HTML document, let name be converted to ASCII lowercase.
Remove the first attribute from the context object whose name is name, if any.
The
removeAttributeNS(namespace, localName)
method must return the following steps:
If namespace is the empty string, set it to null.
Remove the attribute from the context object whose namespace is namespace and local name is localName, if any.
The
hasAttribute(name)
method must run these steps:
If the context object is in the HTML namespace and its node document is an HTML document, let name be converted to ASCII lowercase.
Return true if the context object has an attribute whose name is name, and false otherwise.
The
hasAttributeNS(namespace, localName)
method must run these steps:
If namespace is the empty string, set it to null.
Return true if the context object has an attribute whose namespace is namespace and local name is localName, and false otherwise.
element . matches(selectors)Returns true if matching selectors against element's root yields element, and false otherwise.
The matches(selectors)
method must return true if the context object is in the result of running
evaluate a selectors string selectors against the
context object, and false otherwise.
The
getElementsByTagName(localName)
method must return the
list of elements with local name localName
for the context object.
The
getElementsByTagNameNS(namespace, localName)
method must return the
list of elements with namespace namespace and local name localName
for the context object.
The
getElementsByClassName(classNames)
method must return the
list of elements with class names classNames
for the context object.
5.8.1 Interface Attr
interface Attr {
readonly attribute DOMString localName;
attribute DOMString value;
readonly attribute DOMString name;
readonly attribute DOMString? namespaceURI;
readonly attribute DOMString? prefix;
};
Attr objects are simply known as
attributes. They are sometimes referred
to as content attributes to avoid confusion with IDL attributes.
Attributes have a local name and value.
For legacy reasons, attributes also have an associated name, namespace, and namespace prefix.
When an attribute is created, its local name and value are always given. Unless explicitly given when an attribute is created, its name is identical to its local name, and its namespace and namespace prefix are null.
An
A attribute
is an attribute whose
local name is
A and whose
namespace and
namespace prefix are
null.
The localName attribute
must return the local name.
The value attribute must
return the value.
Setting the value attribute must
change
value to the new value.
The name attribute must
return the name.
The namespaceURI
attribute must return the
namespace.
The prefix attribute must
return the
namespace prefix.
interface CharacterData : Node { [TreatNullAs=EmptyString] attribute DOMString data; readonly attribute unsigned long length; DOMString substringData(unsigned long offset, unsigned long count); void appendData(DOMString data); void insertData(unsigned long offset, DOMString data); void deleteData(unsigned long offset, unsigned long count); void replaceData(unsigned long offset, unsigned long count, DOMString data); };
CharacterData is an abstract interface and does
not exist as node. It is used by
Text, Comment, and
ProcessingInstruction nodes.
Each node inheriting from the
CharacterData interface has an associated mutable string
called data.
To replace data of node node with offset offset, count count, and data data, run these steps:
Let length be node's
lengthattribute value.If offset is greater than length, throw an "
IndexSizeError" exception.If offset plus count is greater than length let count be length minus offset.
Queue a mutation record of "
characterData" for node with oldValue node's data.Insert data into node's data after offset code units.
Let delete offset be offset plus the number of code units in data.
Starting from delete offset code units, remove count code units from node's data.
For each range whose start node is node and start offset is greater than offset but less than or equal to offset plus count, set its start offset to offset.
For each range whose end node is node and end offset is greater than offset but less than or equal to offset plus count, set its end offset to offset.
For each range whose start node is node and start offset is greater than offset plus count, increase its start offset by the number of code units in data, then decrease it by count.
For each range whose end node is node and end offset is greater than offset plus count, increase its end offset by the number of code units in data, then decrease it by count.
To substring data with node node, offset offset, and count count, run these steps:
Let length be node's
lengthattribute value.If offset is greater than length, throw an "
IndexSizeError" exception.If offset plus count is greater than length, return a string whose value is the code units from the offsetth code unit to the end of node's data, and then terminate these steps.
Return a string whose value is the code units from the offsetth code unit to the offset+countth code unit in node's data.
The data attribute
must return data, and on setting, must
replace data with node
context object offset 0, count
length attribute value, and data
new value.
The length
attribute must return the number of
code units in
data.
The
substringData(offset, count)
method must substring data with node
context object, offset offset, and count
count.
The
appendData(data)
method must replace data with node
context object, offset
length attribute value, count 0,
and data data.
The
insertData(offset, data)
method must replace data with node
context object, offset offset, count 0, and
data data.
The
deleteData(offset, count)
method must replace data with node
context object, offset offset, count
count, and data the empty string.
The
replaceData(offset, count, data)
method must replace data with node
context object, offset offset, count
count, and data data.
5.10 Interface Text
[Constructor(optional DOMString data = "")] interface Text : CharacterData { [NewObject] Text splitText(unsigned long offset); readonly attribute DOMString wholeText; };
text = new Text([data = ""])text . splitText(offset)Splits data at the given offset and returns the remainder as
Textnode.text . wholeText
The Text(data) constructor
must return a new Text node whose
data is data and
node document is the global object's associated
document.
To split a Text
node node with offset
offset, run these steps:
Let length be node's
lengthattribute value.If offset is greater than length, throw an "
IndexSizeError" exception.Let count be length minus offset.
Let new data be the result of substringing data with node node, offset offset, and count count.
Let new node be a new
Textnode, with the same node document as node. Set new node's data to new data.Let parent be node's parent.
-
If parent is not null, run these substeps:
Insert new node into parent before node's next sibling.
For each range whose start node is node and start offset is greater than offset, set its start node to new node and decrease its start offset by offset.
For each range whose end node is node and end offset is greater than offset, set its end node to new node and decrease its end offset by offset.
For each range whose start node is parent and start offset is equal to the index of node + 1, increase its start offset by one.
For each range whose end node is parent and end offset is equal to the index of node + 1, increase its end offset by one.
Replace data with node node, offset offset, count count, and data the empty string.
-
If parent is null, run these substeps:
For each range whose start node is node and start offset is greater than offset, set its start offset to offset.
For each range whose end node is node and end offset is greater than offset, set its end offset to offset.
Return new node.
The
splitText(offset)
method must split the
context object with offset offset.
The contiguous Text nodes of a node are the node
itself, the
previous sibling
Text node (if any) and its
contiguous Text nodes, and the
next sibling Text
node (if any) and its contiguous Text nodes,
avoiding any duplicates.
The wholeText
attribute must return a concatenation of the
data of the
contiguous Text nodes of the
context object, in
tree order.
interface ProcessingInstruction : CharacterData { readonly attribute DOMString target; };
ProcessingInstruction nodes
have an associated target.
The target
attribute must return the target.
[Constructor(optional DOMString data = "")] interface : CharacterData { };
The
constructor must return a new Comment node
whose data is data and
node document is the global object's associated
document.
6 Ranges
6.1 Introduction to "DOM Ranges"
A Range object (range)
represents a sequence of content within a
node tree. Each
range has a
start and an
end which are
boundary points. A
boundary point is a tuple consisting of
a node and a non-negative numeric
offset. So in other words, a
range represents a piece of content within
a node tree between two
boundary points.
Ranges are frequently used in editing for selecting and copying content.
In the node tree above, a
range can be used to represent the sequence
“syndata is awes”. Assuming p is assigned to the
p element, and
em to the em
element, this would be done as follows:
var range = new Range(),
firstText = p.childNodes[1],
secondText = em.firstChild
range.setStart(firstText, 9) // do not forget the leading space
range.setEnd(secondText, 4)
// range now stringifies to the aforementioned quote
Attributes such as
src and alt in the
node tree above cannot be represented
by a range. The
ranges concept is only useful for
nodes.
Ranges are affected by mutations to the node tree. Such mutations will not invalidate a range and will try to ensure that the range still represents the same piece of content. Necessarily, a range might itself be modified as part of the mutation to the node tree when e.g. part of the content it represents is mutated.
See the insert and
remove algorithms, the
normalize() method, and the
replace data and
split algorithms for the hairy
details.
6.2 Interface Range
[Constructor] interface Range { readonly attribute Node startContainer; readonly attribute unsigned long startOffset; readonly attribute Node endContainer; readonly attribute unsigned long endOffset; readonly attribute boolean collapsed; readonly attribute Node commonAncestorContainer; void setStart(Node node, unsigned long offset); void setEnd(Node node, unsigned long offset); void setStartBefore(Node node); void setStartAfter(Node node); void setEndBefore(Node node); void setEndAfter(Node node); void collapse(optional boolean toStart = false); void selectNode(Node node); void selectNodeContents(Node node); const unsigned short START_TO_START = 0; const unsigned short START_TO_END = 1; const unsigned short END_TO_END = 2; const unsigned short END_TO_START = 3; short compareBoundaryPoints(unsigned short how, Range sourceRange); void deleteContents(); [NewObject] DocumentFragment extractContents(); [NewObject] DocumentFragment cloneContents(); void insertNode(Node node); void surroundContents(Node newParent); [NewObject] Range cloneRange(); void detach(); boolean isPointInRange(Node node, unsigned long offset); short comparePoint(Node node, unsigned long offset); boolean intersectsNode(Node node); stringifier; };
Range objects are simply known as
ranges.
A boundary point is a (node, offset) tuple, where offset is a non-negative integer.
Generally speaking, a boundary point's offset will be between zero and the boundary point's node length, inclusive. Algorithms that modify a tree (in particular the insert, remove, replace data, and split algorithms) also modify ranges associated with that tree.
If the two nodes of boundary points (node A, offset A) and (node B, offset B) have the same root, the position of the first relative to the second is either before, equal, or after, as returned by the following algorithm:
If node A is the same as node B, return equal if offset A is the same as offset B, before if offset A is less than offset B, and after if offset A is greater than offset B.
If node A is following node B, compute the position of (node B, offset B) relative to (node A, offset A). If it is before, return after. If it is after, return before.
-
If node A is an ancestor of node B:
Return before.
Each range has two associated boundary points — a start and end.
For convenience, start node is start's node, start offset is start's offset, end node is end's node, and end offset is end's offset.
The root of a range is the root of its start node.
A node node is contained in a range range if node's root is the same as range's root, and (node, 0) is after range's start, and (node, length of node) is before range's end.
A node is partially contained in a range if it is an inclusive ancestor of the range's start node but not its end node, or vice versa.
Some facts to better understand these definitions:
The content that one would think of as being within the range consists of all contained nodes, plus possibly some of the contents of the start node and end node if those are
Text,ProcessingInstruction, orCommentnodes.The nodes that are contained in a range will generally not be contiguous, because the parent of a contained node will not always be contained.
However, the descendants of a contained node are contained, and if two siblings are contained, so are any siblings that lie between them.
The first contained node (if there are any) will always be after the start node, and the last contained node will always be equal to or before the end node's last descendant.
The start node and end node of a range are never contained within it.
There exists some partially contained node if and only if the start node and end node are different.
The
commonAncestorContainerattribute value is never contained or partially contained.- If the start node is an ancestor of the end node, the common inclusive ancestor will be the start node. Exactly one of its children will be partially contained, and a child will be contained if and only if it precedes the partially contained child. If the end node is an ancestor of the start node, the opposite holds.
If the start node is not an inclusive ancestor of the end node, nor vice versa, the common inclusive ancestor will be distinct from both of them. Exactly two of its children will be partially contained, and a child will be contained if and only if it lies between those two.
The Range() constructor must return a new
range with
(global object's associated document, 0) as its
start and
end.
- node = range .
startContainer Returns range's start node.
- offset = range .
startOffset Returns range's start offset.
- node = range .
endContainer Returns range's end node.
- offset = range .
endOffset Returns range's end offset.
- collapsed = range .
collapsed Returns true if range's start and end are the same, and false otherwise.
- container = range .
commonAncestorContainer Returns the node, furthest away from the document, that is an ancestor of both range's start node and end node.
The startContainer
attribute must return the
start node.
The startOffset
attribute must return the
start offset.
The endContainer
attribute must return the
end node.
The endOffset
attribute must return the
end offset.
The collapsed attribute
must return true if start is the same
as end, and false otherwise.
The
commonAncestorContainer
attribute must run these steps:
Let container be start node.
While container is not an inclusive ancestor of end node, let container be container's parent.
Return container.
To set the start or end of a range to a boundary point (node, offset), run these steps:
If node is a doctype, throw an "
InvalidNodeTypeError" exception.If offset is greater than node's length, throw an "
IndexSizeError" exception.Let bp be the boundary point (node, offset).
-
- If these steps were invoked as "set the start"
- If these steps were invoked as "set the end"
The
setStart(node, offset)
method must set the start of the
context object to
boundary point
(node, offset).
The
setEnd(node, offset)
method must set the end of the
context object to
boundary point
(node, offset).
The
setStartBefore(node)
method must run these steps:
Let parent be node's parent.
If parent is null, throw an "
InvalidNodeTypeError" exception.Set the start of the context object to boundary point (parent, node's index).
The
setStartAfter(node)
method must run these steps:
Let parent be node's parent.
If parent is null, throw an "
InvalidNodeTypeError" exception.Set the start of the context object to boundary point (parent, node's index plus one).
The
setEndBefore(node)
method must run these steps:
Let parent be node's parent.
If parent is null, throw an "
InvalidNodeTypeError" exception.Set the end of the context object to boundary point (parent, node's index).
The
setEndAfter(node)
method must run these steps:
Let parent be node's parent.
If parent is null, throw an "
InvalidNodeTypeError" exception.Set the end of the context object to boundary point (parent, node's index plus one).
The
collapse(toStart)
method must if toStart is true, set
end to
start, and set
start to
end otherwise.
The
selectNode(node)
method must run these steps:
Let parent be node's parent.
If parent is null, throw an "
InvalidNodeTypeError".Let index be the index of node.
Set start to the boundary point (parent, index).
Set end to the boundary point (parent, index plus one).
The
selectNodeContents(node)
method must run these steps:
If node is a doctype, throw an "
InvalidNodeTypeError".Let length be the length of node.
Set start to the boundary point (node, 0).
Set end to the boundary point (node, length).
The
compareBoundaryPoints(how, sourceRange)
method must run these steps:
-
If how is not one of
throw a "
NotSupportedError" exception. If context object's root is not the same as sourceRange's root, throw a "
WrongDocumentError" exception.-
If how is:
START_TO_START:-
Let this point be the context object's start.
Let other point be sourceRange's start.
START_TO_END:-
Let this point be the context object's end.
Let other point be sourceRange's start.
END_TO_END:-
Let this point be the context object's end.
Let other point be sourceRange's end.
END_TO_START:-
Let this point be the context object's start.
Let other point be sourceRange's end.
-
If the position of this point relative to other point is
The deleteContents()
method must run these steps:
Let original start node, original start offset, original end node, and original end offset be the context object's start node, start offset, end node, and end offset, respectively.
If original start node and original end node are the same, and they are a
Text,ProcessingInstruction, orCommentnode, replace data with node original start node, offset original start offset, count original end offset minus original start offset, and data the empty string, and then terminate these steps.Let nodes to remove be a list of all the nodes that are contained in the context object, in tree order, omitting any node whose parent is also contained in the context object.
If original start node is an inclusive ancestor of original end node, set new node to original start node and new offset to original start offset.
-
Otherwise:
Let reference node equal original start node.
While reference node's parent is not null and is not an inclusive ancestor of original end node, set reference node to its parent.
-
Set new node to the parent of reference node, and new offset to one plus the index of reference node.
If reference node's parent were null, it would be the root of the context object, so would be an inclusive ancestor of original end node, and we could not reach this point.
If original start node is a
Text,ProcessingInstruction, orCommentnode, replace data with node original start node, offset original start offset, count original start node's length minus original start offset, data the empty string.For each node in nodes to remove, in tree order, remove node from its parent.
If original end node is a
Text,ProcessingInstruction, orCommentnode, replace data with node original end node, offset 0, count original end offset and data the empty string.
The method must run these steps:
Let frag be a new
DocumentFragmentwhose node document is the same as the node document of the context object's start node.Let original start node, original start offset, original end node, and original end offset be the context object's start node, start offset, end node, and end offset, respectively.
-
If original start node equals original end node, and they are a
Text,ProcessingInstruction, orCommentnode:Let clone be a clone of original start node.
Set the data of clone to the result of substringing data with node original start node, offset original start offset, and count original end offset minus original start offset.
Append clone to frag.
Replace data with node original start node, offset original start offset, count original end offset minus original start offset, and data the empty string.
Return frag.
Let common ancestor be original start node.
While common ancestor is not an inclusive ancestor of original end node, set common ancestor to its own parent.
If original start node is an inclusive ancestor of original end node, let first partially contained child be null.
Otherwise, let first partially contained child be the first child of common ancestor that is partially contained in the context object.
If original end node is an inclusive ancestor of original start node, let last partially contained child be null.
-
Otherwise, let last partially contained child be the last child of common ancestor that is partially contained in the context object.
These variable assignments do actually always make sense. For instance, if the original start node is not an inclusive ancestor of the original end node, the original start node is itself partially contained in the range, and so are all its ancestors up until a child of the common ancestor. The common ancestor can't be original start node, because it must be an inclusive ancestor of the original end node. The other case is similar. Also, notice that the two children will never be equal if both are defined.
Let contained children be a list of all children of common ancestor that are contained in the context object, in tree order.
-
If any member of contained children is a
DocumentType, throw a "HierarchyRequestError" exception.We do not have to worry about the first or last partially contained node, because a
DocumentTypecan never be partially contained. It cannot be a boundary point of a range, and it cannot be the ancestor of anything. If original start node is an inclusive ancestor of original end node, set new node to original start node and new offset to original start offset.
-
Otherwise:
- Let reference node equal original start node.
- While reference node's parent is not null and is not an inclusive ancestor of original end node, set reference node to its parent.
- Set new node to the parent of reference node,
and new offset to one plus the index of reference node.
If reference node's parent were null, it would be the root of the context object, so would be an inclusive ancestor of original end node, and we couldn't reach this point.
-
If first partially contained child is a
Text,ProcessingInstruction, orCommentnode:In this case, the first partially contained child is the original start node.
Let clone be a clone of original start node.
Set the data of clone to the result of substringing data with node original start node, offset original start offset, and count original start node's length minus original start offset.
Append clone to frag.
Replace data with node original start node, offset original start offset, count original start node's length minus original start offset, and data the empty string.
-
Otherwise, if first partially contained child is not null:
Let clone be a clone of first partially contained child.
Append clone to frag.
- Let subrange be a new
Rangewhose start is (original start node, original start offset) and whose end is (first partially contained child, length of first partially contained child). - Let subfrag be the result of calling
extractContents()on subrange.Is this method of recursing black-box detectable? E.g., would it fire extra DOM mutation events or something? What we really mean is to get a list of nodes to insert, then insert them directly into frag, without an intermediate document fragment.
- For each child of subfrag, in tree order, append that child to clone.
For each contained child in contained children, append contained child to frag.
-
If last partially contained child is a
Text,ProcessingInstruction, orCommentnode:In this case, the last partially contained child is the original end node.
Let clone be a clone of original end node.
Set the data of clone to the result of substringing data with node original end node, offset 0, and count original end offset.
Append clone to frag.
Replace data with node original end node, offset 0, count original end offset, and data the empty string.
-
Otherwise, if last partially contained child is not null:
Let clone be a clone of last partially contained child.
Append clone to frag.
- Let subrange be a new
Rangewhose start is (last partially contained child, 0) and whose end is (original end node, original end offset). - Let subfrag be the result of calling
extractContents()on subrange. For each child of subfrag, in tree order, append that child to clone.
Return frag.
The cloneContents()
method must run these steps:
Let frag be a new
DocumentFragmentwhose node document is the same as the node document of the context object's start node.Let original start node, original start offset, original end node, and original end offset be the context object's start node, start offset, end node, and end offset, respectively.
-
If original start node equals original end node, and they are a
Text,ProcessingInstruction, orCommentnode:Let clone be a clone of original start node.
Set the data of clone to the result of substringing data with node original start node, offset original start offset, and count original end offset minus original start offset.
Append clone to frag.
Return frag.
Let common ancestor be original start node.
While common ancestor is not an inclusive ancestor of original end node, set common ancestor to its own parent.
If original start node is an inclusive ancestor of original end node, let first partially contained child be null.
Otherwise, let first partially contained child be the first child of common ancestor that is partially contained in the context object.
If original end node is an inclusive ancestor of original start node, let last partially contained child be null.
- Otherwise, let last partially contained child be the
last child of
common ancestor that is partially contained in
the context object.
These variable assignments do actually always make sense. For instance, if the original start node is not an inclusive ancestor of the original end node, the original start node is itself partially contained in the range, and so are all its ancestors up until a child of the common ancestor. The common ancestor can't be original start node, because it must be an inclusive ancestor of the original end node. The other case is similar. Also, notice that the two children will never be equal if both are defined.
Let contained children be a list of all children of common ancestor that are contained in the context object, in tree order.
-
If any member of contained children is a
DocumentType, throw a "HierarchyRequestError" exception.We don't have to worry about the first or last partially contained node, because a
DocumentTypecan never be partially contained. It can't be a boundary point of a range, and it can't be the ancestor of anything. -
If first partially contained child is a
Text,ProcessingInstruction, orCommentnode:In this case, the first partially contained child is the original start node.
Let clone be a clone of original start node.
Set the data of clone to the result of substringing data with node original start node, offset original start offset, and count original start node's length minus original start offset.
Append clone to frag.
-
Otherwise, if first partially contained child is not null:
Let clone be a clone of first partially contained child.
Append clone to frag.
- Let subrange be a new
Rangewhose start is (original start node, original start offset) and whose end is (first partially contained child, length of first partially contained child). - Let subfrag be the result of calling
cloneContents()on subrange.Is this method of recursing black-box detectable? E.g., would it fire extra DOM mutation events or something? What we really mean is to get a list of nodes to insert, then insert them directly into frag, without an intermediate document fragment.
For each child of subfrag, in tree order, append that child to clone.
-
For each contained child in contained children:
-
If last partially contained child is a
Text,ProcessingInstruction, orCommentnode:In this case, the last partially contained child is the original end node.
Let clone be a clone of original end node.
Set the data of clone to the result of substringing data with node original end node, offset 0, and count original end offset.
Append clone to frag.
-
Otherwise, if last partially contained child is not null:
Let clone be a clone of last partially contained child.
Append clone to frag.
- Let subrange be a new
Rangewhose start is (last partially contained child, 0) and whose end is (original end node, original end offset). - Let subfrag be the result of calling
cloneContents()on subrange. For each child of subfrag, in tree order, append that child to clone.
Return frag.
The
insertNode(node)
method must run these steps:
If start node is either a
ProcessingInstructionorCommentnode, or aTextnode whose parent is null, throw an "HierarchyRequestError" exception.If start node is a
Textnode, split it with offset context object's start offset, and let reference node be the result.Otherwise, let reference node be the child of start node whose index is start offset, or null if there is no such child.
If reference node is null, let parent be start node.
Otherwise, let parent be the parent of reference node.
Let new offset be the index of reference node, or parent's length if reference node is null.
Add node's length to new offset, if node is a
DocumentFragment. Otherwise add one to new offset.Pre-insert node into parent before reference node.
If start and end are the same, set end to (parent, new offset).
The
surroundContents(newParent)
method must run these steps:
If a non-
Textnode is partially contained in the context object, throw an "InvalidStateError" exception.If newParent is a
Document,DocumentType, orDocumentFragmentnode, throw an "InvalidNodeTypeError" exception.- Call
extractContents()on the context object, and let fragment be the result. If newParent has children, replace all with null within newParent.
- Call
insertNode(newParent)on the context object. - Call
appendChild(fragment)on newParent. - Call
selectNode(newParent)on the context object.
The cloneRange()
method must return a new range with the
same start and
end as the context object.
The detach() method must
do nothing. Its functionality (disabling a
Range object) was removed, but the method itself is preserved
for compatibility.
- position = range .
comparePoint( parent, offset ) Returns −1 if the point is before the range, 0 if the point is in the range, and 1 if the point is after the range.
- intersects = range .
intersectsNode( node ) Returns whether range intersects node.
The
isPointInRange(node, offset)
must run these steps:
If node's root is different from the context object's root, return false.
If node is a doctype, throw an "
InvalidNodeTypeError" exception.If offset is greater than node's length, throw an "
IndexSizeError" exception.If (node, offset) is before start or after end, return false.
Return true.
The
comparePoint(node, offset)
method must run these steps:
If node's root is different from the context object's root, throw a "
WrongDocumentError" exception.If node is a doctype, throw an "
InvalidNodeTypeError" exception.If offset is greater than node's length, throw an "
IndexSizeError" exception.Return 0.
The
intersectsNode(node)
method must run these steps:
The stringifier must run these steps:
Let s be the empty string.
If start node equals end node, and it is a
Textnode, return the substring of thatTextnode's data beginning at start offset and ending at end offset.If start node is a
Textnode, append to s the substring of that node's data from the start offset until the end.Append to s the concatenation, in tree order, of the data of all
Textnodes that are contained in the context object.If end node is a
Textnode, append to s the substring of that node's data from its start until the end offset.Return s.
The following extensions to the Range interface are defined
in various other specifications:
7 Traversal
NodeIterator and TreeWalker objects can be used
to filter and traverse node
trees.
Each NodeIterator and TreeWalker object has an
associated active flag to avoid
recursive invocations. It is initially unset.
Each NodeIterator and TreeWalker object also
has an associated root
node,
whatToShow bitmask, and
filter callback.
To filter node run these steps:
If active flag is set throw an "
InvalidStateError".Let n be node's
nodeTypeattribute value minus 1.If the nth bit (where 0 is the least significant bit) of whatToShow is not set, return
FILTER_SKIP.If filter is null, return
FILTER_ACCEPT.Set the active flag.
Let result be the return value of invoking filter.
Unset the active flag.
If an exception was thrown, re-throw the exception.
Return result.
interface NodeIterator {
[SameObject] readonly attribute Node root;
readonly attribute Node referenceNode;
readonly attribute boolean pointerBeforeReferenceNode;
readonly attribute unsigned long whatToShow;
readonly attribute NodeFilter? filter;
Node? nextNode();
Node? previousNode();
void detach();
};
NodeIterator objects can be created using the
createNodeIterator()
method.
Each NodeIterator object has an associated
iterator collection, which is a
collection rooted at
root, whose filter matches any
node.
Before a node is removed from the iterator collection, these steps must be run:
If the node is not a descendant of root and is not an ancestor of the
referenceNodeattribute value or thereferenceNodeattribute value itself, terminate these steps.If the
pointerBeforeReferenceNodeattribute value is false, set thereferenceNodeattribute to the first node preceding the node that is being removed, and terminate these steps.If the
pointerBeforeReferenceNodeattribute value is true and there is a node following the node that is being removed, set thereferenceNodeattribute to the first such node, and terminate these steps.Set the
referenceNodeattribute to the first node preceding the node that is being removed and set thepointerBeforeReferenceNodeattribute to false.
As mentioned earlier NodeIterator objects have an
associated active flag,
root
node,
whatToShow bitmask, and
filter callback as well.
The root attribute
must return root.
The
referenceNode
and
pointerBeforeReferenceNode
attributes must return what they were initialized to.
The whatToShow
attribute must return
whatToShow.
The filter
attribute must return filter.
To traverse in direction direction run these steps:
Let node be the value of the
referenceNodeattribute.Let before node be the value of the
pointerBeforeReferenceNodeattribute.-
Run these substeps:
-
- If direction is next
-
If before node is false, let node be the first node following node in the iterator collection. If there is no such node return null.
If before node is true, set it to false.
- If direction is previous
-
If before node is true, let node be the first node preceding node in the iterator collection. If there is no such node return null.
If before node is false, set it to true.
Filter node and let result be the return value.
-
If result is
FILTER_ACCEPT, go to the next step in the overall set of steps.Otherwise, run these substeps again.
-
Set the
referenceNodeattribute to node, set thepointerBeforeReferenceNodeattribute to before node, and return node.
The nextNode()
method must traverse in
direction next.
The
previousNode()
method must traverse in
direction previous.
The detach()
method must do nothing. Its functionality (disabling a
NodeIterator object) was removed, but the method itself is preserved
for compatibility.
interface TreeWalker {
[SameObject] readonly attribute Node root;
readonly attribute unsigned long whatToShow;
readonly attribute NodeFilter? filter;
attribute Node currentNode;
Node? parentNode();
Node? firstChild();
Node? lastChild();
Node? previousSibling();
Node? nextSibling();
Node? previousNode();
Node? nextNode();
};
TreeWalker objects can be created using the
createTreeWalker() method.
As mentioned earlier TreeWalker objects have an
associated active flag,
root
node,
whatToShow bitmask, and
filter callback.
The root attribute must
return root.
The whatToShow
attribute must return
whatToShow.
The filter attribute
must return filter.
The currentNode
attribute must return what it was initialized to.
Setting the currentNode
attribute must set it to the new value.
The parentNode()
method must run these steps:
Let node be the value of the
currentNodeattribute.-
While node is not null and is not root, run these substeps:
Let node be node's parent.
If node is not null and filtering node returns
FILTER_ACCEPT, then set thecurrentNodeattribute to node, return node.
Return null.
To traverse children of type type, run these steps:
Let node be the value of the
currentNodeattribute.Set node to node's first child if type is first, and node's last child if type is last.
-
Main: While node is not null, run these substeps:
Filter node and let result be the return value.
If result is
FILTER_ACCEPT, then set thecurrentNodeattribute to node and return node.-
If result is
FILTER_SKIP, run these subsubsteps:Let child be node's first child if type is first, and node's last child if type is last.
If child is not null, set node to child and goto Main.
-
While node is not null, run these subsubsteps:
Let sibling be node's next sibling if type is first, and node's previous sibling if type is last.
If sibling is not null, set node to sibling and goto Main.
Let parent be node's parent.
If parent is null, parent is root, or parent is
currentNodeattribute's value, return null.Otherwise, set node to parent.
Return null.
The firstChild()
method must traverse children
of type first.
The lastChild()
method must traverse children
of type last.
To traverse siblings of type type run these steps:
Let node be the value of the
currentNodeattribute.If node is root, return null.
-
Run these substeps:
Let sibling be node's next sibling if type is next, and node's previous sibling if type is previous.
-
While sibling is not null, run these subsubsteps:
Set node to sibling.
Filter node and let result be the return value.
If result is
FILTER_ACCEPT, then set thecurrentNodeattribute to node and return node.Set sibling to node's first child if type is next, and node's last child if type is previous.
If result is
FILTER_REJECTor sibling is null, then set sibling to node's next sibling if type is next, and node's previous sibling if type is previous.
Set node to its parent.
If node is null or is root, return null.
Filter node and if the return value is
FILTER_ACCEPT, then return null.Run these substeps again.
The
nextSibling()
method must traverse siblings
of type next.
The
previousSibling()
method must traverse siblings
of type previous.
The
previousNode()
method must run these steps:
Let node be the value of the
currentNodeattribute.-
While node is not root, run these substeps:
Let sibling be the previous sibling of node.
-
While sibling is not null, run these subsubsteps:
Set node to sibling.
Filter node and let result be the return value.
While result is not
FILTER_REJECTand node has a child, set node to its last child and then filter node and set result to the return value.If result is
FILTER_ACCEPT, then set thecurrentNodeattribute to node and return node.Set sibling to the previous sibling of node.
Set node to its parent.
Filter node and if the return value is
FILTER_ACCEPT, then set thecurrentNodeattribute to node and return node.
Return null.
The nextNode()
method must run these steps:
Let node be the value of the
currentNodeattribute.Let result be
FILTER_ACCEPT.-
Run these substeps:
-
While result is not
FILTER_REJECTand node has a child, run these subsubsteps:Set node to its first child.
Filter node and set result to the return value.
If result is
FILTER_ACCEPT, then set thecurrentNodeattribute to node and return node.
-
If a node is following node and is not following root, set node to the first such node.
Otherwise, return null.
Filter node and set result to the return value.
If result is
FILTER_ACCEPT, then set thecurrentNodeattribute to node and return node.Run these substeps again.
-
callback interface NodeFilter {
// Constants for acceptNode()
const unsigned short FILTER_ACCEPT = 1;
const unsigned short FILTER_REJECT = 2;
const unsigned short FILTER_SKIP = 3;
// Constants for whatToShow
const unsigned long SHOW_ALL = 0xFFFFFFFF;
const unsigned long SHOW_ELEMENT = 0x1;
const unsigned long SHOW_ATTRIBUTE = 0x2; // historical
const unsigned long SHOW_TEXT = 0x4;
const unsigned long SHOW_CDATA_SECTION = 0x8; // historical
const unsigned long SHOW_ENTITY_REFERENCE = 0x10; // historical
const unsigned long SHOW_ENTITY = 0x20; // historical
const unsigned long SHOW_PROCESSING_INSTRUCTION = 0x40;
const unsigned long SHOW_COMMENT = 0x80;
const unsigned long SHOW_DOCUMENT = 0x100;
const unsigned long SHOW_DOCUMENT_TYPE = 0x200;
const unsigned long SHOW_DOCUMENT_FRAGMENT = 0x400;
const unsigned long SHOW_NOTATION = 0x800; // historical
unsigned short acceptNode(Node node);
};
NodeFilter objects can be used as
filter callback and provide
constants for the whatToShow
bitmask.
It is typically implemented as an JavaScript function.
These constants can be used as callback return value:
FILTER_ACCEPT(1);FILTER_REJECT(2);FILTER_SKIP(3).
These constants can be used for the whatToShow bitmask:
SHOW_ALL(4294967295, FFFFFFFF in hexadecimal);SHOW_ELEMENT(1);SHOW_TEXT(4);SHOW_PROCESSING_INSTRUCTION(64, 40 in hexadecimal);- (128, 80 in hexadecimal);
SHOW_DOCUMENT(256, 100 in hexadecimal);SHOW_DOCUMENT_TYPE(512, 200 in hexadecimal);SHOW_DOCUMENT_FRAGMENT(1024, 400 in hexadecimal).
8 Sets
Yes, the names DOMTokenList and
DOMSettableTokenList are unfortunate legacy mishaps.
interface DOMTokenList {
readonly attribute unsigned long length;
getter DOMString? item(unsigned long index);
boolean contains(DOMString token);
void add(DOMString... tokens);
void remove(DOMString... tokens);
boolean toggle(DOMString token, optional boolean force);
stringifier;
};
A DOMTokenList object has an associated ordered set of
tokens, which is initially empty.
A DOMTokenList object also has an associated
element and an
attribute's
local name.
A DOMTokenList object's
update steps are:
If there is no associated attribute (when the object is a
DOMSettableTokenList), terminate these steps.Set an attribute for the associated element using associated attribute's local name and the result of running the ordered set serializer for tokens.
tokenlist . lengthReturns the number of tokens.
tokenlist . item(index)tokenlist[index]Returns the token with index index.
tokenlist . contains(token)-
Returns true if token is present, and false otherwise.
Throws a "
SyntaxError" exception if token is the empty string.Throws an "
InvalidCharacterError" exception if token contains any ASCII whitespace. tokenlist . add(tokens…)-
Adds all arguments passed, except those already present.
Throws a "
SyntaxError" exception if one if the arguments is the empty string.Throws an "
InvalidCharacterError" exception if one of the arguments contains any ASCII whitespace. tokenlist . remove(tokens…)-
Removes arguments passed, if they are present.
Throws a "
SyntaxError" exception if one if the arguments is the empty string.Throws an "
InvalidCharacterError" exception if one of the arguments contains any ASCII whitespace. tokenlist . toggle(token [, force])-
If force is not given, "toggles" token, removing it if it's present and adding it if it's not. If force is true, adds token (same as
add()). If force is false, removes token (same asremove()).Returns true if token is now present, and false otherwise.
Throws a "
SyntaxError" exception if token is empty.Throws an "
InvalidCharacterError" exception if token contains any spaces.
The length
attribute must return the number of tokens in the
tokens.
The object's supported property indices are the numbers in the range zero to the number of tokens in tokens minus one, unless tokens is empty, in which case there are no supported property indices.
The
item(index)
method must run these steps:
If index is equal to or greater than the number of tokens in tokens, return null.
Return the indexth token in tokens.
The
contains(token)
method must run these steps:
If token is the empty string, then throw a "
SyntaxError" exception.If token contains any ASCII whitespace, then throw an "
InvalidCharacterError" exception.Return true if token is in tokens, and false otherwise.
The
add(tokens…)
method must run these steps:
If one of tokens is the empty string, throw a "
SyntaxError" exception.If one of tokens contains any ASCII whitespace, then throw an "
InvalidCharacterError" exception.For each token in tokens, in given order, that is not in tokens, append token to tokens.
Run the update steps.
The
remove(tokens…)
method must run these steps:
If one of tokens is the empty string, throw a "
SyntaxError" exception.If one of tokens contains any ASCII whitespace, then throw an "
InvalidCharacterError" exception.For each token in tokens, remove token from tokens.
Run the update steps.
The
toggle(token, force)
method must run these steps:
If token is the empty string, throw a "
SyntaxError" exception.If token contains any ASCII whitespace, throw an "
InvalidCharacterError" exception.-
If token is in tokens, run these substeps:
If force is either not passed or is false, then remove token from tokens, run the update steps, and return false.
Otherwise, return true.
-
Otherwise, run these substeps:
If force is passed and is false, return false.
Otherwise, append token to tokens, run the update steps, and return true.
The stringifier must return the result of the ordered set serializer for tokens.
interface DOMSettableTokenList : DOMTokenList { attribute DOMString value; };
A DOMSettableTokenList object is equivalent to a
DOMTokenList object without an associated
attribute.
tokenlist . value-
Returns the associated set as string.
Can be set, to change the associated set via a string.
9 Historical
As explained in goals this specification is a significant revision of various DOM specifications. This section attempts to enumerate the changes.
9.1 DOM Events
These are the changes made to the features described in the "DOM Event Architecture", "Basic Event Interfaces", "Mutation Events", and "Mutation Name Event Types" chapters of DOM Level 3 Events. The other chapters are defined by the UI Events specification. [DOM3EVENTS] [UIEVENTS]
- Events have constructors now.
- Removes
MutationEvent, andMutationNameEvent. - Fire is no longer synonymous with dispatch, but includes initializing an event.
- The propagation and canceled flags are unset when invoking
initEvent()rather than after dispatch.
9.2 DOM Core
These are the changes made to the features described in DOM Level 3 Core.
DOMString and
DOMTimeStamp are now defined in Web IDL.
Node now inherits from EventTarget.
Nodes are implicitly adopted across document boundaries.
Doctypes now always have a node document and can be moved across document boundaries.
ProcessingInstruction now inherits from
CharacterData.
DOMError is completely redesigned.
The remainder of interfaces and interface members listed in this section were removed to simplify the DOM platform. Implementations conforming to this specification will not support them.
It is not yet clear if it would be web-compatible to remove all the following features. The editors welcome any data showing that some of these features should be reintroduced.
Interfaces:
CDATASectionDOMConfigurationDOMErrorHandlerDOMImplementationListDOMImplementationSourceDOMLocatorDOMObjectDOMStringListDOMUserDataEntityEntityReferenceNamedNodeMapNameListNotationTypeInfoUserDataHandler
Interface members:
Node-
hasAttributes()attributesnamespaceURIprefixlocalNameisSupportedgetFeature()getUserData()setUserData()isSameNode()
Document-
createCDATASection()createAttribute()createAttributeNS()createEntityReference()inputEncodingxmlEncodingxmlStandalonexmlVersionstrictErrorCheckingdomConfignormalizeDocument()renameNode()
DOMImplementationAttr-
No longer inherits from
Nodeand therefore completely changed. Element-
getAttributeNode()getAttributeNodeNS()setAttributeNode()removeAttributeNode()schemaTypeInfosetIdAttribute()setIdAttributeNS()setIdAttributeNode()
DocumentType-
entitiesnotationsinternalSubset
Text-
isElementContentWhitespacereplaceWholeText()
9.3 DOM Ranges
These are the changes made to the features described in the "Document Object Model Range" chapter of DOM Level 2 Traversal and Range.
9.4 DOM Traversal
These are the changes made to the features described in the "Document Object Model Traversal" chapter of DOM Level 2 Traversal and Range.
References
- [CSSOMVIEW]
- (Non-normative) CSSOM View Module, Simon Pieters and Glenn Adams. W3C.
- [DOM2TR]
- (Non-normative) Document Object Model (DOM) Level 2 Traversal and Range Specification, Joe Kesselman, Jonathan Robie, Mike Champion et al.. W3C.
- [DOM3CORE]
- (Non-normative) Document Object Model (DOM) Level 3 Core Specification, Arnaud Le Hors, Philippe Le Hégaret, Lauren Wood et al.. W3C.
- [DOM3EVENTS]
- (Non-normative) Document Object Model (DOM) Level 3 Events Specification, Travis Leithead. W3C.
- [DOMPS]
- (Non-normative) DOM Parsing and Serialization, Ms2ger. WHATWG.
- [ELEMENTTRAVERSAL]
- (Non-normative) Element Traversal Specification, Doug Schepers. W3C.
- [ENCODING]
- Encoding, Anne van Kesteren. WHATWG.
- [HTML]
- HTML, Ian Hickson. WHATWG.
- [ORIGIN]
- The Web Origin Concept, Adam Barth. IETF.
- [RFC2119]
- Key words for use in RFCs to Indicate Requirement Levels, Scott Bradner. IETF.
- [SELECTORS]
- Selectors, Elika J. Etemad and Tab Atkins Jr.. W3C.
- [SELECTORSAPI]
- (Non-normative) Selectors API Level 2, Lachlan Hunt. W3C.
- [UIEVENTS]
- UI Events, Gary Kacmarcik and Travis Leithead. W3C.
- [URL]
- URL, Anne van Kesteren. WHATWG.
- [WEBIDL]
- Web IDL, Cameron McCormack. W3C.
- [XML]
- Extensible Markup Language, Tim Bray, Jean Paoli, C. M. Sperberg-McQueen et al.. W3C.
- [XMLNS]
- Namespaces in XML, Tim Bray, Dave Hollander, Andrew Layman et al.. W3C.
Acknowledgments
Thanks to Adam Klein, Adrian Bateman, Alex Russell, Arkadiusz Michalski, Arun Ranganathan, Jake Archibald, Boris Zbarsky, Brandon Slade, Brandon Wallace, Brian Kardell, Cameron McCormack, Christophe Dumez, Daniel Glazman, David Bruant, David Flanagan, David Håsäther, Dethe Elza, Dimitri Glazkov, Domenic Denicola, Dominic Cooney, Dominique Hazaël-Massieux, Erik Arvidsson, Glenn Maynard, Harald Alvestrand, Henri Sivonen, Igor Bukanov, Jacob Rossi, Jake Verbaten, James Graham, Jens Lindström, João Eiras, Jonas Sicking, Joshua Bell, 呂康豪 (Kang-Hao Lu), Kevin Sweeney, Manish Tripathi, Marcos Caceres, Mark Miller, Mats Palmgren, Mounir Lamouri, Michael™ Smith, Ojan Vafai, Olli Pettay, Ondřej Žára, Philip Jägenstedt, Rafael Weinstein, Rick Waldron, Robbert Broersma, Robin Berjon, Rune F. Halvorsen, Ryosuke Niwa, Seo Sanghyeon, Shiki Okasaka, Stig Halvorsen, Tab Atkins, Timo Tijhof, Travis Leithead, Yehuda Katz, and Zack Weinberg for their useful comments.
Special thanks to Sam Sneddon and Simon Pieters for first specifying the Nodes section of this specification and their useful comments.
Special thanks also to Ian Hickson for first specifying some parts of this specification in HTML and his useful comments. [HTML]
Finally, while this specification has been written from scratch, special thanks should also be extended to the editors of the various specifications that previously defined the features in this specification: Arnaud Le Hors, Björn Höhrmann, Doug Schepers, Gavin Nicol, Joe Kesselman, Jonathan Robie, Lachlan Hunt, Lauren Wood, Mike Champion, Peter Sharpe, Philippe Le Hégaret, Robin Berjon, Steve Byrne, Tom Pixley, and Vidur Apparao.