W3C home > Mailing lists > Public > www-dom@w3.org > January to March 2013

Re: Better event listeners

From: Glenn Maynard <glenn@zewt.org>
Date: Fri, 11 Jan 2013 09:30:02 -0600
Message-ID: <CABirCh92Wjdn=wAE-erQhSTEBbjvvv3Ubz=433xbr+qEgvL=iA@mail.gmail.com>
To: Anne van Kesteren <annevk@annevk.nl>
Cc: brandon.wallace@yahoo.com, Domenic Denicola <domenic@domenicdenicola.com>, Jake Verbaten <raynos2@gmail.com>, "www-dom@w3.org" <www-dom@w3.org>
On Thu, Jan 10, 2013 at 6:47 AM, Anne van Kesteren <annevk@annevk.nl> wrote:

> On Thu, Jan 10, 2013 at 3:35 AM, Jonas Sicking <jonas@sicking.cc> wrote:
> > In order for that to work you need to do selector-based filtering of
> > event.target, not event.currentTarget.
>
> Yeah, my bad.
>

(Just sanity checking: you're getting my mail, right?  I mentioned this
early in the thread.)


On Thu, Jan 10, 2013 at 7:41 AM, Anne van Kesteren <annevk@annevk.nl> wrote:

> On Thu, Jan 10, 2013 at 2:38 PM,  <brandon.wallace@yahoo.com> wrote:
> > I believe it has been mentioned that an object leaves the door open for
> future enhancements.  Returning only a function limits your options for
> future enhancements.
>
> Given that there's ample precedence for such APIs in setInterval() and
> such I'm not too worried about that. Enhancements will always be
> possible one way or another. Memory usage and added complexity are
> also considerations.
>

setInterval is a terrible legacy API that shouldn't be mimiced.  It has no
isolation between code; any script can do for(i=0; i<100000;++i)
clearInterval(i); and clear timers for code it has nothing to do with.
 This isn't possible with event listeners: if you don't have a reference to
the appropriate object--the listener function, currently--it's impossible
to accidentally unregister it.

I don't know why returning a function would use less memory than returning
an object, since functions *are* objects, and the function would still need
to be a closure.  (I wouldn't be surprised if implementing the function
version is actually more work in some browsers, since while returning an
object is commonplace, creating a closure from native code may be less
common.  But I'm not an implementor, so a parenthetical...)

On Fri, Jan 11, 2013 at 7:33 AM, Anne van Kesteren <annevk@annevk.nl> wrote:

> What future headaches? As I said before, thus far we never found a
> need to expand this kind of API. See setInterval(),
> addEventListener(), ...


setInterval is orders of magnitude simpler API than DOM events, so it isn't
a useful comparison.  I don't understand the reference to addEventListener
(events are exactly what we're talking about expanding on right now).

I've already given an example of something else this API might do in the
future, based on an actual, live API.
http://prototypejs.org/doc/latest/dom/Event/Handler/prototype/start/index.html


On Thu, Jan 10, 2013 at 9:19 AM, Robin Berjon <robin@w3.org> wrote:

> Actually, just because it's a function doesn't mean it can't be extended:
>
> var obj = function () { console.log("stop"); };
> obj.start = function () { console.log("start"); };
> obj();
> obj.start();
>
> Whether that's elegant is another question.


This is exactly the sort of nasty contortion I mentioned earlier--something
we clearly wouldn't want to have to do.

Returning an object is also clearer, since it gives the method a name;
returning a function is opaque.  I don't know why we'd deviate from the
standard pattern here.

-- 
Glenn Maynard
Received on Friday, 11 January 2013 15:30:35 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Friday, 11 January 2013 15:30:42 GMT