- From: Hallvord R. M. Steen <hallvord@opera.com>
- Date: Thu, 28 Dec 2006 14:53:41 +0100
- To: "Master Br" <master@sitesbr.net>, João Eiras <joao.eiras@gmail.com>
- Cc: "www-dom@w3.org" <www-dom@w3.org>, public-webapi@w3.org
On Thu, 28 Dec 2006 14:11:34 +0100, Master Br <master@sitesbr.net> wrote: > The correct behaviour for the load event in the > *window.addEventListener, is to run ONLY ONCE, as Gecko does*, because: > > Let's review some javascript: > > When you use an object + dot + function it means that this function will > be working for ONLY THAT object. I agree that this is the behaviour a script author might expect, but the DOM2 Events specification introduces something called "event capture" which means that using addEventListener on some element (such as the BODY) lets you see events directed to elements inside it. Please have a look at this section of the specification: http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget-addEventListener and you may also find this explanation useful if you are not used to reading W3C recommendations: http://dev.opera.com/articles/view/event-capture-explained/ > *window.addEventListener > *It adds an Event Listener to the Window Object. The document is the > interactive part of the window, so when the document is loaded, it MAKES > SENSE that it will fire an event to the window = THIS IS THE CORRECT > BEHAVIOR. Maybe it makes sense. If the DOM spec tells us to do something that doesn't make sense we still have to do it - that's generally how specs work. The behaviour you expect is what you get by using "false" as the third argument to addEventListener. That's what you should do. Using "true" there means "I want to run this function for ALL such events inside this window/document". If that is not what you intended, just replace "true" with "false". > See this other object and function: > *document.images[0].addEventListener > *NOW I put an Event Listener on the IMAGE object. This function will > work on the first image in the document. > http://dosergio.kit.net/test_LOAD_events.htm However, since you use "true" as the third argument here in your demo page, this function should never fire according to the DOM spec. Again Opera does it correctly and Firefox is wrong according to the spec. Please see http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-capture where it says "A capturing EventListener will not be triggered by events dispatched directly to the EventTarget upon which it is registered." Again, the behaviour you expect is achieved by using "false", creating a non-capturing event listener. For a demo of a capturing load event listener effect that is broken in Firefox due to their bug, see: http://hallvord.com/opera/demo/progress/ Please do not follow up this discussion on whether Opera or Firefox is "correct". Opera is correct, Firefox had a bug that they fixed (so you simply can't argue that what Firefox does is correct, the Firefox developers recently worked on changing it to match Opera's behaviour: https://bugzilla.mozilla.org/show_bug.cgi?id=331306 ) - and the problem is that the spec needs clarification and perhaps must change to be compatible with the web and Firefox's workaround against the pages relying on their old bugs. As I already said in a personal reply please let's not digress into discussing what browser is "better", let's discuss what behaviour is more useful and how best to solve the problem with the web and the spec being out of tune. Finally, I've been asked to use the list public-webapi@w3.org for this discussion so please reply to that list and not www-dom@w3.org . -- Hallvord R. M. Steen Core QA JavaScript tester, Opera Software http://www.opera.com/ Opera - simply the best Internet experience
Received on Thursday, 28 December 2006 13:53:14 UTC