Living Standard — Last Updated 10 March 2025
APIs for dynamically inserting markup into the document interact with the parser, and thus their behavior varies depending on whether they are used with HTML documents (and the HTML parser) or XML documents (and the XML parser).
Document
objects have a throw-on-dynamic-markup-insertion counter,
which is used in conjunction with the create an element for the token algorithm to
prevent custom element constructors from being
able to use document.open()
, document.close()
, and document.write()
when they are invoked by the parser.
Initially, the counter must be set to zero.
document = document.open()
Support in all current engines.
Causes the Document
to be replaced in-place, as if it was a new
Document
object, but reusing the previous object, which is then returned.
The resulting Document
has an HTML parser associated with it, which can be given
data to parse using document.write()
.
The method has no effect if the Document
is still being parsed.
Throws an DOMException if the
Document
is an XML document.
Throws an DOMException if the parser is currently executing a custom element constructor.
window = document.open(url, name, features)
Works like the window.open()
method.
Document
objects have an active parser was aborted boolean, which is
used to prevent scripts from invoking the document.open()
and document.write()
methods (directly or indirectly)
after the document's active parser has been aborted. It is initially false.
The document open steps, given a document, are as follows:
If document is an XML document, then throw an DOMException exception.
If document's throw-on-dynamic-markup-insertion counter is greater
than 0, then throw an "InvalidStateError
"
origin is not
same origin to entryDocument's origin, then throw a
DOMException
.
If document has an active parser whose script nesting level is greater than 0, then return document.
This basically causes document.open()
to
be ignored when it's called in an inline script found during parsing, while still letting it
have an effect when called from a non-parser task such as a timer callback or event handler.
Similarly, if document's unload counter is greater than 0, then return document.
This basically causes document.open()
to
be ignored when it's called from a beforeunload
, pagehide
, or unload
event
handler while the Document
is being unloaded.
If document's active parser was aborted is true, then return document.
This notably causes document.open()
to
be ignored if it is called after a navigation has started, but
only during the initial parse. See issue
#4723 for more background.
If document's node navigable is non-null and document's node navigable's ongoing navigation is a navigation ID, then stop loading document's node navigable.
For each shadow-including inclusive descendant node of document, erase all event listeners and handlers given node.
If document is the associated
Document
of document's relevant global object, then
erase all event listeners and handlers given document's relevant
global object.
Replace all with null within document.
If document is fully active, then:
Let newURL be a copy of entryDocument's URL.
If entryDocument is not document, then set newURL's fragment to null.
Run the URL and history update steps with document and newURL.
Set document's is initial about:blank
to
false.
If document's iframe load in progress flag is set, then set document's mute iframe load flag.
Set document to no-quirks mode.
Create a new HTML parser and associate it with document. This is a
script-created parser (meaning that it can be closed by the document.open()
and document.close()
methods, and that the tokenizer will wait for
an explicit call to document.close()
before emitting an
end-of-file token). The encoding confidence is
irrelevant.
Set the insertion point to point at just before the end of the input stream (which at this point will be empty).
Update the current document readiness of document to "loading
".
This causes a readystatechange
event to fire, but the event is actually unobservable to author code, because of the previous
step which erased all event listeners and
handlers that could observe it.
Return document.
The document open steps do not affect whether a Document
is ready for post-load tasks or completely loaded.
The open(unused1,
unused2)
method must return the result of running the document open
steps with this.
The unused1 and unused2 arguments are ignored, but kept in the IDL to allow code that calls the function with one or two arguments to continue working. They are necessary due to Web IDL TypeError exception for such calls had the arguments not been there. whatwg/webidl issue #581 investigates changing the algorithm to allow for their removal. [WEBIDL]
The open(url,
name, features)
method must run these steps:
If this is not fully active, then throw an DOMException exception.
Return the result of running the window open steps with url, name, and features.
document.close()
Support in all current engines.
Closes the input stream that was opened by the document.open()
method.
Throws an DOMException if the
Document
is an XML document.
Throws an DOMException if the parser is currently executing a custom element constructor.
The close()
method must run the following
steps:
If XML document, then throw
an this's throw-on-dynamic-markup-insertion counter is greater
than zero, then throw an " Insert an explicit "EOF" character at the end of the parser's input
stream. If this's pending parsing-blocking script is not null, then
return. Run the tokenizer, processing resulting tokens as they are emitted, and stopping when the
tokenizer reaches the explicit "EOF" character or spins the event loop.InvalidStateError
"
this, then
return.
document.write()
document.write(...text)
Support in all current engines.
In general, adds the given string(s) to the Document
's input stream.
This method has very idiosyncratic behavior. In some cases, this method can
affect the state of the HTML parser while the parser is running, resulting in a DOM
that does not correspond to the source of the document (e.g. if the string written is the string
"<plaintext>
" or "<!--
"). In other cases,
the call can clear the current page first, as if document.open()
had been called. In yet more cases, the method
is simply ignored, or throws an exception. Users agents are explicitly allowed to avoid executing
script
elements inserted via this method. And to make matters even worse, the
exact behavior of this method can in some cases be dependent on network latency, which can lead to failures that are very hard to debug. For all these reasons, use
of this method is strongly discouraged.
Throws an DOMException when invoked on XML documents.
Throws an DOMException if the parser is currently executing a custom element constructor.
This method performs no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
Document
objects have an ignore-destructive-writes counter, which is
used in conjunction with the processing of script
elements to prevent external
scripts from being able to use document.write()
to blow
away the document by implicitly calling document.open()
.
Initially, the counter must be set to zero.
The document write steps, given a Document
object document,
a list text, a boolean lineFeed, and a string sink, are as
follows:
Let string be the empty string.
Let isTrusted be false if text contains a string; otherwise true.
For each value of text:
If value is a TrustedHTML
object, then
append value's associated data to
string.
Otherwise, append value to string.
If isTrusted is false, set string to the result of invoking the
Get Trusted Type compliant string algorithm with
If lineFeed is true, append U+000A LINE FEED to string. If document is an XML document, then throw
an DOMExceptionthis's relevant global
object, string, sink, and "
.script
".
If document's throw-on-dynamic-markup-insertion counter is greater
than 0, then throw an "InvalidStateError
"
DOMException
.
If document's active parser was aborted is true, then return.
If the insertion point is undefined, then:
If document's unload counter is greater than 0 or document's ignore-destructive-writes counter is greater than 0, then return.
Run the document open steps with document.
Insert string into the input stream just before the insertion point.
If document's pending parsing-blocking script is null, then have the
HTML parser process string, one code point at a time, processing
resulting tokens as they are emitted, and stopping when the tokenizer reaches the insertion
point or when the processing of the tokenizer is aborted by the tree construction stage (this
can happen if a script
end tag token is emitted by the tokenizer).
If the document.write()
method was
called from script executing inline (i.e. executing because the parser parsed a set of
script
tags), then this is a reentrant invocation of the
parser. If the parser pause flag is set, the tokenizer will abort immediately
and no HTML will be parsed, per the tokenizer's parser pause
flag check.
The document.write(...text)
method steps are
to run the document write steps with this, text, false, and
"Document write
".
document.writeln()
document.writeln(...text)
Support in all current engines.
Adds the given string(s) to the Document
's input stream, followed by a newline
character. If necessary, calls the open()
method
implicitly first.
Throws an DOMException when invoked on XML documents.
Throws an DOMException if the parser is currently executing a custom element constructor.
This method performs no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
The document.writeln(...text)
method steps are
to run the document write steps with this, text, true, and
"Document writeln
".
Support in all current engines.
partial interface Element {
[CEReactions ] undefined setHTMLUnsafe ((TrustedHTML
or DOMString ) html );
DOMString getHTML (optional GetHTMLOptions options = {});
[CEReactions ] attribute (LegacyNullToEmptyString ] DOMString ) innerHTML ;
[CEReactions ] attribute (LegacyNullToEmptyString ] DOMString ) outerHTML ;
[CEReactions ] undefined insertAdjacentHTML (DOMString position , (TrustedHTML
or DOMString ) string );
};
partial interface ShadowRoot {
[CEReactions ] undefined setHTMLUnsafe ((TrustedHTML
or DOMString ) html );
DOMString getHTML (optional GetHTMLOptions options = {});
[CEReactions ] attribute (LegacyNullToEmptyString ] DOMString ) innerHTML ;
};
dictionary GetHTMLOptions {
boolean serializableShadowRoots = false ;
sequence <ShadowRoot > shadowRoots = [];
};
DOMParser
interfaceThe DOMParser
interface allows authors to create new Document
objects
by parsing strings, as either HTML or XML.
parser = new DOMParser()
Support in all current engines.
Parses string using either the HTML or XML parser, according to type,
and returns the resulting Document
. type can be "text/html
"
(which will invoke the HTML parser), or any of "text/xml
",
"application/xml
", "application/xhtml+xml
", or
"image/svg+xml
" (which will invoke the XML parser).
For the XML parser, if string cannot be parsed, then the returned
Document
will contain elements describing the resulting error.
Note that script
elements are not evaluated during parsing, and the resulting
document's encoding will always be
URL will be
inherited from parser's relevant global object.
Values other than the above for type will cause a TypeError
exception
to be thrown.
The design of DOMParser
, as a class that needs to be constructed and
then have its parseFromString()
method
called, is an unfortunate historical artifact. If we were designing this functionality today it
would be a standalone function. For parsing HTML, the modern alternative is Document.parseHTMLUnsafe()
.
This method performs no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
[Exposed =Window ]
interface DOMParser {
constructor ();
[NewObject ] Document
parseFromString ((TrustedHTML
or DOMString ) string , DOMParserSupportedType type );
};
enum DOMParserSupportedType {
" text/html " ,
" text/xml " ,
" application/xml " ,
" application/xhtml+xml " ,
" image/svg+xml "
};
The new DOMParser()
constructor
steps are to do nothing.
The parseFromString(string,
type)
method steps are:
Let compliantString be the result of invoking the this's relevant global
object, string, "DOMParser parseFromString
", and "script
".
Let document be a new Document
, whose URL.
The document's encoding will
be left as its default, of UTF-8. In particular, any XML declarations or
meta
elements found while parsing compliantString will have no effect.
Switch on type:
text/html
"Parse HTML from a string given document and compliantString.
Since document does not have a browsing context, scripting is disabled.
Create an XML parser parser, associated with document, and with XML scripting support disabled.
Parse compliantString using parser.
If the previous step resulted in an XML well-formedness or XML namespace well-formedness error, then:
creating an
element given document, "parsererror
", and "http://www.mozilla.org/newlayout/xml/parsererror.xml
".
Optionally, add attributes or children to root to describe the nature of the parsing error.
Append root to document.
Return document.
To parse HTML from a string, given a Document
document and a
string html:
Set document's type to "html
".
Create an HTML parser parser, associated with document.
Place html into the input stream for parser. The encoding confidence is irrelevant.
Start parser and let it run until it has consumed all the characters just inserted into the input stream.
This might mutate the document's mode.
element.setHTMLUnsafe(html)
Parses html using the HTML parser, and replaces the children of element with the result. element provides context for the HTML parser.
shadowRoot.setHTMLUnsafe(html)
Parses html using the HTML parser, and replaces the children of shadowRoot with the result. shadowRoot's host provides context for the HTML parser.
doc = Document.parseHTMLUnsafe(html)
Parses html using the HTML parser, and returns the resulting
Document
.
Note that script
elements are not evaluated during parsing, and the resulting
document's encoding will always be
URL will be
about:blank
.
These methods perform no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
Element
's setHTMLUnsafe(html)
method steps
are:
Let compliantHTML be the result of invoking the this's relevant global
object, html, "Element setHTMLUnsafe
", and "script
".
Let target be this's template contents if this, and compliantHTML.
ShadowRoot
's setHTMLUnsafe(html)
method steps
are:
Let compliantHTML be the result of invoking the this's relevant global
object, html, "ShadowRoot setHTMLUnsafe
", and "script
".
Unsafely set HTML given shadow host, and compliantHTML.
To unsafely set HTML, given an DocumentFragment
target, an string
html:
Let newChildren be the result of the HTML fragment parsing algorithm given contextElement, html, and true.
Let fragment be a new node
document is contextElement's Replace all with fragment within
target.
The static parseHTMLUnsafe(html)
method steps are:
Let compliantHTML be the result of invoking the this's relevant global
object, html, "Document parseHTMLUnsafe
", and "script
".
Let document be a new Document
, whose content type is "text/html
".
Since document does not have a browsing context, scripting is disabled.
Set document's allow declarative shadow roots to true.
Parse HTML from a string given document and compliantHTML.
Return document.
html = element.getHTML({ serializableShadowRoots, shadowRoots })
Returns the result of serializing element to HTML. Shadow roots within element are serialized according to the provided options:
If serializableShadowRoots
is true, then all shadow roots marked as serializable are serialized.
If the shadowRoots
array is provided, then all shadow roots specified in the array are serialized, regardless of whether or not they are marked as serializable.
If neither option is provided, then no shadow roots are serialized.
html = shadowRoot.getHTML({ serializableShadowRoots, shadowRoots })
Returns the result of serializing shadowRoot to HTML, using its Shadow roots within shadowRoot are serialized according to the provided options, as above.
Element
's getHTML(options)
method steps
are to return the result of HTML fragment serialization algorithm with
this, options["serializableShadowRoots
"],
and options["shadowRoots
"].
ShadowRoot
's getHTML(options)
method steps
are to return the result of HTML fragment serialization algorithm with
this, options["serializableShadowRoots
"],
and options["shadowRoots
"].
innerHTML
propertyThe innerHTML
property has a number of outstanding issues
in the DOM Parsing and Serialization issue
tracker, documenting various problems with its specification.
element.innerHTML
Returns a fragment of HTML or XML that represents the element's contents.
In the case of an XML document, throws a "InvalidStateError
"
DOMException
if the element cannot be serialized to XML.
element.innerHTML = value
Replaces the contents of the element with nodes parsed from the given string.
In the case of an XML document, throws a "SyntaxError
"
DOMException
if the given string is not well-formed.
shadowRoot.innerHTML
Returns a fragment of HTML that represents the shadow roots's contents.
shadowRoot.innerHTML = value
Replaces the contents of the shadow root with nodes parsed from the given string.
These properties' setters perform no sanitization to remove
potentially-dangerous elements and attributes like script
or event handler
content attributes.
The fragment serializing algorithm steps, given an Element
,
Document
, or DocumentFragment
node and a boolean require
well-formed, are:
Let context document be node's HTML document, return the result of HTML fragment serialization algorithm with node, false, and « ».
Return the XML serialization of node given require well-formed.
The fragment parsing algorithm steps, given an Element
context and a string markup, are:
Let algorithm be the HTML fragment parsing algorithm.
If context's XML document, then set algorithm to the XML fragment parsing algorithm.
Let newChildren be the result of invoking algorithm given context and markup.
Let fragment be a new For each node of newChildren, in append node to fragment. This ensures the nodes is correct. Return fragment.node
document is context's node document.
Element
's innerHTML
getter steps are to return the result of
running fragment serializing algorithm steps with this and true.
ShadowRoot
's innerHTML
getter steps are to return the result of
running fragment serializing algorithm steps with this and true.
Element
's innerHTML
setter steps
are:
Let compliantString be the result of invoking the this's relevant global
object, the given value, "Element innerHTML
", and "script
".
Let context be this.
Let fragment be the result of invoking the fragment parsing algorithm steps with context and compliantString.
If context is a template
element, then set context to
the template
element's template contents (a
DocumentFragment
).
Setting innerHTML
on a
template
element will replace all the nodes in its template contents
rather than its children.
Replace all with fragment within context.
ShadowRoot
's innerHTML
setter
steps are:
Let compliantString be the result of invoking the this's relevant global
object, the given value, "ShadowRoot innerHTML
", and "script
".
Let context be host.
Let fragment be the result of invoking the fragment parsing algorithm steps with context and compliantString.
Replace all with fragment within this.
outerHTML
propertyThe outerHTML
property has a number of outstanding issues
in the DOM Parsing and Serialization issue
tracker, documenting various problems with its specification.
element.outerHTML
Returns a fragment of HTML or XML that represents the element and its contents.
In the case of an XML document, throws a "InvalidStateError
"
DOMException
if the element cannot be serialized to XML.
element.outerHTML = value
Replaces the element with nodes parsed from the given string.
In the case of an XML document, throws a "SyntaxError
"
DOMException
if the given string is not well-formed.
Throws a DOMException if
the parent of the element is a Document
.
This property's setter performs no sanitization to remove potentially-dangerous
elements and attributes like script
or event handler content
attributes.
Element
's outerHTML
getter steps are:
Let element be a fictional node whose only child is this.
Return the result of running fragment serializing algorithm steps with element and true.
Element
's outerHTML
setter steps
are:
Let compliantString be the result of invoking the this's relevant global
object, the given value, "Element outerHTML
", and "script
".
Let parent be parent.
If parent is null, return. There would be no way to obtain a reference to the nodes created even if the remaining steps were run.
If parent is a Document
, throw a
DocumentFragment, set parent to the
result of this's
HTML
namespace.
Let fragment be the result of invoking the fragment parsing algorithm steps given parent and compliantString.
insertAdjacentHTML()
methodThe insertAdjacentHTML()
method has a number of outstanding issues in the DOM Parsing and Serialization issue tracker, documenting various problems
with its specification.
element.insertAdjacentHTML(position, string)
Parses string as HTML or XML and inserts the resulting nodes into the tree in the position given by the position argument, as follows:
beforebegin
"afterbegin
"beforeend
"afterend
"Throws a DOMException if the arguments have invalid values (e.g., in the case of an XML document, if the given string is not well-formed).
Throws a DOMException
if the given position isn't possible (e.g. inserting elements after the root element of a
Document
).
This method performs no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
Element
's insertAdjacentHTML(position,
string)
method steps are:
Let compliantString be the result of invoking the this's relevant global
object, string, "Element insertAdjacentHTML
", and "script
".
Let context be null.
Use the first matching item from this list:
afterend
"If context is null or a Document
, throw a
DOMException.
SyntaxError
" DOMException
.If context is not an Element
or all of the following are true:
context's local name is
"html
"; and
context's namespace is the HTML namespace,
set context to the result of creating an element given HTML namespace.
Let fragment be the result of invoking the fragment parsing algorithm steps with context and compliantString.
beforebegin
"afterbegin
"Insert fragment into first child.
beforeend
"afterend
"Insert fragment into this's next sibling.
As with other direct Node
-manipulation APIs (and unlike innerHTML
), insertAdjacentHTML()
does not include any special
handling for template
elements. In most cases you will want to use templateEl.content.insertAdjacentHTML()
instead of directly
manipulating the child nodes of a template
element.
createContextualFragment()
methodThe createContextualFragment()
method has a number
of outstanding issues in the DOM Parsing and Serialization issue tracker, documenting various problems
with its specification.
docFragment = range.createContextualFragment(string)
Returns a DocumentFragment
created from the markup string string using
range's start node as the context in
which fragment is parsed.
This method performs no sanitization to remove potentially-dangerous elements
and attributes like script
or event handler content attributes.
partial interface Range {
[CEReactions , NewObject ] TrustedHTML
or DOMString ) string );
};
Range
's createContextualFragment(string)
method steps are:
Let compliantString be the result of invoking the Get
Trusted Type compliant string algorithm with Let node be start
node. Let element be null. If node Elementthis's relevant global
object, string, "
, set element
to node.Range createContextualFragment
", and
"script
".
Otherwise, if node Text or
If element is null or all of the following are true: element's local name is
" element's namespace is the
HTML namespace, then set element to the result of creating an
element given HTML namespace. Let fragment node be the result of invoking the fragment parsing
algorithm steps with element and compliantString. For each script of fragment node's
Set script's already started to false. Set script's parser document to null. Return fragment node.parent
element.
html
"; andscript
element descendants:
XMLSerializer
interfaceThe XMLSerializer
interface has a number of outstanding issues in the
DOM Parsing and Serialization issue tracker, documenting various problems
with its specification. The remainder of DOM Parsing and Serialization will be
gradually upstreamed to this specification.
xmlSerializer = new XMLSerializer()
Constructs a new XMLSerializer
object.
string = xmlSerializer.serializeToString(root)
Returns the result of serializing root to XML.
Throws an DOMException if root cannot be serialized to XML.
The design of XMLSerializer
, as a class that needs to be constructed
and then have its serializeToString()
method called, is an unfortunate historical artifact. If we were designing this functionality
today it would be a standalone function.
[Exposed =Window ]
interface XMLSerializer {
constructor ();
DOMString serializeToString (Node
root );
};
The new XMLSerializer()
constructor steps are to do nothing.
The serializeToString(root)
method steps are:
Return the XML serialization of root given false.
Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!
Check out: eBank.nz (Art Generator) |
Netwrck.com (AI Tools) |
Text-Generator.io (AI API) |
BitBank.nz (Crypto AI) |
ReadingTime (Kids Reading) |
RewordGame |
BigMultiplayerChess |
WebFiddle |
How.nz |
Helix AI Assistant