JavaScript Events
January 18, 2006
I’m trying to help out the MochiKit and Dojo projects by writing an event normalizer. I’m tired of writing or finding one-off functions to solve this problem, and want something that will return accurate cursor and element coordinates.
I built a test page to collect seven browsers’ interpretations of a set of event properties. The only event property I normalized was event.target, I left everything else alone. The proxy.* values are calculated based on some assumptions I had about how the browsers interpreted the target’s position (proxy.pos), the cursor position relative to the document (proxy.page), the cursor position relative to the target (proxy.targetOffset), and the cursor position relative to the target’s positioning context (proxy.contextOffset). I used Pixie (Mac) and ZoomPlusU (PC) to position the cursor on every test.
My code still needs some work.
Note that Firefox 1.5 (Gecko 2005-11-11) introduced an off-by-one bug to the event.layerX and event.layerY properties. It’s been fixed in the latest nightly builds.
Also note that IE’s clientX and clientY properties are off by two pixels. From MSDN: “In Microsoft Internet Explorer 5, the window's upper-left is at 2,2 (pixels) with respect to the true client.” The proxy.page.x/y and .targetOffset.x/y variables seem to be relatively consistent up until test point five, when I measure point (1,1) in the document's first absolutely positioned element.
A lot of libraries do something like:
event.layerX = event.layerX || event.offsetX
This is incorrect, layerX and offsetX are not equivalent.
Here is the test page. (Hold down the alt key and click on any part of the page to get a variable dump.) I did nine manual tests at different points in the document, starting from the top left corner of the document. I’ve included Pixie screenshots to show where I’m taking my sample.
There is still a lot of work to do, and I would really appreciate your feedback on what I’ve got so far. You can reach me at beau@hartshorne.ca.
One

| Apple WebKit / 417.9 Safari / 417.8 | Apple WebKit / 420+ Safari / 417.8 | Gecko / 2005-09-15 Firefox / 1.0.7 | Gecko / 2005-11-11 Firefox / 1.5 | Gecko / 2006-01-17 Firefox / 1.6a1 | MSIE / 6.0. 2900. 2180 | Opera 8.5 / Build 2173 | |
|---|---|---|---|---|---|---|---|
| event.target.id | html | html | html | html | html | html | html |
| event.pageX | 1 | 1 | 1 | 1 | 1 | - | 1 |
| event.pageY | 1 | 1 | 1 | 1 | 1 | - | 1 |
| event.offsetX | 1 | 1 | - | - | - | 1 | 1 |
| event.offsetY | 1 | 1 | - | - | - | 1 | 1 |
| event.layerX | 1 | 1 | 1 | 2 | 1 | - | - |
| event.layerY | 1 | 1 | 1 | 2 | 1 | - | - |
| event.clientX | 1 | 1 | 1 | 1 | 1 | 3 | 1 |
| event.clientY | 1 | 1 | 1 | 1 | 1 | 3 | 1 |
| event.x | 1 | 1 | - | - | - | 3 | 1 |
| event.y | 1 | 1 | - | - | - | 3 | 1 |
| target.offsetLeft | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| target.offsetTop | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| window.innerHeight | 527 | 417 | 620 | 617 | 617 | - | 617 |
| window.innerWidth | 802 | 713 | 860 | 860 | 860 | - | 1085 |
| window.pageXOffset | 0 | 0 | 0 | 0 | 0 | - | 0 |
| window.pageYOffset | 0 | 0 | 0 | 0 | 0 | - | 0 |
| document. documentElement. scrollLeft | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| document. body.scrollLeft | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| document. documentElement. scrollTop | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| document. body.scrollTop | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| proxy.pos.x | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| proxy.pos.y | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| proxy.page.x | 1 | 1 | 1 | 1 | 1 | 3 | 1 |
| proxy.page.y | 1 | 1 | 1 | 1 | 1 | 3 | 1 |
| proxy.targetOffset.x | 1 | 1 | 1 | 1 | 1 | 3 | 1 |
| proxy.targetOffset.y | 1 | 1 | 1 | 1 | 1 | 3 | 1 |
| proxy.contextOffset.x | 1 | 1 | 1 | 1 | 1 | 3 | 1 |
| proxy.contextOffset.y | 1 | 1 | 1 | 1 | 1 | 3 | 1 |
Two

| Apple WebKit / 417.9 Safari / 417.8 | Apple WebKit / 420+ Safari / 417.8 | Gecko / 2005-09-15 Firefox / 1.0.7 | Gecko / 2005-11-11 Firefox / 1.5 | Gecko / 2006-01-17 Firefox / 1.6a1 | MSIE / 6.0. 2900. 2180 | Opera 8.5 / Build 2173 | |
|---|---|---|---|---|---|---|---|
| event.target.id | body | body | body | body | body | body | body |
| event.pageX | 11 | 11 | 11 | 11 | 11 | - | 11 |
| event.pageY | 11 | 11 | 11 | 11 | 11 | - | 11 |
| event.offsetX | 1 | 11 | - | - | - | -9 | -19 |
| event.offsetY | 1 | 11 | - | - | - | -9 | -19 |
| event.layerX | 11 | 11 | 11 | 12 | 11 | - | - |
| event.layerY | 11 | 11 | 11 | 12 | 11 | - | - |
| event.clientX | 11 | 11 | 11 | 11 | 11 | 13 | 11 |
| event.clientY | 11 | 11 | 11 | 11 | 11 | 13 | 11 |
| event.x | 11 | 11 | - | - | - | 13 | 11 |
| event.y | 11 | 11 | - | - | - | 13 | 11 |
| target.offsetLeft | 10 | 10 | -10 | -10 | -10 | 10 | 10 |
| target.offsetTop | 10 | 10 | -10 | -10 | -10 | 10 | 10 |
| window.innerHeight | 527 | 417 | 620 | 617 | 617 | - | 617 |
| window.innerWidth | 802 | 713 | 860 | 860 | 860 | - | 1085 |
| window.pageXOffset | 0 | 0 | 0 | 0 | 0 | - | 0 |
| window.pageYOffset | 0 | 0 | 0 | 0 | 0 | - | 0 |
| document. documentElement. scrollLeft | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| document. body.scrollLeft | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| document. documentElement. scrollTop | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| document. body.scrollTop | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| proxy.pos.x | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| proxy.pos.y | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| proxy.page.x | 11 | 11 | 11 | 11 | 11 | 13 | 11 |
| proxy.page.y | 11 | 11 | 11 | 11 | 11 | 13 | 11 |
| proxy.targetOffset.x | 11 | 11 | 11 | 11 | 11 | 13 | 11 |
| proxy.targetOffset.y | 11 | 11 | 11 | 11 | 11 | 13 | 11 |
| proxy.contextOffset.x | 21 | 21 | 1 | 1 | 1 | 23 | 21 |
| proxy.contextOffset.y | 21 | 21 | 1 | 1 | 1 | 23 | 21 |
Three

| Apple WebKit / 417.9 Safari / 417.8 | Apple WebKit / 420+ Safari / 417.8 | Gecko / 2005-09-15 Firefox / 1.0.7 | Gecko / 2005-11-11 Firefox / 1.5 | Gecko / 2006-01-17 Firefox / 1.6a1 | MSIE / 6.0. 2900. 2180 | Opera 8.5 / Build 2173 | |
|---|---|---|---|---|---|---|---|
| event.target.id | body | body | body | body | body | body | body |
| event.pageX | 21 | 21 | 21 | 21 | 21 | - | 21 |
| event.pageY | 21 | 21 | 21 | 21 | 21 | - | 21 |
| event.offsetX | 11 | 21 | - | - | - | 1 | -9 |
| event.offsetY | 11 | 21 | - | - | - | 1 | -9 |
| event.layerX | 21 | 21 | 21 | 22 | 21 | - | - |
| event.layerY | 21 | 21 | 21 | 22 | 21 | - | - |
| event.clientX | 21 | 21 | 21 | 21 | 21 | 23 | 21 |
| event.clientY | 21 | 21 | 21 | 21 | 21 | 23 | 21 |
| event.x | 21 | 21 | - | - | - | 23 | 21 |
| event.y | 21 | 21 | - | - | - | 23 | 21 |
| target.offsetLeft | 10 | 10 | -10 | -10 | -10 | 10 | 10 |
| target.offsetTop | 10 | 10 | -10 | -10 | -10 | 10 | 10 |
| window.innerHeight | 527 | 417 | 620 | 617 | 617 | - | 617 |
| window.innerWidth | 802 | 713 | 860 | 860 | 860 | - | 1085 |
| window.pageXOffset | 0 | 0 | 0 | 0 | 0 | - | 0 |
| window.pageYOffset | 0 | 0 | 0 | 0 | 0 | - | 0 |
| document. documentElement. scrollLeft | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| document. body.scrollLeft | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| document. documentElement. scrollTop | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| document. body.scrollTop | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| proxy.pos.x | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| proxy.pos.y | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| proxy.page.x | 21 | 21 | 21 | 21 | 21 | 23 | 21 |
| proxy.page.y | 21 | 21 | 21 | 21 | 21 | 23 | 21 |
| proxy.targetOffset.x | 21 | 21 | 21 | 21 | 21 | 23 | 21 |
| proxy.targetOffset.y | 21 | 21 | 21 | 21 | 21 | 23 | 21 |
| proxy.contextOffset.x | 31 | 31 | 11 | 11 | 11 | 33 | 31 |
| proxy.contextOffset.y | 31 | 31 | 11 | 11 | 11 | 33 | 31 |
Four

| Apple WebKit / 417.9 Safari / 417.8 | Apple WebKit / 420+ Safari / 417.8 | Gecko / 2005-09-15 Firefox / 1.0.7 | Gecko / 2005-11-11 Firefox / 1.5 | Gecko / 2006-01-17 Firefox / 1.6a1 | MSIE / 6.0. 2900. 2180 | Opera 8.5 / Build 2173 | |
|---|---|---|---|---|---|---|---|
| event.target.id | one | one | one | one | one | one | one |
| event.pageX | 1001 | 1001 | 1001 | 1001 | 1001 | - | 1001 |
| event.pageY | 1001 | 1001 | 1001 | 1001 | 1001 | - | 1001 |
| event.offsetX | 1 | 1001 | - | - | - | -9 | -19 |
| event.offsetY | 1 | 1001 | - | - | - | -9 | -19 |
| event.layerX | 1 | 1 | 1 | 2 | 1 | - | - |
| event.layerY | 1 | 1 | 1 | 2 | 1 | - | - |
| event.clientX | 1001 | 1001 | 576 | 576 | 576 | 551 | 801 |
| event.clientY | 1001 | 1001 | 336 | 333 | 333 | 256 | 361 |
| event.x | 1001 | 1001 | - | - | - | 551 | 801 |
| event.y | 1001 | 1001 | - | - | - | 256 | 361 |
| target.offsetLeft | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 |
| target.offsetTop | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 |
| window.innerHeight | 527 | 417 | 620 | 617 | 617 | - | 617 |
| window.innerWidth | 802 | 713 | 860 | 860 | 860 | - | 1085 |
| window.pageXOffset | 468 | 557 | 425 | 425 | 425 | - | 200 |
| window.pageYOffset | 736 | 863 | 665 | 668 | 668 | - | 640 |
| document. documentElement. scrollLeft | 0 | 0 | 425 | 425 | 425 | 452 | 200 |
| document. body.scrollLeft | 468 | 557 | 0 | 0 | 0 | 0 | 200 |
| document. documentElement. scrollTop | 0 | 0 | 665 | 668 | 668 | 747 | 640 |
| document. body.scrollTop | 736 | 863 | 0 | 0 | 0 | 0 | 640 |
| proxy.pos.x | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 |
| proxy.pos.y | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 |
| proxy.page.x | 1001 | 1001 | 1001 | 1001 | 1001 | 1003 | 1001 |
| proxy.page.y | 1001 | 1001 | 1001 | 1001 | 1001 | 1003 | 1001 |
| proxy.targetOffset.x | 1 | 1 | 1 | 1 | 1 | 3 | 1 |
| proxy.targetOffset.y | 1 | 1 | 1 | 1 | 1 | 3 | 1 |
| proxy.contextOffset.x | 1001 | 1001 | 1001 | 1001 | 1001 | 1003 | 1001 |
| proxy.contextOffset.y | 1001 | 1001 | 1001 | 1001 | 1001 | 1003 | 1001 |
Five

| Apple WebKit / 417.9 Safari / 417.8 | Apple WebKit / 420+ Safari / 417.8 | Gecko / 2005-09-15 Firefox / 1.0.7 | Gecko / 2005-11-11 Firefox / 1.5 | Gecko / 2006-01-17 Firefox / 1.6a1 | MSIE / 6.0. 2900. 2180 | Opera 8.5 / Build 2173 | |
|---|---|---|---|---|---|---|---|
| event.target.id | one | one | one | one | one | one | one |
| event.pageX | 1011 | 1011 | 1011 | 1011 | 1011 | - | 1011 |
| event.pageY | 1011 | 1011 | 1011 | 1011 | 1011 | - | 1011 |
| event.offsetX | 11 | 1011 | - | - | - | 1 | -9 |
| event.offsetY | 11 | 1011 | - | - | - | 1 | -9 |
| event.layerX | 11 | 11 | 11 | 12 | 11 | - | - |
| event.layerY | 11 | 11 | 11 | 12 | 11 | - | - |
| event.clientX | 1011 | 1011 | 586 | 586 | 586 | 561 | 811 |
| event.clientY | 1011 | 1011 | 346 | 343 | 343 | 266 | 371 |
| event.x | 1011 | 1011 | - | - | - | 561 | 811 |
| event.y | 1011 | 1011 | - | - | - | 266 | 371 |
| target.offsetLeft | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 |
| target.offsetTop | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 |
| window.innerHeight | 527 | 417 | 620 | 617 | 617 | - | 617 |
| window.innerWidth | 802 | 713 | 860 | 860 | 860 | - | 1085 |
| window.pageXOffset | 468 | 557 | 425 | 425 | 425 | - | 200 |
| window.pageYOffset | 736 | 863 | 665 | 668 | 668 | - | 640 |
| document. documentElement. scrollLeft | 0 | 0 | 425 | 425 | 425 | 452 | 200 |
| document. body.scrollLeft | 468 | 557 | 0 | 0 | 0 | 0 | 200 |
| document. documentElement. scrollTop | 0 | 0 | 665 | 668 | 668 | 747 | 640 |
| document. body.scrollTop | 736 | 863 | 0 | 0 | 0 | 0 | 640 |
| proxy.pos.x | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 |
| proxy.pos.y | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 |
| proxy.page.x | 1011 | 1011 | 1011 | 1011 | 1011 | 1013 | 1011 |
| proxy.page.y | 1011 | 1011 | 1011 | 1011 | 1011 | 1013 | 1011 |
| proxy.targetOffset.x | 11 | 11 | 11 | 11 | 11 | 13 | 11 |
| proxy.targetOffset.y | 11 | 11 | 11 | 11 | 11 | 13 | 11 |
| proxy.contextOffset.x | 1011 | 1011 | 1011 | 1011 | 1011 | 1013 | 1011 |
| proxy.contextOffset.y | 1011 | 1011 | 1011 | 1011 | 1011 | 1013 | 1011 |
Six

| Apple WebKit / 417.9 Safari / 417.8 | Apple WebKit / 420+ Safari / 417.8 | Gecko / 2005-09-15 Firefox / 1.0.7 | Gecko / 2005-11-11 Firefox / 1.5 | Gecko / 2006-01-17 Firefox / 1.6a1 | MSIE / 6.0. 2900. 2180 | Opera 8.5 / Build 2173 | |
|---|---|---|---|---|---|---|---|
| event.target.id | two | two | two | two | two | two | two |
| event.pageX | 1031 | 1031 | 1031 | 1031 | 1031 | - | 1031 |
| event.pageY | 1031 | 1031 | 1031 | 1031 | 1031 | - | 1031 |
| event.offsetX | 1 | 1031 | - | - | - | -9 | -19 |
| event.offsetY | 1 | 1031 | - | - | - | -9 | -19 |
| event.layerX | 31 | 31 | 31 | 32 | 31 | - | - |
| event.layerY | 31 | 31 | 31 | 32 | 31 | - | - |
| event.clientX | 1031 | 1031 | 606 | 606 | 606 | 581 | 831 |
| event.clientY | 1031 | 1031 | 366 | 363 | 363 | 276 | 391 |
| event.x | 1031 | 1031 | - | - | - | 581 | 831 |
| event.y | 1031 | 1031 | - | - | - | 276 | 391 |
| target.offsetLeft | 30 | 30 | 20 | 20 | 20 | 20 | 20 |
| target.offsetTop | 30 | 30 | 20 | 20 | 20 | 10 | 20 |
| window.innerHeight | 527 | 417 | 620 | 617 | 617 | - | 617 |
| window.innerWidth | 802 | 713 | 860 | 860 | 860 | - | 1085 |
| window.pageXOffset | 468 | 557 | 425 | 425 | 425 | - | 200 |
| window.pageYOffset | 736 | 863 | 665 | 668 | 668 | - | 640 |
| document. documentElement. scrollLeft | 0 | 0 | 425 | 425 | 425 | 452 | 200 |
| document. body.scrollLeft | 468 | 557 | 0 | 0 | 0 | 0 | 200 |
| document. documentElement. scrollTop | 0 | 0 | 665 | 668 | 668 | 747 | 640 |
| document. body.scrollTop | 736 | 863 | 0 | 0 | 0 | 0 | 640 |
| proxy.pos.x | 1030 | 1030 | 1020 | 1020 | 1020 | 1020 | 1020 |
| proxy.pos.y | 1030 | 1030 | 1020 | 1020 | 1020 | 1010 | 1020 |
| proxy.page.x | 1031 | 1031 | 1031 | 1031 | 1031 | 1033 | 1031 |
| proxy.page.y | 1031 | 1031 | 1031 | 1031 | 1031 | 1023 | 1031 |
| proxy.targetOffset.x | 1 | 1 | 11 | 11 | 11 | 13 | 11 |
| proxy.targetOffset.y | 1 | 1 | 11 | 11 | 11 | 13 | 11 |
| proxy.contextOffset.x | 31 | 31 | 31 | 31 | 31 | 33 | 31 |
| proxy.contextOffset.y | 31 | 31 | 31 | 31 | 31 | 23 | 31 |
Seven

| Apple WebKit / 417.9 Safari / 417.8 | Apple WebKit / 420+ Safari / 417.8 | Gecko / 2005-09-15 Firefox / 1.0.7 | Gecko / 2005-11-11 Firefox / 1.5 | Gecko / 2006-01-17 Firefox / 1.6a1 | MSIE / 6.0. 2900. 2180 | Opera 8.5 / Build 2173 | |
|---|---|---|---|---|---|---|---|
| event.target.id | two | two | two | two | two | two | two |
| event.pageX | 1041 | 1041 | 1041 | 1041 | 1041 | - | 1041 |
| event.pageY | 1041 | 1041 | 1041 | 1041 | 1041 | - | 1041 |
| event.offsetX | 11 | 1041 | - | - | - | 1 | -9 |
| event.offsetY | 11 | 1041 | - | - | - | 1 | -9 |
| event.layerX | 41 | 41 | 41 | 42 | 41 | - | - |
| event.layerY | 41 | 41 | 41 | 42 | 41 | - | - |
| event.clientX | 1041 | 1041 | 616 | 616 | 616 | 591 | 841 |
| event.clientY | 1041 | 1041 | 376 | 373 | 373 | 286 | 401 |
| event.x | 1041 | 1041 | - | - | - | 591 | 841 |
| event.y | 1041 | 1041 | - | - | - | 286 | 401 |
| target.offsetLeft | 30 | 30 | 20 | 20 | 20 | 20 | 20 |
| target.offsetTop | 30 | 30 | 20 | 20 | 20 | 10 | 20 |
| window.innerHeight | 527 | 417 | 620 | 617 | 617 | - | 617 |
| window.innerWidth | 802 | 713 | 860 | 860 | 860 | - | 1085 |
| window.pageXOffset | 468 | 557 | 425 | 425 | 425 | - | 200 |
| window.pageYOffset | 736 | 863 | 665 | 668 | 668 | - | 640 |
| document. documentElement. scrollLeft | 0 | 0 | 425 | 425 | 425 | 452 | 200 |
| document. body.scrollLeft | 468 | 557 | 0 | 0 | 0 | 0 | 200 |
| document. documentElement. scrollTop | 0 | 0 | 665 | 668 | 668 | 747 | 640 |
| document. body.scrollTop | 736 | 863 | 0 | 0 | 0 | 0 | 640 |
| proxy.pos.x | 1030 | 1030 | 1020 | 1020 | 1020 | 1020 | 1020 |
| proxy.pos.y | 1030 | 1030 | 1020 | 1020 | 1020 | 1010 | 1020 |
| proxy.page.x | 1041 | 1041 | 1041 | 1041 | 1041 | 1043 | 1041 |
| proxy.page.y | 1041 | 1041 | 1041 | 1041 | 1041 | 1033 | 1041 |
| proxy.targetOffset.x | 11 | 11 | 21 | 21 | 21 | 23 | 21 |
| proxy.targetOffset.y | 11 | 11 | 21 | 21 | 21 | 23 | 21 |
| proxy.contextOffset.x | 41 | 41 | 41 | 41 | 41 | 43 | 41 |
| proxy.contextOffset.y | 41 | 41 | 41 | 41 | 41 | 33 | 41 |
Eight

| Apple WebKit / 417.9 Safari / 417.8 | Apple WebKit / 420+ Safari / 417.8 | Gecko / 2005-09-15 Firefox / 1.0.7 | Gecko / 2005-11-11 Firefox / 1.5 | Gecko / 2006-01-17 Firefox / 1.6a1 | MSIE / 6.0. 2900. 2180 | Opera 8.5 / Build 2173 | |
|---|---|---|---|---|---|---|---|
| event.target.id | three | three | three | three | three | three | three |
| event.pageX | 1191 | 1191 | 1191 | 1191 | 1191 | - | 1191 |
| event.pageY | 1061 | 1061 | 1061 | 1061 | 1061 | - | 1061 |
| event.offsetX | 1 | 1191 | - | - | - | -9 | -19 |
| event.offsetY | 1 | 1061 | - | - | - | -9 | -19 |
| event.layerX | 191 | 191 | 191 | 192 | 191 | - | - |
| event.layerY | 61 | 61 | 61 | 62 | 61 | - | - |
| event.clientX | 1191 | 1191 | 766 | 766 | 766 | 731 | 991 |
| event.clientY | 1061 | 1061 | 396 | 393 | 393 | 306 | 421 |
| event.x | 1191 | 1191 | - | - | - | 731 | 991 |
| event.y | 1061 | 1061 | - | - | - | 306 | 421 |
| target.offsetLeft | 190 | 190 | 180 | 180 | 180 | 140 | 180 |
| target.offsetTop | 60 | 60 | 50 | 50 | 50 | 20 | 50 |
| window.innerHeight | 527 | 417 | 620 | 617 | 617 | - | 617 |
| window.innerWidth | 802 | 713 | 860 | 860 | 860 | - | 1085 |
| window.pageXOffset | 468 | 557 | 425 | 425 | 425 | - | 200 |
| window.pageYOffset | 736 | 863 | 665 | 668 | 668 | - | 640 |
| document. documentElement. scrollLeft | 0 | 0 | 425 | 425 | 425 | 452 | 200 |
| document. body.scrollLeft | 468 | 557 | 0 | 0 | 0 | 0 | 200 |
| document. documentElement. scrollTop | 0 | 0 | 665 | 668 | 668 | 747 | 640 |
| document. body.scrollTop | 736 | 863 | 0 | 0 | 0 | 0 | 640 |
| proxy.pos.x | 1190 | 1190 | 1180 | 1180 | 1180 | 1160 | 1180 |
| proxy.pos.y | 1060 | 1060 | 1050 | 1050 | 1050 | 1030 | 1050 |
| proxy.page.x | 1191 | 1191 | 1191 | 1191 | 1191 | 1183 | 1191 |
| proxy.page.y | 1061 | 1061 | 1061 | 1061 | 1061 | 1053 | 1061 |
| proxy.targetOffset.x | 1 | 1 | 11 | 11 | 11 | 23 | 11 |
| proxy.targetOffset.y | 1 | 1 | 11 | 11 | 11 | 23 | 11 |
| proxy.contextOffset.x | 191 | 191 | 191 | 191 | 191 | 163 | 191 |
| proxy.contextOffset.y | 61 | 61 | 61 | 61 | 61 | 43 | 61 |
Nine

| Apple WebKit / 417.9 Safari / 417.8 | Apple WebKit / 420+ Safari / 417.8 | Gecko / 2005-09-15 Firefox / 1.0.7 | Gecko / 2005-11-11 Firefox / 1.5 | Gecko / 2006-01-17 Firefox / 1.6a1 | MSIE / 6.0. 2900. 2180 | Opera 8.5 / Build 2173 | |
|---|---|---|---|---|---|---|---|
| event.target.id | three | three | three | three | three | three | three |
| event.pageX | 1201 | 1201 | 1201 | 1201 | 1201 | - | 1201 |
| event.pageY | 1071 | 1071 | 1071 | 1071 | 1071 | - | 1071 |
| event.offsetX | 11 | 1201 | - | - | - | 1 | -9 |
| event.offsetY | 11 | 1071 | - | - | - | 1 | -9 |
| event.layerX | 201 | 201 | 201 | 202 | 201 | - | - |
| event.layerY | 71 | 71 | 71 | 72 | 71 | - | - |
| event.clientX | 1201 | 1201 | 776 | 776 | 776 | 741 | 1001 |
| event.clientY | 1071 | 1071 | 406 | 403 | 403 | 316 | 431 |
| event.x | 1201 | 1201 | - | - | - | 741 | 1001 |
| event.y | 1071 | 1071 | - | - | - | 316 | 431 |
| target.offsetLeft | 190 | 190 | 180 | 180 | 180 | 140 | 180 |
| target.offsetTop | 60 | 60 | 50 | 50 | 50 | 20 | 50 |
| window.innerHeight | 527 | 417 | 620 | 617 | 617 | - | 617 |
| window.innerWidth | 802 | 713 | 860 | 860 | 860 | - | 1085 |
| window.pageXOffset | 468 | 557 | 425 | 425 | 425 | - | 200 |
| window.pageYOffset | 736 | 863 | 665 | 668 | 668 | - | 640 |
| document. documentElement. scrollLeft | 0 | 0 | 425 | 425 | 425 | 452 | 200 |
| document. body.scrollLeft | 468 | 557 | 0 | 0 | 0 | 0 | 200 |
| document. documentElement. scrollTop | 0 | 0 | 665 | 668 | 668 | 747 | 640 |
| document. body.scrollTop | 736 | 863 | 0 | 0 | 0 | 0 | 640 |
| proxy.pos.x | 1190 | 1190 | 1180 | 1180 | 1180 | 1160 | 1180 |
| proxy.pos.y | 1060 | 1060 | 1050 | 1050 | 1050 | 1030 | 1050 |
| proxy.page.x | 1201 | 1201 | 1201 | 1201 | 1201 | 1193 | 1201 |
| proxy.page.y | 1071 | 1071 | 1071 | 1071 | 1071 | 1063 | 1071 |
| proxy.targetOffset.x | 11 | 11 | 21 | 21 | 21 | 33 | 21 |
| proxy.targetOffset.y | 11 | 11 | 21 | 21 | 21 | 33 | 21 |
| proxy.contextOffset.x | 201 | 201 | 201 | 201 | 201 | 173 | 201 |
| proxy.contextOffset.y | 71 | 71 | 71 | 71 | 71 | 53 | 71 |