2011-04-26 106 views
2

我想停止使用setTimeout运行的函数,并且不显示随鼠标显示的图像。我想用按钮点击来做,那是怎么回事? 我的代码:使用setTimeout运行的stop函数

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
<title></title> 
<script type="text/javascript"> 
    var trailimage = ["test.gif", 100, 99]; 
    var offsetfrommouse = [-25, -25]; 
    var displayduration = 0; 
    function truebody() { 
     return (!window.opera && document.compatMode && document.compatMode != "BackCompat") ? document.documentElement : document.body; 
    } 
    function hidetrail() { 
     var x = document.getElementById("trailimageid").style; 
     x.visibility = "hidden"; 
     document.onmousemove = ""; 
    } 
    function followmouse(e) { 
     var xcoord = offsetfrommouse[0]; 
     var ycoord = offsetfrommouse[1]; 
     if (typeof e != "undefined") { 
      xcoord += e.pageX; 
      ycoord += e.pageY; 
     } 
     else if (typeof window.event != "undefined") { 
      xcoord += truebody().scrollLeft + event.clientX; 
      ycoord += truebody().scrollTop + event.clientY; 
     } 
     var x = document.getElementById("trailimageid").style; 
     x.left = xcoord + "px"; 
     x.top = ycoord + "px";    
    } 

     alert("obj_selected = true"); 
     document.onmousemove = followmouse; 
     if (displayduration > 0) 
      setTimeout("hidetrail()", displayduration * 1000); 

</script> 
</head> 
<body> 
<form id="form1" runat="server"> 

    <img alt="" id="trailimageid" src="Pictures/sides/sides-not-clicked.gif" border="0" style="position: absolute; visibility: visible; left: 0px; 
    top: 0px; width: 50px; height: 50px"/> 

</form> 
</body> 
</html> 
+0

在发布的代码中,您不执行t因为displayduration为0,所以超时。另外我建议你改变'setTimeout(“hidetrail()”,displayduration * 1000);''someVar = setTimeout(hidetrail,displayduration * 1000);'someVar是在哪里定义的,去实现它。删除引号会删除隐藏的_eval_,这被认为是邪恶的 – mplungjan 2011-04-26 06:21:12

回答

1

保存的setTimeout返回值,这是一种 “处理” 的计时器,当你想取消,请用该值调用clearTimeout

因此,在你的代码,你会声明一个变量timerHandle更合适的,然后将其设置在这里:

if (displayduration > 0) 
    timerHandle = setTimeout("hidetrail()", displayduration * 1000); 

...然后创建一个按钮click处理程序:

function cancelTimeoutOnClick() { 
    if (timerHandle) { 
     clearTimeout(timerHandle); 
     timerHandle = 0; 
    } 
} 

题外话:将字符串传入setTimeout几乎不是最佳做法,这是一个隐含的eval。在你的情况,只是通过函数参考:

if (displayduration > 0) 
    timerHandle = setTimeout(hidetrail, displayduration * 1000); 
          // ^--- Difference here (no quotes, no parentheses) 
0

您使用超时喜欢>

var myTimeout = setTimeout(yourfunction); 

,然后你可以取消它>

clearTimeout(myTimeout); 
0

对于角度的用户,如果使用NG - 例如更改:

//declare your scope var outside your function 
$scope.myVar; 

//the first thing you do is stop the previous timeout execution and then declare a new one (pretty friggin' cool and this makes me love angular more) 
$scope.myCustomFunction = function() { 
     clearTimeout($scope.myVar); 
     $scope.myVar = $timeout(function() { alert($scope.myVar); }, 2000); 
}