23. XHTML Scripting Module

Contents

This section is normative.

The Scripting Module defines elements that are used to contain information pertaining to executable scripts or the lack of support for executable scripts. Elements and attributes included in this module are:

Elements Attributes Minimal Content Model
script Common, charset (Charset), declare ("declare") xml:space="preserve" PCDATA | script

When this module is used, the script element is added to the Structural and Text content sets of the Structural and Text Modules. In addition, the script element is added to the content model of the head element defined in the Document Module.

Implementation: RELAX NG

23.1. The script element

Attributes

The Common collection
A collection of other attribute collections, including: Core, Events, I18N, Bi-directional, Edit, Embedding, Map, Metainformation, and Hypertext
declare = "declare"
When present, this boolean attribute makes the current object element a declaration only - not one that is to be executed until after the document has completed loading and has been called through a user event such as selecting an anchor that references the object.
charset = Charset
This attribute specifies the character encoding of the resource designated by the link. Please consult the section on character encodings for more details.

The script element places a script within a document. This element may appear any number of times in the head or body of an XHTML document.

The script may be defined within the contents of the script element or in an external file. If the src attribute is not set, user agents must interpret the contents of the element as the script. If the src has a URI value, user agents must ignore the element's contents and retrieve the script via the URI. Note that the charset attribute refers to the character encoding of the script designated by the src attribute; it does not concern the content of the script element.

23.1.1. Rules for processing scripts

Scripts are evaluated by script engines that must be known to a user agent.

A user agent must interpret a script element according to the following precedence rules:

  1. The user agent must first try to process the script element, but not the embedded content.
  2. If the user agent is not able to process the script for any reason (configured not to, no support of the scripting language, no access to an external resource, etc.), it must try to process its contents.
  3. If the content is inline text it must be evaluated as script data of the scripting language of the containing script element.
  4. If the content is a script element, its content should be processed according to these rules.

The syntax of script data depends on the scripting language.

23.1.2. Specifying the scripting language

As XHTML does not rely on a specific scripting language, document authors must explicitly tell user agents the language of each script. This may be done either through a default declaration or a local declaration.

23.1.3. Declaration of a scripting language

The type attribute must be specified for each script element instance in a document.

In this example, we include one script in the header, whose script is located in an external file and is in the scripting language "text/vbscript". The JavaScript code contained in the inner script will be evaluated if and only if the user agent isn't evaluating the outer script. We also include one script in the body, which contains its own script written in "text/x-perl".

<html xmlns="http://www.w3.org/2002/06/xhtml2">
 <head>
  <title>A document with script</title>
  <script type="text/x-vbscript" src="http://example.org/progs/vbcalc">
   <script type="text/javascript">
    ...some inline JavaScript...
   </script>
  </script>
 </head>
 <body>
    <script type="text/x-perl"/>
 </body>
</html>

23.1.4. Dynamic modification of documents

The processing model of XML means that the EcmaScript method document.write cannot be used in XHTML2. To dynamically generate content in XHTML you have to add elements to the DOM tree using DOM calls [DOM] rather than using document.write to generate text that then gets parsed.