Javascript 如何正确调用clearTimeout?(超时id丢失?)

Javascript 如何正确调用clearTimeout?(超时id丢失?),javascript,settimeout,Javascript,Settimeout,我试图做一个简单的setTimeout,使div标记在2秒后不可见 setTimeout函数使div不可见,但不规则,有时是立即的,有时是1秒后的,依此类推 这是我的密码: function beginTimeOut(){ t = setTimeout(function(){hideSubMenu()},2000); } function hideSubMenu(){ var elem; elem = document.getElementById("ul_na

我试图做一个简单的setTimeout,使div标记在2秒后不可见

setTimeout函数使div不可见,但不规则,有时是立即的,有时是1秒后的,依此类推

这是我的密码:

  function beginTimeOut(){

    t = setTimeout(function(){hideSubMenu()},2000);

}

function hideSubMenu(){
    var elem;
    elem = document.getElementById("ul_navlist1");
    elem.style.visibility="hidden";
    clearTimeout(t);

}
顺便说一下,t是一个全局变量。我也试过:
t=setTimeout(“hideSubMenu()”,2000)但具有相同的不规则结果

从OP更新:

这是包含我的菜单和子菜单的div。我在这里编辑了一下,让它有点可读性

右侧是包含菜单和子菜单的div。在这个div中,我调用onmouseout来隐藏子菜单

<div class="right_rect"  onmouseout="beginTimeOut();">      
        <div class="menu2" >
            <ul >
            <li onclick="hideOrShow();"><a href="#">item1</a></li>
                </ul>
        </div>

    <div id="ul_navlist1">
        <ul >
                    <li><a href="#">sub_item1</a></li>
            </ul>
        </div>      
</div>
getStyle函数不是我的代码。

您可以执行以下操作:

function beginTimeOut(){
  setTimeout(hideSubMenu,2000);
}

function hideSubMenu(){
  document.getElementById("ul_navlist1").style.visibility="hidden";
}
setTimeout()
只运行一次,无需清除它,除非您想在它执行之前阻止它执行。从您的问题来看,我不确定您在哪里调用
beginTimeOut()
,但启动的时间可能会有所不同。我会在文档
load
事件中或在
末尾执行此操作,这取决于您运行的其他内容

作为旁注,您可以将其放在一个语句中,如下所示:

setTimeout(function() {
  document.getElementById("ul_navlist1").style.visibility="hidden";
}, 2000);

因为您是通过使用全局变量来清除超时,所以不能保证清除的超时是正确的。如果在上一个超时完成之前调用beginTimeout会怎么样?正如Nick Craver所说,您可能不需要清除超时

我不止一次看到的一个编码错误是使用setInterval/setTimeout的代码,该句柄被覆盖,并且该间隔意外地持续存在。最好在使用以下相当迟钝的代码创建间隔时捕获间隔:

var t=setInterval(function(){doStuff(t)},1000)

以便将触发间隔的句柄传递给处理程序。这样就避免了全局存储的问题。

感谢Nick的回答。不幸的是,它的行为和以前一样。我正在尝试使用ul创建一个子菜单,当鼠标离开包含ul的div时,该子菜单将不可见。我不知道这样做是否正确,但我使用onmouseout使子菜单不可见。有什么建议吗?谢谢。@mnish-你能发布你的代码吗?如果不知道调用方法的确切位置,很难说清楚。请检查我的代码并告诉我出了什么问题?检查我的原始信息,我编辑了我的帖子,现在它包含了我的代码。谢谢你的回答。嗯,对不起,我想我不太明白你的意思。也许因为我只是一个初学者,但是setTimeOut真的很混乱!可能重复的
var t=setInterval(function(){doStuff(t)},1000)