2012-04-23 79 views
1

我刚才把这个小小的鼠标跟踪示例放在一起时,我意识到,它会在Chrome控制台中抛出数千个错误。javascript的onmousemove/event.clientX正在工作,但引发错误

Uncaught TypeError: Cannot read property 'clientX' of undefined 

AFAIK这意味着,chrome找不到该属性所属的对象。但是,如果我打开示例,它将显示正确的坐标。请帮我摆脱这些无用的错误。

<html> 
<head> 
    <style type="text/css"> 
     #tracking { 
      width: 300px; 
      height: 300px; 
      background-size: 300px 300px; 
      background-color: #00F; 
      left: 100px; 
      top: 100px; 
      position: absolute; 
     } 
    </style> 
    <script type="text/javascript"> 
     var mX, mY; 
     var track; 
     document.onmousemove = update; 

     function trackload() 
     { 
      track = document.getElementById("tracking"); 
      setTimeout("update()",10); 
     } 

     function update(e) 
     { 
      mX = e.clientX; 
      mY = e.clientY; 
      if (track) { 
       track.innerHTML = "X: " + mX + " Y: " + mY + " deg: " + (Math.atan(mY/mX) * (180/Math.PI)); 
       track.style.cssText = "-webkit-transform: rotate(" + (Math.atan(mY/mX) * (180/Math.PI)) + "deg);";} 
      setTimeout("update()",10); 
     } 
    </script> 
</head> 
<body> 
    <div id="tracking" onclick="trackload()"></div> 
</body> 

回答

5

删除调用setTimeout防止错误。这是因为update函数需要一个事件对象,当您通过setTimeout调用该函数时,该对象不会传入。因此e未定义,并且您得到您的错误。

这是working example

如果setTimeout调用有充分的理由,您将需要解释它,因为我无法弄清楚为什么需要乍一看。作为一个方面说明,传递一个字符串到setTimeout通常被认为是不好的做法(它是eval的别名)。你可以传递一个对函数的引用。

+1

我现在觉得很愚蠢。当然,这有效(: – jangxx 2012-04-23 19:11:54

0

其实,如果你只是从你的updatesetTimeout删除括号,它的工作原理,并不会在控制台中引发任何错误。

它应该是setTimeout("update",10)而不是setTimeout("update()",10)

您需要将一个函数传递给setTimeout,而不是一个函数的结果。如果不是字符串,则更好。

相关问题