On 4/24/12 4:34 PM, Glenn Maynard wrote:
This is a common misconception of how events work.  If you're a browser,
default events do not--except for one or two web-compat exceptions--look
like this:

browse_button.addEventListener("click", function(e) { if(e.isTrusted)
openFilePicker(); }, false);
browse_button.dispatchEvent(clickEvent);

Rather, they look like this:

if(browse_button.dispatchEvent(clickEvent))
     openFilePicker();

Actually, no. The way events work, at least in Gecko, is more like this (conceptually; the actual implementation is somewhat different):

  browse_button.addEventListenerInSystemEventGroup("click",
    function(e) {
      if (e.isTrusted && !e.defaultPrevented) {
        e.preventDefault();
        openFilePicker();
      }
    }, false);

This is needed because there might be multiple things that might wish to perform a default action based on a click (in particular, every single thing the click bubbles through), and the code that actually dispatches a click can't possibly have an idea of the full set of default actions involved. The dispatch code then looks like this:

  someNode.dispatchEvent(clickEvent);

and has no idea whether it's going to a browse_button or to a <span> which has an <a href> on the ancestor chain.

The "default action"--openFilePicker()--is not part of the event
dispatch process; it's part of the caller of the dispatch.

That's a convenient spec fiction, but actually hard to implement that way; it requires some way for the event dispatch process to communicate to the caller of the dispatch the set of desired default actions. See the hoops that the spec has to jump through to deal with nested activation behavior, for example....

Oh, and that's before we get into default actions implemented by extensions.

(DOM3's language
about "default actions" confuses this; I suggest reading DOM4's event
section to get a good picture of how this actually works.)

Or rather how the DOM4 editor is choosing to conceptualize it, which may not have much bearing on how it actually works in actual browsers.

(The main exception is the "click" event

And a rather big exception it is!

-Boris

Reply via email to