- From: Jonas Sicking <jonas@sicking.cc>
- Date: Thu, 23 Feb 2012 16:18:30 +0100
- To: Marcos Caceres <w3c@marcosc.com>
- Cc: public-webapps <public-webapps@w3.org>
On Thu, Feb 23, 2012 at 12:21 PM, Marcos Caceres <w3c@marcosc.com> wrote: > Hi, > Would it be possible for DOM4 to define a way for user objects to be able to extend EventTarget (as in Object.create(EventTarget))? > > > > The use case: give the ability to create objects that can dispatch events using native means… instead of hacking around it like so: > > var obj = Object.create(null); > var dispatcher = document.createElement("x-EventDispatcher"); > > //implement EventTarget interface on obj > Object.defineProperty(obj, "addEventListener", { > value: function(type, callback, capture){ > dispatcher.addEventListener(type, callback, capture); > } > }); > > Object.defineProperty(obj, "removeEventListener", { > value: function(type, callback, capture){ > dispatcher.removeEventListener(type, callback, capture); > } > }); > > Object.defineProperty(obj, "dispatchEvent", { > value: function(e){ > dispatcher.dispatchEvent(e); > } > }); > > > > var e = document.createEvent('CustomEvent'); > e.initEvent("myEvent", false, false, null); > dispatcher.dispatchEvent(e); > > > > Also, AFAIK, all JS frameworks have implemented custom ways of handling events and how they are dispatched, so clearly its a desired part of the platform. For example: > > http://developer.yahoo.com/yui/docs/YAHOO.util.CustomEvent.html > http://api.jquery.com/category/events/event-object/ > http://dojotoolkit.org/reference-guide/quickstart/events.html > > Developers have also built their own: > http://www.nczonline.net/blog/2010/03/09/custom-events-in-javascript/ > > Other solutions fire at the document, which means registering listeners on an object that is not the one that needs to receive the event: > http://tiffanybbrown.com/2011/10/12/dispatching-custom-dom-events/ > > So, together with CustomEvents provided by the platform, it would be nice to have a custom EventTarget to fire those things at :) I think the way we should do this is to enable instantiating EventTarget objects using an EventTarget ctor. This won't give you a neato extension syntax, but I think we'll have to rely on ES.next for that. Before ecma-script has a better solution you can always monkeypatch the object. So something like: a = new EventTarget(); b = new EventTarget(a); // a is the parent in the target chain should be doable. I don't know if we need a way to modify the parent chain after construction. It's somewhat complex to allow this while still preventing cycles from being created. / Jonas
Received on Thursday, 23 February 2012 15:19:28 UTC