W3C home > Mailing lists > Public > www-dom@w3.org > April to June 2013

Re: Exceptions in event listeners triggered by dispatchEvent().

From: Bjoern Hoehrmann <derhoermi@gmx.net>
Date: Tue, 18 Jun 2013 00:51:03 +0200
To: Ian Hickson <ian@hixie.ch>
Cc: Jonas Sicking <jonas@sicking.cc>, Anne van Kesteren <annevk@annevk.nl>, "www-dom@w3.org" <www-dom@w3.org>, John Barton <johnjbarton@google.com>
Message-ID: <jq1vr896lvp87fkjdepl65jt13fvgks54l@hive.bjoern.hoehrmann.de>
* Ian Hickson wrote:
>The usual pattern when dispatching an event is:
>
>   <something happens>
>   dispatch an event to notify user code!
>   was the event canceled? if not, do the default action
>
>It would be weird if this wasn't synchronous. I'm not really sure how you 
>would do the default action. Certainly it would mean that the default 
>action was no longer in the same task as the <something happens>, which is 
>weird. Think about browser events (either by analogy or as a concrete 
>example, depending on whether you'd want this to apply to all events or 
>only those dispatched from script): you click on a checkbox, its .value 
>changes, an event is fired, and if it's canceled, the .value is changed 
>back. It'd be pretty weird if this happened asynchronously.

That case does not match the usual pattern you describe above, rather it
is doing the default action, dispatching the event, and than undoing the
default action. And even the usual pattern is fairly defective when you
have more than one listener and only want to react to an event if it is
not canceled by any of the listeners, or want to undo any side-effects
if it was canceled as the case may be; only the dispatching code can do
that properly.

A simple example would be a listener on a <form> element that cancels
all checkbox clicks if some condition is not met, and some listeners on
the checkboxes that trigger side-effects assuming that the clicks will
not be canceled. That will result in an inconsistent application state,
and the only way to avoid that is to trigger the side-effects after the
dispatchEvent call has returned, only then would it be known whether any
of the listeners prevented the default action. And when you do that, I
do not really see how asynchronous dispatch would add much weirdness.
-- 
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Am Badedeich 7 · Telefon: +49(0)160/4415681 · http://www.bjoernsworld.de
25899 Dagebüll · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/ 
Received on Monday, 17 June 2013 22:51:36 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 20 October 2015 10:46:21 UTC