- From: Garrett Smith <dhtmlkitchen@gmail.com>
- Date: Wed, 25 Feb 2009 13:26:37 -0800
- To: Olli Pettay <Olli.Pettay@helsinki.fi>
- Cc: WebApps WG <public-webapps@w3.org>
On Wed, Feb 25, 2009 at 10:16 AM, Olli Pettay <Olli.Pettay@helsinki.fi> wrote:
> On 2/25/09 7:46 PM, Garrett Smith wrote:
>>
>> On Wed, Feb 25, 2009 at 8:27 AM, Charles McCathieNevile
>> <chaals@opera.com> wrote:
>>>
>>> Hi folks,
>>>
>>> unfortunately I have not been able to catch up with Doug (a combination
>>> of
>>> both of us travelling and then I had a minor accident that put me out of
>>> commission for a while), so as far as I know we have no agenda planned
>>> for
>>> tonight's call.
>>>
>>> The call is booked:
>>> Telephone: +1.617.761.6200 meeting code 3663 (DOM3).
>>> Pacific time: 11.30am - 1pm
>>> Boston time: 2.30pm - 4pm
>>> UTC: 1930Z - 2100Z
>>> CET: 2030 - 2200
>>>
>>> If anyone would like to hold a call, please reply to this thread - if
>>> there
>>> are no replies in the next 90 minutes (by 1900CET, 10am Pacific, 1pm
>>> Boston), we will postpone the restart until next week, and Doug and I
>>> will
>>> coordinate to ensure there is an agenda.
>>>
>>
>> It might be worth discussing the load event;
>> http://www.w3.org/TR/DOM-Level-3-Events/events.html#event-load
>>
>> Seems that it is "specified" to fire on Document or Element (instead
>> of window).
>
>
> HTML 5 says that "If the Document is in a browsing context, then queue a
> task to fire a load event at the Document's Window object."
> And that is what at least Gecko does.
>
> 'load' is a special event in many ways. 'load' events dispatched somewhere
> in document (for example for <img>) don't propagate to 'window'. And the
> 'load' event which is dispatched to 'window', has 'document' as its target.
> This all is required for backwards compatibility.
>
I see.
window does implement EventTarget
. It has addEventListener, removeEventListener, and dispatchEvent. The
callback gets the |event| parameter.
In Webkit/Gecko, the |event.target| is document.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>load</title>
<script type="text/javascript">
window.addEventListener('load', function(ev) {
var m = document.getElementById('m');
m.firstChild.data = "this: " + this +
"\nev.target: " + ev.target +
"\nev.currentTarget: " + ev.currentTarget;
}, false);
</script>
</head>
<body>
<pre id="m">Loading...</pre>
</body>
</html>
Results:
Opera
this: [object Window]
ev.target: [object Window]
ev.currentTarget: [object Window]
Firefox:
this: [object Window]
ev.target: [object HTMLDocument]
ev.currentTarget: [object Window]
Webkit:
this: [object DOMWindow]
ev.target: [object HTMLDocument]
ev.currentTarget: null
> This is related to http://www.w3.org/2008/webapps/track/issues/44
>
>
I see Jonas' comment along the lines of "when we tried to implement it
this way, it broke sites"; Arguably, sites that expected event.target
to be document were already broken. Those sites were expecting
nonstandard behavior which does not work in Opera.
The other consideration is that adding a load event to document. Just
use the example above and change window.addEventListener to
document.addEventListener. The result is:
Webkit, Gecko: "Loading..."
Opera:
this: [object HTMLDocument]
ev.target: [object HTMLDocument]
Opera also (oddly) supports load event on document.body as an
intrinsic event. The target is also window.
<!DOCTYPE HTML>
<html lang="en">
<head>
<title>body onload</title>
</head>
<body>
<pre id="m">Loading...</pre>
<script type="text/javascript">
document.body.onload = function(ev) {
var m = document.getElementById('m');
m.firstChild.data = "this: " + this +
"\nev.target: " + ev.target;
};
</script>
</body>
</html>
Opera:
this: [object Window]
ev.target: [object Window]
Opera also supports intrinsic load event on document. Change the
example above to |document.onload = function(ev) |.
Result in Opera:
this: [object HTMLDocument]
ev.target: [object HTMLDocument]
Interesting stuff. I wonder why Opera implemented that.
As an author, I would favor window.addEventListener. In the callback
would not expect anything of ev.target, but could expect |this ===
window|.
Garrett
[1]http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Registration-interfaces
Received on Wednesday, 25 February 2009 21:27:13 UTC