- From: Alex Russell <slightlyoff@google.com>
- Date: Wed, 29 Apr 2009 11:39:19 -0700
On Fri, Apr 24, 2009 at 6:37 PM, Boris Zbarsky <bzbarsky at mit.edu> wrote: > Ojan Vafai wrote: >> >> What would be a better approach? > > I believe Alex proposed some in this thread as aliases for addEventListener. > ?Those looked a lot better to me, for what it's worth. > > If a linear list of things the event is targeting is sufficient, of course, > and we're ok with the random third argument of addEventListener being carted > around, then we might be ok using it... > > From my point of view, in addition to the things already mentioned, an issue > with addEventListener is that removing requires a match of both the listener > and the bubbles arg. ?So for example: > > ?node.addEventListener("foo", function() { ... }, false); > > if I want to remove it later, I suddenly have to pull the function out and > give it a name. ?And then on the remove end duplicate the "foo" and false. > Maybe it's just me, but I'd have much preferred something like: > > ?var token = node.addEventListener("foo", function() { ... }); > > ?// later on > ?node.removeEventListener(token); > > or some such. FWIW, dojo.connect() provides a nearly identical scheme to work around this very problem. For example, you can do: var handle = dojo.connect(node, "onclick", function(){ ... }); // or: // var handle = dojo.connect(node, "onclick", object, "method"); // // ... time passes ... dojo.disconnect(handle); This isn't quite satisfying since the case of JS dispatch and using methods from objects introduces the inevitable functions-aren't-bound ambiguity in today's JS. We can't, for example, do something like: var handle = dojo.lookupHandle(node, "onclick", object, "method"); Since internally we do the "turn methods into bound callers trick" via dojo.hitch() (aka, es5's Function.prototype.bind()). A workable system that improves on the current state should *at least* return disconnectable handles, and hopefully also provide some way to query join points for connections from both "global" function objects and scoped function objects. That is to say, it should be possible to do: nodeOrObject.unlisten("onclick", object, "method"); // or: nodeOrObject.unlisten("onclick", object.method.bind()); Regards
Received on Wednesday, 29 April 2009 11:39:19 UTC