如何正确调用clearTimeout? (超时ID丢失了吗?)

时间:2010-04-28 23:28:06

标签: javascript settimeout

我正在尝试创建一个简单的setTimeout,以便在2秒后使div标签不可见。

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。我在这里编辑它有点可读。

right_rect是包含菜单和子菜单的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>

这是我用来执行隐藏和显示过程的javascript的一部分。

function hideOrShow(){
    var hOrV;
    var elem;
    var styleType = "visibility";
    elem = document.getElementById("ul_navlist1");
    hOrV = getStyle(elem, styleType);
    if(hOrV =="hidden"){
        //alert();
        elem.style.visibility="visible";
    }else{
        elem.style.visibility="hidden";
    }
}

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

}

function getStyle(oElm, strCssRule){
    var strValue = "";
    if(document.defaultView && document.defaultView.getComputedStyle){
        strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
    }
    else if(oElm.currentStyle){
        strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
            return p1.toUpperCase();
        });
        strValue = oElm.currentStyle[strCssRule];
    }
    return strValue;
}

getStyle函数不是我的代码。

2 个答案:

答案 0 :(得分:2)

你可以这样做:

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

function hideSubMenu(){
  document.getElementById("ul_navlist1").style.visibility="hidden";
}

setTimeout()只运行一次,除非你想在它之前停止执行,否则不需要清除它。我不确定你的问题在哪里,beginTimeOut(),但它开始的时间可能会有所不同。我会在文档load某事件中或在<body>结束时执行此操作,具体取决于您运行的其他内容。

作为旁注,你可以将它放在一个声明中,如下所示:

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

答案 1 :(得分:1)

因为您使用全局变量清除超时,所以无法保证它将被清除。如果在上一次超时完成之前调用beginTimeout怎么办?正如Nick Craver所说,你可能不需要清除超时。

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

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

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