Scripts allow authors to add interactivity to their documents.
Authors are encouraged to use declarative alternatives to scripting where possible, as declarative mechanisms are often more maintainable, and many users disable scripting.
For example, instead of using script to show or hide a section
   to show more details, the details element could be
   used.
Authors are also encouraged to make their applications degrade gracefully in the absence of scripting support.
For example, if an author provides a link in a table header to dynamically resort the table, the link could also be made to function without scripts by requesting the sorted table from the server.
script elementsrc
   attribute, depends on the value of the type attribute, but must match
   script content restrictions.src
   attribute, the element must be either empty or contain only
   script documentation that also matches script
   content restrictions.srcasyncdefertypecharsetinterface HTMLScriptElement : HTMLElement {
           attribute DOMString src;
           attribute boolean async;
           attribute boolean defer;
           attribute DOMString type;
           attribute DOMString charset;
           attribute DOMString text;
};
   The script element allows authors to include dynamic
  script and data blocks in their documents. The element does not
  represent content for the user.
When used to include dynamic scripts, the scripts may either be
  embedded inline or may be imported from an external file using the
  src attribute. If the language
  is not that described by "text/javascript",
  then the type attribute must
  be present, as described below.
When used to include data blocks (as opposed to scripts), the
  data must be embedded inline, the format of the data must be given
  using the type attribute, and
  the src attribute must not be
  specified.
The type
  attribute gives the language of the script or format of the data. If
  the attribute is present, its value must be a valid MIME
  type. The charset parameter must not be
  specified. The default, which is used if the attribute is absent,
  is "text/javascript".
The src
  attribute, if specified, gives the address of the external script
  resource to use. The value of the attribute must be a valid
  non-empty URL potentially surrounded by spaces identifying a
  script resource of the type given by the type attribute, if the attribute is
  present, or of the type "text/javascript", if
  the attribute is absent. A resource is a script resource of a given
  type if that type identifies a scripting language and the resource
  conforms with the requirements of that language's specification.
The charset
  attribute gives the character encoding of the external script
  resource. The attribute must not be specified if the src attribute is not present. If the
  attribute is set, its value must be a valid character encoding name,
  must be an ASCII case-insensitive match for the
  preferred MIME name for that encoding, and must match
  the encoding given in the charset parameter of
  the Content-Type metadata of the
  external file, if any. [IANACHARSET]
The async and
  defer attributes
  are boolean attributes that
  indicate how the script should be executed. The defer and async attributes must not be
  specified if the src attribute
  is not present.
There are three possible modes that can be selected using these
  attributes. If the async
  attribute is present, then the script will be executed
  asynchronously, as soon as it is available. If the async attribute is not present but
  the defer attribute is
  present, then the script is executed when the page has finished
  parsing. If neither attribute is present, then the script is
  fetched and executed immediately, before the user agent continues
  parsing the page.
The exact processing details for these attributes
  are, for mostly historical reasons, somewhat non-trivial, involving
  a number of aspects of HTML. The implementation requirements are
  therefore by necessity scattered throughout the specification. The
  algorithms below (in this section) describe the core of this
  processing, but these algorithms reference and are referenced by the
  parsing rules for script start
  and end tags in HTML, in foreign content, and in XML, the rules for the document.write() method, the
  handling of scripting, etc.
The defer attribute may be
  specified even if the async
  attribute is specified, to cause legacy Web browsers that only
  support defer (and not async) to fall back to the defer behavior instead of the
  synchronous blocking behavior that is the default.
Changing the src, type, charset, async, and defer attributes dynamically has no
  direct effect; these attribute are only used at specific times
  described below.
text [ = value ]Returns the contents of the element, ignoring child nodes that aren't text nodes.
Can be set, to replace the element's children with the given value.
When inserted using the document.write() method,
  script elements execute (typically synchronously), but
  when inserted using innerHTML and outerHTML attributes, they do not
  execute at all.
In this example, two script elements are used. One
   embeds an external script, and the other includes some data.
<script src="game-engine.js"></script> <script type="text/x-game-map"> ........U.........e o............A....e .....A.....AAA....e .A..AAA...AAAAA...e </script>
The data in this case might be used by the script to generate the map of a video game. The data doesn't have to be used that way, though; maybe the map data is actually embedded in other parts of the page's markup, and the data block here is just used by the site's search engine to help users who are looking for particular features in their game maps.
The following sample shows how a script element can be used to
   define a function that is then used by other parts of the
   document. It also shows how a script element can be
   used to invoke script while the document is being parsed, in this
   case to initialize the form's output.
<script>
 function calculate(form) {
   var price = 52000;
   if (form.elements.brakes.checked)
     price += 1000;
   if (form.elements.radio.checked)
     price += 2500;
   if (form.elements.turbo.checked)
     price += 5000;
   if (form.elements.sticker.checked)
     price += 250;
   form.elements.result.value = price;
 }
</script>
<form name="pricecalc" onsubmit="return false">
 <fieldset>
  <legend>Work out the price of your car</legend>
  <p>Base cost: £52000.</p>
  <p>Select additional options:</p>
  <ul>
   <li><label><input type=checkbox name=brakes> Ceramic brakes (£1000)</label></li>
   <li><label><input type=checkbox name=radio> Satellite radio (£2500)</label></li>
   <li><label><input type=checkbox name=turbo> Turbo charger (£5000)</label></li>
   <li><label><input type=checkbox name=sticker> "XZ" sticker (£250)</label></li>
  </ul>
  <p>Total: £<output name=result onformchange="calculate(form)"></output></p>
 </fieldset>
 <script>
  document.forms.pricecalc.dispatchFormChange();
 </script>
</form>
  The following lists some MIME type strings and the languages to which they refer:
application/ecmascript"application/javascript"application/x-ecmascript"application/x-javascript"text/ecmascript"text/javascript"text/javascript1.0"text/javascript1.1"text/javascript1.2"text/javascript1.3"text/javascript1.4"text/javascript1.5"text/jscript"text/livescript"text/x-ecmascript"text/x-javascript"text/javascript;e4x=1"script elementsThe textContent of a script element must match the
  script production in the following ABNF, the
  character set for which is Unicode. [ABNF]
script = data1 *( escape [ script-start data3 ] "-->" data1 ) [ escape ] escape = "<!--" data2 *( script-start data3 script-end data2 ) data1 = <any string that doesn't contain a substring that matches not-data1> not-data1 = "<!--" data2 = <any string that doesn't contain a substring that matches not-data2> not-data2 = script-start / "-->" data3 = <any string that doesn't contain a substring that matches not-data3> not-data3 = script-end / "-->" script-start = lt s c r i p t tag-end script-end = lt slash s c r i p t tag-end lt = %x003C ; U+003C LESS-THAN SIGN character (<) slash = %x002F ; U+002F SOLIDUS character (/) s = %x0053 ; U+0053 LATIN CAPITAL LETTER S s =/ %x0073 ; U+0073 LATIN SMALL LETTER S c = %x0043 ; U+0043 LATIN CAPITAL LETTER C c =/ %x0063 ; U+0063 LATIN SMALL LETTER C r = %x0052 ; U+0052 LATIN CAPITAL LETTER R r =/ %x0072 ; U+0072 LATIN SMALL LETTER R i = %x0049 ; U+0049 LATIN CAPITAL LETTER I i =/ %x0069 ; U+0069 LATIN SMALL LETTER I p = %x0050 ; U+0050 LATIN CAPITAL LETTER P p =/ %x0070 ; U+0070 LATIN SMALL LETTER P t = %x0054 ; U+0054 LATIN CAPITAL LETTER T t =/ %x0074 ; U+0074 LATIN SMALL LETTER T tag-end = %x0009 ; U+0009 CHARACTER TABULATION tag-end =/ %x000A ; U+000A LINE FEED (LF) tag-end =/ %x000C ; U+000C FORM FEED (FF) tag-end =/ %x0020 ; U+0020 SPACE tag-end =/ %x002F ; U+002F SOLIDUS (/) tag-end =/ %x003E ; U+003E GREATER-THAN SIGN (>)
When a script element contains script
  documentation, there are further restrictions on the contents
  of the element, as described in the section below.
If a script element's src attribute is specified, then the
  contents of the script element, if any, must be such
  that the value of the text IDL
  attribute, which is derived from the element's contents, matches the
  documentation production in the following
  ABNF, the character set for which is Unicode. [ABNF]
documentation = *( *( space / tab / comment ) [ line-comment ] newline )
comment       = slash star *( not-star / star not-slash ) 1*star slash
line-comment  = slash slash *not-newline
; characters
tab           = %x0009 ; U+0009 TAB
newline       = %x000A ; U+000A LINE FEED (LF)
space         = %x0020 ; U+0020 SPACE
star          = %x002A ; U+002A ASTERISK (*)
slash         = %x002F ; U+002F SOLIDUS (/)
not-newline   = %x0000-0009 / %x000B-10FFFF
                ; a Unicode character other than U+000A LINE FEED (LF)
not-star      = %x0000-0029 / %x002B-10FFFF
                ; a Unicode character other than U+002A ASTERISK (*)
not-slash     = %x0000-002E / %x0030-10FFFF
                ; a Unicode character other than U+002F SOLIDUS (/)This corresponds to putting the contents of the element in JavaScript comments.
This requirement is in addition to the earlier
  restrictions on the syntax of contents of script
  elements.
This allows authors to include documentation, such as license
   information or API information, inside their documents while still
   referring to external script files. The syntax is constrained so
   that authors don't accidentally include what looks like valid
   script while also providing a src attribute.
<script src="cool-effects.js"> // create new instances using: // var e = new Effect(); // start the effect using .play, stop using .stop: // e.play(); // e.stop(); </script>
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.