faqts : Computers : Programming : Languages : JavaScript : Event handling

+ Search
Add Entry AlertManage Folder Edit Entry Add page to http://del.icio.us/
Did You Find This Entry Useful?

22 of 26 people (85%) answered Yes
Recently 9 of 10 people (90%) answered Yes

Entry

How can I compute event.offsetX/offsetY which IE provides with Mozilla?

Mar 11th, 2004 04:13
Martin Honnen,


MSIE in its event model provides the properties
  offsetX
  offsetY
as documented on MSDN at
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/offsetx.asp
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/offsety.asp
These properties are not specified in the W3C DOM Events module and
therefore Mozilla doesn't implement them but there are enough properties
in Mozilla's object model to compute offsetX/offsetY for an event object
if needed.
The following example HTML page provides the code to do that in the
first <script> element of the page and some test case in the remaining
part of the page:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>event.offsetX/offsetY property computation with Mozilla</title>
<script type="text/javascript">
function getOffsets (evt) {
  var target = evt.target;
  if (typeof target.offsetLeft == 'undefined') {
    target = target.parentNode;
  }
  var pageCoords = getPageCoords(target);
  var eventCoords = { 
    x: window.pageXOffset + evt.clientX,
    y: window.pageYOffset + evt.clientY
  };
  var offsets = {
    offsetX: eventCoords.x - pageCoords.x,
    offsetY: eventCoords.y - pageCoords.y
  }
  return offsets;
}
function getPageCoords (element) {
  var coords = {x : 0, y : 0};
  while (element) {
    coords.x += element.offsetLeft;
    coords.y += element.offsetTop;
    element = element.offsetParent;
  }
  return coords;
}
</script>
<script type="text/javascript">
function reportEvent (evt) {
  var text = evt.type + ' for ';
  if (typeof evt.target != 'undefined') {
    text += evt.target;
  }
  else if (typeof evt.srcElement != 'undefined') {
    text += evt.srcElement
  }
  text += '; ';
  text += 'clientX: ' + evt.clientX + '; ';
  text += 'clientY: ' + evt.clientY + '; ';
  text += 'offsetX: ' + evt.offsetX + '; '
  text += 'offsetY: ' + evt.offsetY + '; ';
  if (typeof evt.offsetX == 'undefined') {
    var evtOffsets = getOffsets(evt);
    text += 'computed offsetX: ' + evtOffsets.offsetX + '; ';
    text += 'computed offsetY: ' + evtOffsets.offsetY + '; ';
  }
  output(text);
}
function output (text) {
  var debugDiv;
  if (document.getElementById) {
    debugDiv = document.getElementById('debugDiv');
    if (debugDiv) {
      var p;
      if (document.createElement && ((p = document.createElement('p')))) {
        p.appendChild(document.createTextNode(text));
        debugDiv.insertBefore(p, debugDiv.firstChild);
      }
    }
  }
}
</script>
</head>
<body>
<p id="aP" style="border: 1px solid green;"
   onmousemove="reportEvent(event);">
Kibology for all. All for Kibology.
</p>
<div id="debugDiv"
     style="border: 1px solid darkgreen; height: 200px; overflow:
auto;"></div>
</body>
</html>
I have tested the code with Mozilla 1.1 and Mozilla 1.4 and hope that
suffices to establish it works with Mozilla 1.0 and later.