javascript - 如何正确调用clearTimeout? (超时 ID 丢失?)

标签 javascript settimeout

我正在尝试做一个简单的 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。我对其进行了编辑,使其在此处更具可读性。

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 函数不是我的代码。

最佳答案

你可以这样做:

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);

关于javascript - 如何正确调用clearTimeout? (超时 ID 丢失?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2733800/

相关文章:

javascript - 如何正确地从 navigator.geolocation 调用 stopObserving()?

javascript - 在javascript中获取视频第一帧

javascript - clearTimeout() 未按预期运行

javascript - 使用jquery重置每个文档点击的超时

javascript - 如果我在异步调用中省略 "await",操作是否仍会完成?

javascript - 我可以在 Node.js 的 javascript 中使用 catch(e if e instanceof SyntaxError) 吗?

javascript - 如何在不包含集合数的情况下生成随机数?

javascript - 在 setTimeout() 中作为参数传递时变量丢失

javascript - 背景选项卡上的最小 setInterval()/setTimeout() 延迟

JavaScript:停止执行直到延迟结束