clearInterval()使用setInterval()后出现未定义的错误

我知道这不应该是内联的,但YUI库的对话框迫使我。 我的问题是,每当我将鼠标hover在这个div上时,边距左侧滚动被激活但是当我将鼠标移出div时它不会停止。 JS控制台报告:

未捕获的ReferenceError:未定义timerID

这是代码:

编辑:问题是我不能在对话框中运行SCRIPT标签(它们已经通过脚本创建,除了内联之外的任何javascript,如onmouseover和onmouseout)。 因此,在单个函数中封装onmouseover和onmouseout句柄的建议在这种情况下不起作用。

这是一个范围问题。 您的变量timerID在onmouseout中不可见。

通常,将内容放入函数而不是将其全部包含在属性中是一个好主意。 这避免了所有这些范围问题。 使用处理程序而不是on-... -atrributes是一个更好的主意。

onmouseover属性之外定义你的函数,并在mouseout调用另一个函数来清除它。

像这样的东西(以避免令人讨厌的全球变量)

 var handler = (function(){ var timerID; function scrollLeft(){ $('.inner_wrapper').animate({ marginLeft: '-=30px' }); } return{ mouseover:function(){ timerID = setInterval(scrollLeft, 10); }, mouseout:function(){ clearInterval(timerID); } } })(); 

然后

 

甚至更好,通过以下方式直接绑定处理程序:

 $('.span1').hover(function() { timerID = setInterval(scrollLeft, 10); //mouseover }, function() { clearInterval(timerID); //mouseout }); 

从新的jQuery 1.7开始,应该首选.on()

 $(document).ready(function() { var timerID = null; function scrollleft() { $('.inner_wrapper').animate({ marginLeft: '-=30px' }); } $('div.span1').hover(function() { timerID = setInterval(scrollLeft, 10); }, function() { clearInterval(timerID); }); });​ 

并让你像HTML一样

 

如果你使用.on('hover')那么

 $(document).ready(function() { var timerID = null; function scrollleft() { $('.inner_wrapper').animate({ marginLeft: '-=30px' }); } $('div.span1').on('hover', function(e) { if(e.type == 'mouseenter') { timerID = setInterval(scrollLeft, 10); } else { clearInterval(timerID); } }); }); 

将标记和JavaScript混合起来并不好。 拆分它们并按如下方式单独工作。

HTML:

 

JavaScript的:

 var timerID = null; function scrollLeft() { $('.inner_wrapper').animate({ marginLeft: '-=30px' }); } $(document).ready(function() { $(".span1").hover(function() { timerID = setInterval(scrollLeft, 10); }, function() { clearInterval(timerID); }); }); 

timerID在onmouseover中定义,但不在onmouseout中定义。

所以你可以做的是:

  

您的

 var timerID; 

变量被定义为onmouseover处理程序内的局部变量,因此onmouseout处理程序不知道它。

将其声明为全局变量,或者更好 – 将其封装到一个对象中,该对象将包含timerID作为字段, mouseovermouseout处理程序作为方法。