[whatwg] Exposing EventTarget to JavaScript
Erik Arvidsson
erik.arvidsson at gmail.com
Fri Apr 24 14:54:45 PDT 2009
Forwarded to public-webapps at w3.org
On Fri, Apr 24, 2009 at 14:52, Alex Russell <slightlyoff at google.com> wrote:
> On Fri, Apr 24, 2009 at 2:42 PM, Boris Zbarsky <bzbarsky at mit.edu> wrote:
>> Alex Russell wrote:
>>>
>>> Something missing from this (and from Erik's original mail) is the
>>> ability to enumerate listeners.
>>
>> This has been brought up before.
>>
>> 1) There are some serious security concerns here.
>> 2) It's not clear what the enumeration should actually return.
>> EventListener objects? JS Function objects? Something else?
>> Last I checked people couldn't even agree on this (both have
>> pros and cons).
>
> Array of function objects. That would let you do useful things with it
> like unshifting onto the front or slicing to remove some set of
> listeners.
>
>> And other than a debugger, I have yet to see a usecase for this. Do you
>> have a specific one in mind?
>>
>>> Even in the XHR case, adding more than one listener is currently a
>>> pain.
>>
>> How so, exactly?
>
> Aaron's note about addEventListener solves it, but in the common case
> where a JS system wants to have multiple callbacks, they either wind
> up carrying around their own event listener system (e.g.,
> dojo.connect()) or a Deferred pattern to wrap functions which only
> support direct dispatch from a single call site.
>
>>> Part of the goal here would be to make event dispatch across
>>> lists of listeners as natural in JS as it is in DOM.
>>
>> The only natural thing in DOM is the event flow from target to root. That
>> concept doesn't make much sense in the absence of a linear data structure
>> (the list of ancestors, here).
>
> I think what I'd like to see is a way for this interface to allow
> arbitrary JS object to specify what their "ancestor" is. That way
> hierarchical JS objects can dispatch "up".
>
>> Is your real use case just to call a bunch of listeners in a defined order?
>
> Consider some API that defines an "event":
>
> thinger = {
> happened: function(){
> // processes some state here
> }
> };
>
> Today, JS toolkits provide various ways of listening for something
> invoking this. In Dojo, I'd say:
>
> dojo.connect(thinger, "happened", function(){ ... });
>
> Other systems have similar conveniences, but in general they all exist
> to keep developers from needing to do:
>
> (function() {
> var old_happened = thinger.happened;
> thinger.happened = function() {
> // ...
> return old_happened.apply(this, arguments);
> };
> })();
>
> This method of building "callbacks" on existing APIs is not, to use
> your word, "sane".
>
> Regards
>
--
erik
More information about the whatwg
mailing list