noscript
elementhead
element of an HTML document, if there are no ancestor noscript
elements.noscript
elements.head
element: in any order, zero or more link
elements, zero or more style
elements, and zero or more meta
elements.head
element: transparent, but there must be no noscript
element descendants.HTMLElement
.The noscript
element represents nothing if scripting is enabled, and represents its children if scripting is disabled. It is used to present different markup to user agents that
support scripting and those that don't support scripting, by affecting how the document is parsed.
When used in HTML documents, the allowed content model is as follows:
head
element, if scripting is disabled for the noscript
elementThe noscript
element must contain only link
, style
, and meta
elements.
head
element, if scripting is enabled for the noscript
elementThe noscript
element must contain only text, except that invoking the HTML fragment parsing algorithm with the noscript
element as the context element and the text contents as the input must result in a list of nodes that consists only of link
, style
, and meta
elements that would be conforming if they were children of the noscript
element, and no parse errors.
head
elements, if scripting is disabled for the noscript
elementThe noscript
element's content model is transparent, with the additional restriction that a noscript
element must not have a noscript
element as an ancestor (that is, noscript
can't be nested).
head
elements, if scripting is enabled for the noscript
elementThe noscript
element must contain only text, except that the text must be such that running the following algorithm results in a conforming document with no noscript
elements and no script
elements, and such that no step in the algorithm causes an HTML parser to flag a parse error:
script
element from the document.noscript
element in the document. For every noscript
element in that list, perform the following steps:
noscript
element.noscript
element, and call these elements the before children.noscript
element, and call these elements the after children.noscript
element.innerHTML
attribute of the parent element to the value of s. (This, as a side-effect, causes the noscript
element to be removed from the document.)All these contortions are required because, for historical reasons, the noscript
element is handled differently by the HTML parser based on whether scripting was enabled or not when the parser was invoked.
The noscript
element must not be used in XML documents.
The noscript
element is only effective in the HTML syntax, it has no effect in the XHTML syntax.
In the following example, a noscript
element is used to provide fallback for a script.
<form action="calcSquare.php"> <p> <label for=x>Number</label>: <input id="x" name="x" type="number"> </p> <script> var x = document.getElementById('x'); var output = document.createElement('p'); output.textContent = 'Type a number; it will be squared right then!'; x.form.appendChild(output); x.form.onsubmit = function () { return false; } x.oninput = function () { var v = x.valueAsNumber; output.textContent = v + ' squared is ' + v * v; }; </script> <noscript> <input type=submit value="Calculate Square"> </noscript> </form>
When script is disabled, a button appears to do the calculation on the server side. When script is enabled, the value is computed on-the-fly instead.
The noscript
element is a blunt instrument. Sometimes, scripts might be enabled, but for some reason the page's script might fail. For this reason, it's generally better to avoid using noscript
, and to instead design the script to change the page from being a scriptless page to a scripted page on the fly, as in the next example:
<form action="calcSquare.php"> <p> <label for=x>Number</label>: <input id="x" name="x" type="number"> </p> <input id="submit" type=submit value="Calculate Square"> <script> var x = document.getElementById('x'); var output = document.createElement('p'); output.textContent = 'Type a number; it will be squared right then!'; x.form.appendChild(output); x.form.onsubmit = function () { return false; } x.oninput = function () { var v = x.valueAsNumber; output.textContent = v + ' squared is ' + v * v; }; var submit = document.getElementById('submit'); submit.parentNode.removeChild(submit); </script> </form>
The above technique is also useful in XHTML, since noscript
is not supported in the XHTML syntax.