2017-02-22 55 views
0

试图确定单击的x和y坐标的相对值以及父容器的偏移量以找到单击鼠标的真实值网页。试图获得鼠标单击x和y位置的准确值 - 获取NaN

问题是:我在屏幕上显示NaN作为x和y?不知道为什么?

// get the position of click 
function getPosition(el) { 
  var xPosition = 0; 
  var yPosition = 0; 
  
  while (el) { 
    if (el.nodeName == "BODY") { 
      // deal with browser quirks with body/window/document and page scroll 
      var xScrollPos = el.scrollLeft || document.documentElement.scrollLeft; 
      var yScrollPos = el.scrollTop || document.documentElement.scrollTop; 
  
      xPosition += (el.offsetLeft - xScrollPos + el.clientLeft); 
      yPosition += (el.offsetTop - yScrollPos + el.clientTop); 
    } else { 
      xPosition += (el.offsetLeft - el.scrollLeft + el.clientLeft); 
      yPosition += (el.offsetTop - el.scrollTop + el.clientTop) 
    } 
  
    el = el.offsetParent; 
  } 
  return { 
    x: xPosition, 
    y: yPosition, 
    a: "hahah", 
  }; 
} 



function handleClick(event) { 
    // Return the current element clicked on 
    var el = event.currentTarget; 
    // Return the offset values of the element clicked on 
    var relOffsetValues = getPosition(el); 

    // Get the clicked values that is relative to the element 
    var valuesRelToClickedElementX = event.ClientX; 
    var valuesRelToClickedElementY = event.ClientY; 

    // Find the true value of x and y by adding the offset and the to clicked value of x and y 
    var realValueX = relOffsetValues.x + valuesRelToClickedElementX; 
    var realValueY = relOffsetValues.y + valuesRelToClickedElementY; 

    // display the x and y of the mouse click 
    alert("x:" + realValueX + ", y:" + realValueY); 
} 

// Set up event handlers according to standards 
window.addEventListener("load", function(){ 
    document.addEventListener("click", handleClick); 
}); 
+0

也许是因为Clientx/Y应该以小写字母c开始。 clientX/clientY。 –

+0

修正了它。仍然得到NaN – Shaz

回答

1

两件事情需要加以纠正工作:

  1. event.ClientXevent.clientXevent.ClientYevent.clientY。注意clientX和clientY中的小写字母。的
  2. 代替document.addEventListener("click", handleClick);使用document.body. addEventListener("click", handleClick);

维诺德

+0

好的,谢谢它的工作。但是想知道,为什么我必须给听众添加身体?此外,我运行了一个测试,以查看clientX值和真实值(使用getPosition()计算)是否不同。有任何想法吗? – Shaz

+0

很好用。首先,因为您正在检查Body,所以我使用body来添加侦听器。在身体的情况下,他们不会工作。如果为你工作,请为此付诸行动谢谢 –

相关问题