Re: [DOM4] EventTarget as first class citizen

On Thu, Mar 22, 2012 at 7:18 AM, Olli Pettay <Olli.Pettay@helsinki.fi> wrote:
>
> On 03/06/2012 03:52 AM, Jonas Sicking wrote:
>>
>> On Mon, Mar 5, 2012 at 10:26 AM, Erik Arvidsson <arv@chromium.org> wrote:
>>>
>>> On Sat, Mar 3, 2012 at 15:40, Jonas Sicking <jonas@sicking.cc> wrote:
>>>>
>>>> Note, I don't think that anyone is suggesting to add
>>>> .parentNode/.eventTargetParent to the EventTarget interface. But
>>>> rather just to objects instantiated through the constructor described
>>>> in this thread.
>>>
>>>
>>> FWIW, some JS libraries have custom EventTarget implementations and
>>> they use parentEventTarget as a way to determine how to do the
>>> propagation.
>>>
>>> One problem with only allowing the parent in the constructor is that
>>> it becomes read only. Most use cases for custom EventTargets that
>>> involve propagation also requires being able to reparent that objects.
>>
>>
>> Cool, so if people are doing this already, with modifyable
>> .parentEventTarget, then I think we should do that. Allowing it to be
>> modified is really only a matter of checking for cycles the the
>> property is assigned to.
>>
>> / Jonas
>>
>
>
> I wouldn't actually add anything to EventTarget, since nodes etc are event
> targets and we don't want to have
> somenode.parentEventTarget.
>
> Could we have
> [Constuctor]
> interface EventReceiver : EventTarget {
>  attribute EventTarget parent;
> }

This would be ok with me. It does mean that pages would have to
instantiate 'EventReceiver' rather than 'EventTarget' which I think is
unfortunate. But it does avoid having to place a getter/setter
directly on the object returned from the EventTarget ctor.

To be clear, what I was thinking was to add something like the equivalent of:

function EventTarget(parent) {
  var parent;
  Object.defineProperty(this, "parentEventTarget", {
    get: function() { return parent; },
    set: function(newparent) {
      ... check for cycles ...;
      parent = newparent;
  });
  if (parent) {
    this.parentEventTarget = parent;
  }

  return this;
}

Obviously the implementation would be different, but the above
describes the API that the page would see.

/ Jonas

Received on Thursday, 22 March 2012 22:31:26 UTC