- From: Jonas Sicking <jonas@sicking.cc>
- Date: Tue, 14 Mar 2006 17:04:03 -0800
- To: Maciej Stachowiak <mjs@apple.com>
- Cc: "Web APIs WG (public)" <public-webapi@w3.org>
Maciej Stachowiak wrote: >>> Here's brief outlines of the behavior I would propose. I have not >>> tested thoroughly or written any of this up in formal language, so >>> please let me know which ones need testing and formal language. >>> 1) The attribute text is coverted to a function as if it were the >>> result of the following expression evaluated in global scope, where >>> ELT is the DOM object representing the element: >>> (function() { with(ELT) { return function(event) { ...contents of >>> attribute here... } } })() >> >> There is need for additional code in here to deal with the return >> value, i.e. that returning false should call .preventDefault. Other >> then that I agree with this. > > Ugh, you're right, I forgot about this.I think the preventDefault > behavior is related to being an HTML event listener (set via <img > onclick="..."> or someImg.onclick=... ), not specifically a property of > being an attribute-created listener, which means this special behavior > can't be part of the function itself. We need an extra level of > indirection to define what happens when an HTML event listener is added > either via element attribute or JS property. > > A first stab at it would be that it's like calling addEventListener with > > function(event) { if (HTML_LISTENER.call(this, event) == false) > event.preventDefault(); } > > Where HTML_LISTENER is the html event listener function, as created from > an attribute or assigned to the HTML DOM property. This is then used as > F in the language below. Do we really only want to do this for HTML attributes? It's not a particularly beautiful thing to do, but on the other hand it's always nice when things behave everywhere. I don't necessarily have a strong opinion either way. >> However we should probably also define the scope chain for elements. >> This should clearly ideally have lived in another spec, but I guess >> we're stuck with having it in events for now? > > Scope chain for elements? I don't think they have a scope chain, as they > are not callable. Maybe I am missing someting... So we have decided that the element is the top of the scope chain. However, what does the rest of the chain look like? I.e. if a property is not found on the element, where do you look after that? This is decided by the [[parent]] of the element object, and then that objects [[parent]] property and so on. Currently in HTML the chain is element->document->window for all elements but form controls. For these the chain is formControl->form->document->window This is probably something that we should define, painful as it is. >>> 5) addEventListener does not alter any function parameters passed to >>> it. In particular it does not alter the scope chain. >>> 6) I already came up with language for this. In brief my proposal was >>> to define this as equivalent to adding an EventListener created by >>> the expression { handleEvent: function(event) { >>> F.applyTo(event.currentTarget, [event]); } } where F is the function. >> >> I would prefer if we used "call" rather then "apply" to make it clear >> that only one parameter is passed. It would also make it cheaper for >> someone implementing this literally. > > How about: > > { handleEvent: function(event) { F.call(event.currentTarget, event); } } Looks great! / Jonas
Received on Wednesday, 15 March 2006 01:04:13 UTC