- From: Sean Hogan <shogun70@westnet.com.au>
- Date: Mon, 18 Feb 2013 14:22:58 +1100
- To: Anne van Kesteren <annevk@annevk.nl>
- CC: www-dom@w3.org
On 5/01/13 11:26 PM, Anne van Kesteren wrote:
> We discussed this a long time ago. Lets try again. I think ideally we
> introduce something like http://api.jquery.com/on/ Lets not focus on
> the API for now, but on what we want to accomplish.
>
> Type and callback are the basics. Selector-based filtering of
> event.currentTarget should be there, but optional. I'm not sure about
> the data feature, Yehuda?
>
> Should we make all events bubble for the purposes of this new
> registration mechanism? I actually thought Jonas said jQuery did that
> at some point, but the jQuery documentation does not suggest it does.
>
> Should we have event-data-based filtering? E.g. developers could
> register to only get key events for the WASD keys. Optimization for
> developers could be that they get to have one callback per key,
> optimization for browsers and speed of the application would be that
> less events need to be processed ideally leading to a better user
> experience.
>
> It seems capture-listeners are not needed. At least for now.
>
>
Some use cases - mostly related to event-delegation:
1. pushState assisted navigation
This might require handling click events on all hyperlinks <a
href="..."> in the page.
Instead of attaching handlers to all <a href> in the page - most of
which will never be clicked - I would like to register one handler on
the document and use event-delegation.
A hyperlink might contain other elements meaning that the <a> is never
the `target` of the click. e.g.
<a href="/index.html"><span>Home</span></a>
Additionally, browsers have different behaviors for clicks that aren't
generated by the left button, or clicks that occur while a modifier key
(metaKey, ctrlKey, altKey) is depressed. I don't want to handle a click
in those cases.
I'd like my handler to only be called for an event matching:
{
type: 'click',
element: 'a[href]',
eventPhase: "bubbling",
button: 'left',
metaKey: false,
ctrlKey: false,
altKey: false,
shiftKey: false
}
I don't want my handler called until the event bubbles up to the
document - this will allow other handlers to prevent my handler if
appropriate. Naturally I want to know which element matched the selector.
Alternatively, if the handler is triggered as the event bubbles thru the
<a href>, I would extend the event object with fields like
{
url: event.currentTarget.href,
replace: false,
hyperlink: event.currentTarget
}
Another handler on the document would take care of pushState (if the
event hasn't been stopped or prevented).
2. Sortable table
This might involve handling all click events on <th> that are inside the
<thead> of the table.
Again, the <th> could easily contain other elements which mean it is not
the `target` of the event.
I would prefer my handler to be called as the event bubbles through the
<th>. My handler could be prevented by a capturing event handler.
I'd like my handler to only be called for click events on descendants of
the <table> that match
{
type: 'click',
element: 'thead th',
eventPhase: "bubbling",
button: 'left',
metaKey: false,
ctrlKey: false,
altKey: false,
shiftKey: false
}
3. Tree
A tree could be a base pattern for a directory, document-map, emulated
<select>.
The tree might be collapsible or sub-lists might only appear on
mouseenter. It might have dynamically generated or AJAX'd content.
It is implemented as a list of lists, perhaps like this:
<div class="tree">
<label>My Tree</label>
<ul>
<li>1
<ul>
<li>1.1</li>
<li>1.2</li>
...
</ul>
</li>
<li>2
<ul>
<li>2.1</li>
...
</ul>
</li>
...
</ul>
</div>
I want to detect UI events on any <li> in the tree, but I don't want to
add listeners up front because some items might not be present, and
especially since most of them won't ever be interacted with.
The tree might have an *active* item, which can be set by a cick. My
click handler should only be called for descendants of the <div
class="tree"> that match
{
type: 'click',
element: 'li',
eventPhase: "bubbling",
button: 'left',
metaKey: false,
ctrlKey: false,
altKey: false,
shiftKey: false
}
I need my handler to be called as the event bubbles through <li> so that
I can prevent ancestor <li>'s from also handling it.
Apologies for the verbosity. I'll add some analysis in another email.
Sean
Received on Monday, 18 February 2013 03:23:27 UTC