- From: John Boyer <boyerj@ca.ibm.com>
- Date: Thu, 14 Feb 2008 12:59:03 -0800
- To: public-webapi@w3.org, www-html-editor@w3.org
- Message-ID: <OFBCA64F19.FF08D201-ON882573EF.00073E01-882573EF.00734469@ca.ibm.com>
Due to my work on XForms, I am fairly familiar with the XML Events
recommendation [1].
[1] XML Events. http://www.w3.org/TR/2003/REC-xml-events-20031014/
It is odd that a citation of DOM 2 Events [2] appears in the normative
references considering that none of the normative sections of [1] make a
direct reference to it, only the informative sections.
[2] DOM 2 events.
http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/
As a result, in the normative part of XML Events [2], I am led to believe
that the following has a reasonable meaning:
<someElement id="X"/>
<ev:listener event="some-event" target="X" observer="X" phase="capture"
...> ... </listener>
This listener element listens for the occurrence of some-event at the
element identified by X in the capture phase of the event propagation.
Further, the event is also targeted at X.
The normative description of the phase attribute takes the trouble to note
that a non-bubbling event cannot have an observer other than the target,
but it makes no note to the effect that the observer for an event in the
capture phase must be an ancestor of the target.
So, one goes to the handy (informative) introduction to XML events, which
does reference DOM 2 events, and then explains in both words and picture
that the capture phase of an event includes the entire path from the root
element to the target element of the event: "... when an event occurs it
is dispatched by passing it down the document tree in a phase called
capture to the element where the event occurred (called its target), "
*** Alas the the second paragraph of Section 1.2.2 of DOM 2 Events [2]
does not support the above claim. It states clearly that if you have a
listener for an event at the target in the capture phase, the handler will
not occur. Therefore, I would ask that an erratum be published for XML
events [1] to correct both the wording and the diagram in Section 1, and
add a note to the normative description of the phase attribute. Then,
please update the spec as soon as possible, and use the update as a means
to restore the current XML Events recommendation to the short name
http://www.w3.org/TR/xml-events/ (right now, links to this short name have
incorrectly been directed to the working draft for XML Events 2).
*** Please also correct the intro section and normative text of the phase
attribute in XML Events 2, since the same problems are there too.
The next problem is that XML Events [1] seems to amalgamate the event at
the target and the bubbling of the event into a single phase called
"default". This seems to match DOM 2 Events, but it is broken because
events that don't bubble still occur on the target. It is also
inconvenient because it forces me to put an ID on an element if I want to
listen for an event that is targeted at that element while ignoring the
same event if it bubbles up from a descendant of that element.
In XForms, I want to be able to do something like this, only without using
an ID:
<trigger id="X">
<label>Submit</label>
<action ev:event="DOMActivate" ev:target="X">
<send if="no errors" submission="doSubmission"/>
<message if="some error condition">
There is an error. Are you sure?
<submit
submission="doSubmission"><label>Yes</label></submit>
<trigger><label>No</label></trigger>
</message>
</action>
</trigger>
With this markup, the trigger and submit elements could be presented as
buttons. When the button corresponding to the outer trigger is pressed,
the trigger receives a DOMActivate event, which runs the handler code in
the action element. If there is "some error condition" then a message
action runs that asks the user if they are sure. If they press the button
for either the Yes submit or the No trigger, that element receives a
DOMActivate. Since DOMActivate bubbles, the outermost trigger also sees
the event. However, the action handler also contains ev:target="X", which
means that the outer trigger's action handler will only run when it
observes a DOMActivate that is targeted at the element with ID of X.
This is how we avoid a loop of the outer action handler when that action
handler contains elements that are targets for the same kind of event that
the handler handles.
I would like to be able to do this without the use of an ID, and I believe
it can be done by separating the bubble phase from the target phase. In
other words, I believe the following markup would work:
<trigger>
<label>Submit</label>
<action ev:event="DOMActivate" ev:phase="target">
<send if="no errors" submission="doSubmission"/>
<message if="some error condition">
There is an error. Are you sure?
<submit
submission="doSubmission"><label>Yes</label></submit>
<trigger><label>No</label></trigger>
</message>
</action>
</trigger>
If you look at the working draft of DOM 3 events [3], it appears that the
phases have been more rigorously defined. The capture phase excludes the
target, but the bubble phase excludes the target as well, and the target
is given a phase of its own.
[3] DOM 3 events. http://www.w3.org/TR/DOM-Level-3-Events/
But there are the following problems:
*** In [3], the text separates the three phases, but the interface for
EventTarget in section 1.6 does not properly support the distinction. XML
events is a markup that maps to what the interface functions can actually
do, not just what the spec says, so this needs to be fixed. Specifically,
the methods all have a boolean parameter called useCapture. This allows
you to say whether or not the event listener is on the capture phase, but
a boolean is insufficient now that there are three phases. As you can see
from above, I would like to be able to invoke addEventListener() and use
neither capture nor bubble.
*** The XML Events 2 spec is still based on DOM 2 events. It needs to
upgrade to DOM 3 events so that we can get access to this extra phase.
Finally, I believe that DOM 3 events is missing a feature. In the XForms
spec, I wanted to be able to describe the behavior of repeat index
updating in terms of handlers for the events xforms-insert and
xforms-delete. But if the form author writes their own handlers for those
events, it seems reasonable that the repeat index should already have been
updated before the form author's handlers run. So, I wanted to be able to
have a listener for "the event at the target in the capture phase" since
the form author's handlers would be likely to listen for "the event at the
target in the bubble phase" (i.e. the default phase). I also wanted the
form author to be able to handle the xforms-insert or xforms-delete
*before* repeat index updating by listening for the event on the parent of
the target in the capture phase.
But it seems there is no way to handle an event at the target in the
capture phase, so the XForms repeat index updaters need to listen for the
xforms-insert and xforms-delete on the parent of the target in the capture
phase. In turn, this means that if a form author wants to do something
with those events before repeat index updating, then they must listen for
the events in the capture phase on the grandparent of the target. The
problem is that the grandparent of the target is not going to be an
element in the XForms namespace, so it is very unclean to tell a form
author that they have to set up handlers for XForms constructs, but the
only way to do it is to listen on elements that are not in XForms.
*** Net-net, I need a way to push my event handler on the target to the
front of the queue of stuff that happens at the target. It is almost as
if we need not just "AT_TARGET" phase, but rather "ENTERING_TARGET" and
"EXITING_TARGET". Could you please consider adding a feature like this?
Thanks,
John M. Boyer, Ph.D.
Senior Technical Staff Member
Lotus Forms Architect and Researcher
Chair, W3C Forms Working Group
Workplace, Portal and Collaboration Software
IBM Victoria Software Lab
E-Mail: boyerj@ca.ibm.com
Blog: http://www.ibm.com/developerworks/blogs/page/JohnBoyer
Blog RSS feed:
http://www.ibm.com/developerworks/blogs/rss/JohnBoyer?flavor=rssdw
Received on Thursday, 14 February 2008 20:59:23 UTC