Copyright © 1999 W3C® (MIT, INRIA, Keio), All Rights Reserved. W3C liability, trademark, document use and software licensing rules apply.
This specification defines the XHTML Event Module, a module that provides XML languages with the ability to represent in syntax the semantics of the Document Object Model (DOM) Level 2 event interfaces [DOM2].
The DOM specifies an event model that provides the following features:
In addition, the DOM provides an event flow architecture that
describes how events are captured, bubbled, and canceled. In
summary, event flow is the process through which an event
originates from the DOM implementation and is passed into the
document object model. The methods of event capture and event
bubbling, along with various event listener registration
techniques, allow the event to then be handled in a number of ways.
It can be handled locally at the target 
Node level or centrally from a 
Node higher in the document tree.
The XHTML Event Module contains an event-target,
event-listener, and an event element. The
event-target element is used to attach an event
handler to an element. The event-listener element is
used to represent the DOM event handler. The event
element is used to represent the DOM event.
The design of the XHTML Event Module is such that it can be used together with XHTML modules [XMOD] and SMIL modules [SMOD].
This section describes the status of this document at the time of its publication. Other documents may supersede this document. The latest status of this document series is maintained at the W3C.
This is the first public working draft of the of the XHTML Event Module specification. It is guaranteed to change; anyone implementing it should realize that we will not allow ourselves to be restricted by experimental implementations when deciding whether to change the specifications.
This specification is a Working Draft of the HTML Working Group for review by W3C members and other interested parties. It is a draft document and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use W3C Working Drafts as reference material or to cite them as other than "work in progress".
Publication as a Working Draft does not imply endorsement by the W3C membership, nor of members of the HTML, SYMM, nor DOM working groups. This is still a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite W3C Working Draft as other than "work in progress."
This document has been produced as part of the W3C HTML Activity and SYMM Activity). The authors of this document are members of the HTML Working Group and the SYMM Working Group.
This document is for public review. Comments on the normative aspects of this document or the integration with XHTML should be sent to the public mailing list www-html@w3.org. Comments regarding the integration with SMIL should be sent to the public mailing list www-smil@w3.org.
A list of current W3C Recommendations and other technical documents can be found at http://www.w3.org/TR.
The Document Object Model (DOM) Level 2 specifies an event model that provides the following features:
The DOM Level 2 specification [DOM2] further specifies three classes of events: user interface events, user interface logical events, and mutation events. In addition to these three events, the XHTML Event Module specifies a trigger event.
The [DOM2] provides an event flow
architecture that describes how events are captured, bubbled, and
canceled. In summary, event flow is the process through which an
event originates from the DOM implementation and is passed into the
document object model. The methods of event capture and event
bubbling, along with various event listener registration
techniques, allow the event to then be handled in a number of ways.
It can be handled locally at the target 
Node level or centrally from a 
Node higher in the document tree.

Each event has a Node toward which the event is
directed by the DOM implementation. This Node is the
event target. In Figure 1, the event target is the node
N4. Figure 1 also shows how the event traverses the
nodes of the document tree. The event flows from the root node to
the target node passing through nodes N1, N2,
and then to the target node N4. After the event is
processed by the target node, it flows back to the root node
N1.
Event capture is the process by which an ancestor of the event's target can register to intercept events of a given type before they are received by the event's target. In Figure 1, nodes N1 and N2, as ancestors of the target node, can capture the event prior to the event reaching N4.
Event bubbling is the process by which an ancestor of the event's target can register to handle the events of a given type after they are received by the event's target. In Figure 1, nodes N1 and N2, as ancestors of the target node, can handle the event after it has reached N4.
For any given event type, capturing is either enabled or it is disabled. If any ancestor to the target node enables capturing, all ancestors of the target node (who handle the appropriate event type) will capture the event. Likewise, if any ancestor to the target node disables capturing, all ancestors of the target node (who handle the appropriate event type) can no longer capture the event.
Similarly, for any given event type, bubbling is either enabled or disabled.
This section is normative.
This working draft proposes the 
event and 
eventlistener elements to support the features of the
DOM Event Model.
The event element and the eventlistener element are named after the corresponding DOM interfaces. To avoid ambiguity in the text, when the element is referenced, the word element is used, as in:
event elementeventlistener elementIf the DOM implementation is being referenced, only the event and eventlistener term is used, as in event and eventlistener.
There is some question whether the event element is
actually needed. The working group is still exploring whether the
semantics of the event element may be collapsed into
the eventlistener element, thus reducing the syntax.
In addition, there is some concern that since the semantics of the
event element and eventlistener element
are not absolutely the same as the DOM classes of the same name,
that perhaps these elements should have different names.
<!ENTITY % event-content "EMPTY" > <!ELEMENT event (%event-content;)* <!ATTLIST event id ID #IMPLIED type NMTOKEN #REQUIRED active %Boolean #IMPLIED cancelable %Boolean #IMPLIED bubbles %Boolean #IMPLIED >
The event element provides a means for content
authors to declare a trigger event
within a document or presentation. A trigger event may activated
immediately, or it may be activated through some other means. The
event element has the following attributes:
id attribute is
a document-unique identifier for the element. The value of this
identifier is often used to manipulate the element through a DOM
interface. Note that the 
id attribute and the type attribute are not
the same. The id value
specifies a particular instance of an event. The type
value specifies a class of events that may be instantiated by
several event elements within a document.type of the event. The 
type attribute is used for associating an event
handler with an event.active attribute
is true when the all of the conditions for activating the event are
true. Content authors use this attribute to declare an event
without it actually occurring and then activate the event through a
DOM interface or through synchronization. The default value for
active is true, which
means that the event is immediately activated.
eventlistener element's prevent-default attribute or
through the DOM Event interface's preventDefault()
method. The default value for the cancelable attribute
is false, which means that the event cannot be canceled.bubbles attribute is true, which means that
the event will bubble upward after being dispatched to the target
Node.The target node for the event corresponding to an 
event element is the event element itself.
<!ENTITY % eventlistener-content "EMPTY" > <!ELEMENT eventlistener (%eventlistener-content;)* <!ATTLIST eventlistener id ID #IMPLIED type NMTOKEN #REQUIRED register-with IDREF #IMPLIED trigger-once %Boolean #IMPLIED use-capture %Boolean #IMPLIED prevent-capture %Boolean #IMPLIED prevent-bubble %Boolean #IMPLIED prevent-default %Boolean #IMPLIED >
The eventlistener element
provides a means for handling events of a particular type. The
eventlistener element has
the following attributes:
id attribute is
a document-unique identifier. The value of this identifier is often
used to manipulate the element through a DOM interface.type attribute specifies the event type for
which the content author is registering. The type
attribute has the following syntax: 
Eventhandler-types ::= ((EventSource ".") ? Event-type )* Event-source ::= Id-value Event-type ::= NMTOKEN
type attribute provides a means of having an
eventlistener register for multiple event types.register-with attribute specifies the target
Node for this eventlistener element. The
default value for the register-with attribute is
"empty", which means that the eventlistener element
registers with its parent Node. Otherwise, 
register-with is the value of desired target 
Node element's id attribute.trigger-once attribute specifies whether the
eventlistener element should be removed from its
target Node after the eventlistener has
processed the event. The default value for the 
trigger-once attribute is false, which means that the 
eventlistener remains registered with the it's target 
Node.use-capture attribute indicates that
the content author wishes to initiate capture. After initiating
capture, all events of the specified type will be dispatched to the
registered eventlistener before being dispatched to
any elements beneath the eventlistener element's
target Node in the tree. Events which are bubbling
upward through the tree will not trigger an 
eventlistener designated to use capture. The default value
for the use-capture attribute is false, which means
that event flow proceeds normally.prevent-bubble attribute is used to end the
bubbling phase of the event flow. If this attribute is true for any
eventlistener elements registered on the same target
Node during bubbling, the bubbling phase will cease at
that level and the event will not be propagated upward within the
tree. The default value for prevent-bubble attribute
is false: events will continue to bubble.prevent-capture attribute is used to end the
capturing phase of event flow. If this attribute is true for any
eventlistener elements registered on the same target
Node during capturing, the capturing phase will cease
at that level and the event will not be propagated any further
down. The default value for prevent-capture attribute
is false; events will continue through the capture phase.prevent-default
attribute is used to signify that the event is to be canceled. If,
during any stage of event flow, the prevent-default
attribute is true, the event is canceled and any default action
associated with the event will not occur. Setting this attribute to
true for a non-cancelable event has no effect. The default value
for the prevent-default attribute is false: events
will not be canceled.The Event Module will use the "http://www.w3.org/2000/event" namespace.
This section is informative.
The Event Module may be integrated into XHTML to add extensibility to the event handling already present through a variety of properties. This section is informative: it is provided as a way of explaining how the Event Module may be used with XHTML.
The first step of using the Event Module is to determine how it integrates with the other modules already in XHTML. One possible integration is to:
eventlistener element to the content model for any
existing XHTML element that supports intrinsic eventsscript element to the content model
for the 
eventlistener elementAdding the 
eventlistener element to existing XHTML content models
integrates the Event Module into XHTML; adding the 
script element to the 
eventlistener element's content model integrates XHTML
into the Event Module.
When an 
eventlistener element contains a script
element, the script element content is evaluated when
the eventlistener
element processes an event. In addition, the DOM 2 Event object
that corresponds to the event is available to the enclosed 
script element content through a "theEvent" object.
Content authors that wish to register an event handler for an
element use the 
eventlistener element.
Example 3.1
 
<img id="b" ...>
  <eventlistener id="a" type="(onclick)">
    <script>
        ... some scripting code ...
    </script>
  </eventlistener>
</img>
In Example 3.1, an 
eventlistener element is registered with the 
img element. This 
eventlistener element will be triggered when an 
onclick event targets or bubbles through the 
img element.
If the content author wishes to be more specific when declaring
an eventlistener
element, they may add the target Node's identifier to
the type attribute's
value.
Example 3.2
 
<img id="b" ...>
  <eventlistener id="a" type="id(b)(onclick)">
    <script>
        ... some scripting code ...
    </script>
  </eventlistener>
</img>
In Example 3.2, the 
eventlistener element is still registered with the
img element. In this example, however, the eventlistener will only be
triggered when an onclick event has the 
img element as its target Node.
As specified in [DOM2], if bubbling is
not prevented at the target Node, the event will
follow the target Node's parent chain upward, checking
for any 
eventlistener elements registered on each successive
Node. Therefore, the following example provides the
same behavior as that in Example 3.1.
Example 3.3
 
<div class="top">
  <eventlistener type="(onclick)">
    ...
  </eventlistener>
  <img id="start" ... />
</div>
In Example 3.3, if the bubbling of the onclick
event is not prevented by the img element, it will
bubble up to the parent Node (the div
element) and it's registered 
eventlistener. Where we see a difference in behavior is
if we introduce a second object to the tree.
Example 3.4
 
<div class="top">
  <eventlistener type="(onclick)">
    ...
  </eventlistener>
  <img id="start" ... />
  <img id="stop" ... />
</div>
In Example 3.4, we can no longer distinguish, declaratively, between events bubbling from "start" image and events bubbling from "stop" image.
If the content author wishes to distinguish between these two types of events, they could write:
Example 3.5
<div class="top">
  <eventlistener type="id(start)(onclick)">
    ...
  </eventlistener>
  <eventlistener type="id(stop)(onclick)">
    ...
  </eventlistener>
  <img id="start" ... />
  <img id="stop" ... />
</div>
In Example 3.5, the first 
eventlistener specifies the target Node
with the "start" identifier and the second eventlistener element specifies
the target Node with the "stop" identifier.
Note: the author could have achieved a similar behavior by
simply encapsulating the 
eventlistener elements within their respective 
img elements.
In the previous examples, the eventlistener element would
respond each and everytime the corresponding event passed through
its registered Node. Content authors may use the
trigger-once
attribute to control whether an eventlistener unregisters from its
Node after it has been triggered.
Example 3.6
<div>
  <img id="cow" ... />
  <img id="cat" ... />
  <eventlistener id="cow-click" type="id(cow)(onclick)" trigger-once=true >
      ...
  </eventlistener>
  <eventlistener id="cat-click" type="id(cat)(onclick)" trigger-once=true >
      ...
  </eventlistener>
</div>
In Example 3.6, the onclick event is generated each
and everytime that the user clicks on the "cow" image. The
"cow-click" event handler only responds to the first instance of
the onclick event. The same behavior is provided by
the "cat-click" event handler for 
onclick events targeting the "cat" image.
Content authors may also register an eventlistener that responds to
multiple events.
Example 3.7 <eventlistener type="(onclick)(onstopkey)"> ... </eventlistener> <img id="b" ... /> <img id="c" .../>
In Example 3.7, the 
eventlistener element is listening for two events: an
onclick event and an
onstopkey event. In
response to either of these events, the eventlistener is triggered and the
script is executed.
The DOM event model specifies that events continue to bubble up
the document tree until an event handler cancels bubbling. Content
authors may declaratively control bubbling through the 
prevent-bubble attribute. For example:
Example 3.8
 
<div>
  <eventlistener id="b" type="(onclick)" ...>
    ...
  </eventlistener>
  <img id="logo" ... />
  <div>
    <eventlistener id="a" type="(onclick)" prevent-bubble="true">
      ...
    </eventlistener>
    <img id="stop" ... />
  </div>
</div>
In Example 3.8, we have two event handers for the 
onclick event. If the user clicks on the "stop" image, it is
handled by event handler "a". Since event handler "a" cancels the
bubbling action, it is not handled by event handler "b".
Content authors may procedurally control bubbling through script that accesses the DOM:
Example 3.9
 
<div>
  <eventlistener id="b" type="(onclick)" ...>
    ...
  </eventlistener>
  <img id="logo" ... />
  <div>
    <eventlistener id="a" type="(onclick)">
      <script>
        ... some scripting code ...
         theEvent.preventBubble();
        ... some scripting code ...
      </script>
    </eventlistener>
    <img id="stop" ... />
  </div>
</div>
In Example 3.9, the 
preventBubble() method is called, ending the bubbling
phase of event flow.
Content authors that wish to capture an event use the eventlistener element:
Example 3.10 <eventlistener type="(onclick)(onstopkey)" use-capture="true" > ... </eventlistener> <img id="stop" ... /> ... </html>
In Example 3.10, the 
eventlistener is specified as a peer to the "stop"
image. Following the rules for event capturing outlined in [DOM2], if a user clicks on the object, the
onclick event is
dispatched to the target 
Node and any registered event listeners are
triggered.
Unlike previous examples, the use-capture attribute
is "true", therefore the 
eventlistener element intercepts the message before it
reaches the target Node.
This permits event handling to be centralized and isolated at a
higher location in the document hierarchy.
After the 
eventlistener has captured the event, it can let the
event continue to propagate down the hierarchy to the target Node, or it can stop propagation
by setting the prevent-capture
attribute to "true".
Example 3.11 <eventlistener type="(onclick)" use-capture="true" prevent-capture="true" > ... </eventlistener> <img id="b" ... />
In Example 3.11, the 
eventlistener element captures the event and, by
canceling the propagation of the event, effectively hides the event
from img element. This behavior can also be
accomplished through script:
Example 3.12
 
<eventlistener type="(onclick)" use-capture="true" >
   <script>
   ... some scripting code ... 
       theEvent.preventCapture(); 
   ... some scripting code ...
   </script>
</eventlistener>
<img id="b" ... />
In Example 3.12, the event node's
preventCapture()
method is used to end the capturing phase of event flow and
overrule the declarative syntax.
Content authors can specify an event that is immediately
dispatched by setting the active attribute to true.
For example:
Example 3.13 <eventlistener type="(foo)"> ... </eventlistener> <img id="b" ... > <event type="foo" /> </img>
In Example 3.13, the 
eventlistener element is associated with a "foo" event.
At some point in processing the document, the img
element is processed and the event is immediately dispatched (since
the img element contains an event
element), triggering the 
eventlistener element .
While this provides a simple syntax for declaring an event within a document, its real value may be that it provides a framework for the insertion of immediate events into the document through the DOM. For example, consider this reduction of the previous example:
Example 3.14
 
<eventlistener type="(foo)">
   <script>
      ... some scripting code ...
   </script>
</eventlistener>
<img id="b" ... />
In Example 3.14, we have removed the explicit declaration of the
event (the event element was removed). The object
might be a media player and the media player might insert the "foo"
event through the DOM. Furthermore, the event element and the 
eventlistener element may both be inserted into
the document. In this way, the event (represented by the event
element) and its associated behavior (represented by the eventlistener element) can
both be delivered in real-time.
Events can be dispatched by inserting an 
event element through
the Document Object Model, or by declaring an event element from within the document.
For example:
Example 3.15
<img id="b" ...>
  <event type="foo" active=false />
  <eventlistener type="(foo)">
    ...
  </eventlistener>
</img>
In this example, we declare an 
event element that is a "foo" event. The 
active attribute for this event element is false, which means that
while we have declared the event, it is not currently available to
the event flow architecture. If the active attribute is set
to true (perhaps through a DOM interface), the appropriate eventlistener will receive
the event.
This section is informative.
The Event Module may be integrated into SMIL to add event handling. This section is informative; it is provided as a way of explaining how the Event Module may be used with SMIL. Much of this syntax may evolve if and when SMIL adopts a user event model.
The first step of using the Event Module is to determine how it integrates with the other modules already in SMIL. One possible integration is to:
eventlistener element to the content model of the timing
structure elements
eventlistener element to the content model of the media
object elementseventlistener elementAdding the 
eventlistener element to the various SMIL element
content models provides a means of integrating the Event Module
into the SMIL language; adding the timing properties to the 
eventlistener element
provides a means of scheduling and synchronizing event
handlers.
Content authors that wish to register an event handler use the
eventlistener
element:
Example 4.1 <par> <eventlistener type="(onclick)" /> <img id="c" ... /> </par> ... </smil>
In Example 4.1, an 
eventlistener element is specified as a peer to the
img element.
Following the rules for event bubbling outlined in [DOM2], if a user clicks on the image, the onclick event is dispatched to
the target Node (image "c")
and any event handlers registered to this Node are
triggered. If bubbling is not canceled, the event will follow the
target Node's parent chain
upward, checking for any event handlers registered on each
successive Node.
In Example 4.1, the 
onclick event would bubble to the 
par element, which has registered the eventlistener element.
Content authors may also associate an event handler with a region:
Example 4.2
   
<head> 
  <layout>     
    <region id="a" top="5" />
    <eventlistener register-with="a" type="(onclick)" /> 
  </layout>   
</head>   
<body>
  <text region="a" src="text.html" dur="10s" />   
</body>    
</smil> 
In Example 4.2, the 
eventlistener element is bound to region "a" using the
register-with attribute (region is an empty element).
Registering an 
eventlistener element is of little value unless there is
a means of responding to an event. In SMIL, content authors may
control other media elements and timelines by referring to the
eventlistener
element.
Example 4.3 <par> <img id="c" ... /> <eventlistener id="a" type="(onclick)" /> <audio id="b" begin="id(a)(trigger)" ... /> </par> ... </smil>
In Example 4.3, the 
eventlistener element is specified as a peer to the
audio element and the img element. The
audio element begins playing when the eventlistener element is
triggered. In practical terms, this means that the 
audio object will begin playing when the img
has been clicked.
Adding temporal properties to the eventlistener element provides a
means for synchronizing event handlers. Content authors can enable
and disable 
eventlistener elements over time and change eventlistener elements
depending on time. For example:
Example 4.4 <par> <eventlistener id="a" type="(onclick)" begin="2s"/> <audio id="b" begin="id(a)(trigger)" ... /> <img id="c" ... /> </par>
In Example 4.4, the 
eventlistener element is not registered during the first
2 seconds of displaying the image. Using SMIL, we can then have
different 
eventlistener elements based on the current position in
the timeline. For example:
Example 4.5 <par> <eventlistener id="a" type="(onclick)" end="2s"/> <eventlistener id="d" type="(onclick)" begin="2s"/> <audio id="b" begin="id(a)(trigger)" end="id(e)(begin)"... /> <audio id="e" begin="id(b)(trigger)" ... /> <img id="b" ... /> </par>
In Example 4.5, there are two eventlistener elements. The first
eventlistener
element, "a", is active during the first 2 seconds of the timeline.
The second 
eventlistener element, "d" is active starting at 2
seconds and ending when the timeline is complete. There are two
audio files that conditionally play depending on which eventlistener element is
triggered.
Content authors may also register an eventlistener that responds to
multiple events.
Example 4.6 <par> <eventlistener id="a" type="(onclick)(onstopkey)" end="2s"/> <audio id="b" end="id(a)(trigger)"... /> <img id="c" ... /> </par> ... </smil>
In Example 4.6, the 
eventlistener element is listening for two events: an
onclick event and an
onstopkey event. In
response to either of these events, the eventlistener element is
triggered, subsequently causing the audio object to stop
playing.
The previous examples illustrated eventlistener elements that
responded to a particular type of event for all of their
descendants. In some situations, content authors may wish to handle
specific events for specific children. For example:
Example 4.7 <par> <eventlistener id="a" type="id(stop)(onclick), onstopkey" end="2s"/> <audio id="b" end="id(a)(trigger)"... /> <img id="stop" ... /> <img id="play" ... /> </par> ... </smil>
In Example 4.7, the 
eventlistener element responds to onclick
events targeting the "stop" image but not onclick
events targeting the "play" image.
Event handlers are implicitly associated with an element when an element refers to an event with that element's id:
Example 4.8 <par> <audio id="b" end="id(stop)(onclick)"... /> <img id="stop" ... /> <img id="play" ... /> </par> ... </smil>
In Example 4.8, the audio element refers to an
onclick event for the element with an id of
"stop".
Content authors may use the trigger-once attribute to
control whether an 
eventlistener unregisters from its target 
Node after it has been triggered.
Example 4.9
 
<par>
   <img id="cow" ... />
   <img id="cat" ... />
   <eventlistener id="cow-click" type="id(cow)(onclick)" trigger-once=true />
   <eventlistener id="cat-click" type="id(cat)(onclick)" trigger-once=true />
   <par begin="id(cow-click)(trigger)" ... />
      <audio id="moo" ... />
      <video id="cow-jump" ... />
   </par>
   <par begin="id(cat-click)(trigger)" ... />
      <audio id="meow" ... />
      <video id="cat-fiddle" ... />
   </par>
</par>
...
</smil>
In Example 4.9, the 
onclick event is generated each and every time that
the user selects the "cow" image. The event handler "cow-click",
however, only responds to the first instance of the onclick event, ignoring subsequent
onclick events. The same
behavior is provided by the "cat-click" event handler for onclick events targeting the
"cat" image.
The [DOM2] event model specifies that
events continue to bubble up the document tree until an event
handler cancels bubbling. Content authors may declaratively control
bubbling through the prevent-bubble
attribute. For example:
Example 4.10
 
<par>
  <eventlistener id="c" type="(onclick)" ... />
  <img id="logo" ... />
  <par>
    <eventlistener id="a" type="(onclick)" prevent-bubble="true" />
    <audio id="b" end="id(a)(trigger)" ... />
    <img id="stop" ... />
  </par>
</par>
...
</smil
In Example 4.10, we have two eventlistener elements for the
onclick event. If the user clicks on the "stop" image,
it is handled by event handler "a". Since event handler "a" cancels
the bubbling action, it is not handled by event handler "c".
Content authors that wish to capture an event use the eventlistener element:
Example 4.11 <par> <eventlistener use-capture="true" type="(onclick)" /> <img id="c" ... /> </par> ... </smil>
In Example 4.11, the 
eventlistener element is specified as a peer to image
element "c". Following the rules for event capturing outlined in
[DOM2], if a user clicks on the image, the
onclick event is
dispatched to the target 
Node (image "c") and any registered event handlers
are triggered.
Unlike the previous example, the use-capture attribute
is "true", therefore the 
eventlistener element intercepts the message from the
descendent target Node. This
permits event handling to be centralized and isolated at a higher
location in the document hierarchy.
After the 
eventlistener element has captured the event, it can let
the event continue to propagate down the hierarchy to the target
Node, or it can stop propagation by setting the 
prevent-capture attribute to "true".
Example 4.12 <par> <eventlistener use-capture="true" prevent-capture="true" type="(onclick)" /> <img id="c" ... /> </par>
In Example 4.12, the 
eventlistener element captures the event and, by
canceling the propagation of the event, effectively hides the event
from image element "c".
Content authors can specify an event that fires immediately upon activation of the enclosing timeline:
Example 4.13
 
<par>
   <eventlistener id="a" type="(onintroend)" />
   <seq>
      <audio id="b" ... />
      <event type="onintroend" />
      <video id="d" ... />
   </seq>
   <img id="e" begin="id(a)(trigger)" .../>
   ...
</par>
In Example 4.13, we have an audio element that
plays and then a video element that plays. At the end
of the audio element, an 
onintroend event is generated which triggers the
display of an img element.
While this provides a simple syntax for declaring an event within a document, its real value may be that it provides a framework for the insertion of immediate events into the document through the DOM. For example, consider this reduction of the previous example:
Example 4.14
 
<par>
   <eventlistener id="a" type="(onintroend)" />
   <seq>
      <audio id="b" ... />
      <video id="d" ... />
   </seq>
   <img id="e" begin="id(a)(trigger)" .../>
   ...
</par>
In Example 4.14, we have removed the explicit declaration of the
event. Rather, the audio player may generate an onintroend event and insert the
corresponding 
event element into the document using a DOM
interface, thereby triggering the eventlistener element.
The 
event element provides a means for declaring
events that are timed or synchronized with other element timelines.
For example:
Example 4.15 <par> <eventhandler id="a" type="(foo)" /> <audio id="b" ... /> <event type="foo" begin="id(b)2s" /> <video id="d" ... /> <img id="e" begin="id(a)(trigger)" .../> ... </par>
In Example 4.15, the 
event element is synchronized with the 
audio element "b": two seconds into playing the audio, the
"foo" event is dispatched and caught by the eventlistener. This causes the
img element to be rendered.
As in the previous section, this provides a framework for inserting timed events through a DOM interface.
Example 4.16 <par> <eventhandler id="a" type="(foo)" /> <audio id="b" ... /> <video id="d" ... /> <img id="e" begin="id(a)(trigger)" .../> ... </par>
In Example 4.16, the 
event element is no longer declared, but an external
process could insert an event element while the document is
rendering and have the "foo" event triggered at the appropriate
time. This is important in a streaming architecture when triggered
events might be streamed prior to the actual time at which they
should fire.
As previously shown, multiple events may be handled by the same
eventlistener
element. For example:
Example 4.17 <par> <eventlistener id="a" type="(foo)(onclick)" /> <audio id="b" ... /> <event id="c" type="foo" begin="id(b)10s" /> <video id="d" ... /> <img id="e" begin="id(a)(trigger)" .../> ... </par>
In Example 4.17, the 
eventlistener element responds to an onclick event and a "foo" event (the "foo" event occurs 10 seconds into the audio).
Therefore, the 
eventlistener element will be triggered when the user
clicks on a child of the par
element or after 10 seconds, whichever occurs first.
A recent working draft [BECSS] defines a means of declaring standalone behaviors that can be attached to HTML or XML elements without modification of the document type definition (DTD).
The requirements for the XHTML Event Module defined in this draft were:
The BECSS solution is considerably more expressive since it provides a mechanism for extending the properties and behaviors of an element (albeit this is benefit is not available to languages other than ECMAScript). There was no requirement on the XHTML Event Module for such capability.
The BECSS solution also provides a means of reusing event "sheets" across multiple documents (Requirements 1-4, above). External definition of events could be accomplished by linking, but reuse is limited until a selector syntax is introduced (adding complexity). There was no requirement on the XHTML Event Module for such capability.
The BECSS solution does require user agents to implement CSS in addition to XML. This limits its usefulness in languages that do require CSS (such as SMIL) and small platforms such as that proposed by the Wireless Applications Protocol Forum [REF]. The XHTML Event Module focused on ensuring that event handlers and events could participate in the SMIL time model and its intrinsic timeline behaviors.
In conclusion, while there is some overlap in functionality (they both expose the event model to programmers), the functionalities are not identical. Each solution has benefits (BECSS exposes custom properties and XHTML events simply integrate with XML), and each has its deficiencies (BECSS is complexity and requires CSS and XHTML event have no selector syntax). More importantly, these two solutions can be simultaneously supported if so desired.
[BECSS] Behavioral Extensions to CSS, Apparao V., et.al., http://www.w3.org/TR/becss. This document is a work in progress.
[DOM2] Document Object Model (DOM) Level 2 Specification, Wood L., et.al., http://www.w3.org/TR/WD-DOM-Level-2 . This document is a work in progress.