Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使下拉菜单在一定时间后消失_Javascript_Html_Css - Fatal编程技术网

Javascript 如何使下拉菜单在一定时间后消失

Javascript 如何使下拉菜单在一定时间后消失,javascript,html,css,Javascript,Html,Css,我有一个侧菜单,当您将鼠标悬停在标签中的第一部分时,它会下拉。我想知道如何让JavaScript代码重复自身,以在一定时间后再次检查列表处于何种状态,从而关闭菜单。有人能帮我吗 HTML JavaScript var cssNode = document.createElement('link'); cssNode.setAttribute('rel','stylesheet'); cssNode.setAttribute('type','text/css'); cssNode.setAttri

我有一个侧菜单,当您将鼠标悬停在标签中的第一部分时,它会下拉。我想知道如何让JavaScript代码重复自身,以在一定时间后再次检查列表处于何种状态,从而关闭菜单。有人能帮我吗

HTML

JavaScript

var cssNode = document.createElement('link');
cssNode.setAttribute('rel','stylesheet');
cssNode.setAttribute('type','text/css');
cssNode.setAttribute('href', 'javascript-overrides.css');
document.getElementsByTagName('head') [0].appendChild(cssNode);


function toggle(toggler) {

    if(document.getElementById){
        targetElement = toggler.nextSibling;

        if(targetElement.className == undefined){
        targetElement = toggler.nextSibling.nextSibling;
        }

        if (targetElement.style.display == "block")
        {
        targetElement.style.display = "none";
        }
        else
        {
        targetElement.style.display = "block";
        timer();
        }
    }
}

function timer(){
     var Time = setTimeout(function(){toggle(toggler)},1000);
}

可以使用jQuery中的.hover()方法来实现这一点。页面加载时只需绑定到链接

$(document).ready(function () {
    $("a").hover(function () {
       $(this).next().slideDown(); 
    },
    function () {
        $(this).next().delay(1000).slideUp();
    });
});
见工作示例:

以下是Vanilla JS中的一个工作示例:

<ul>
    <li>
        <a href="#" onmouseover="showMenu(this)" onmouseout="hideMenu(this)">Section One </a>
        <ul>
            <li>text</li>
            <li>text</li>
            <li>text</li>
            <li>text</li>
        </ul>
    </li>
</ul>

可以使用jQuery中的.hover()方法来实现这一点。页面加载时只需绑定到链接

$(document).ready(function () {
    $("a").hover(function () {
       $(this).next().slideDown(); 
    },
    function () {
        $(this).next().delay(1000).slideUp();
    });
});
见工作示例:

以下是Vanilla JS中的一个工作示例:

<ul>
    <li>
        <a href="#" onmouseover="showMenu(this)" onmouseout="hideMenu(this)">Section One </a>
        <ul>
            <li>text</li>
            <li>text</li>
            <li>text</li>
            <li>text</li>
        </ul>
    </li>
</ul>

可以使用jQuery中的.hover()方法来实现这一点。页面加载时只需绑定到链接

$(document).ready(function () {
    $("a").hover(function () {
       $(this).next().slideDown(); 
    },
    function () {
        $(this).next().delay(1000).slideUp();
    });
});
见工作示例:

以下是Vanilla JS中的一个工作示例:

<ul>
    <li>
        <a href="#" onmouseover="showMenu(this)" onmouseout="hideMenu(this)">Section One </a>
        <ul>
            <li>text</li>
            <li>text</li>
            <li>text</li>
            <li>text</li>
        </ul>
    </li>
</ul>

可以使用jQuery中的.hover()方法来实现这一点。页面加载时只需绑定到链接

$(document).ready(function () {
    $("a").hover(function () {
       $(this).next().slideDown(); 
    },
    function () {
        $(this).next().delay(1000).slideUp();
    });
});
见工作示例:

以下是Vanilla JS中的一个工作示例:

<ul>
    <li>
        <a href="#" onmouseover="showMenu(this)" onmouseout="hideMenu(this)">Section One </a>
        <ul>
            <li>text</li>
            <li>text</li>
            <li>text</li>
            <li>text</li>
        </ul>
    </li>
</ul>

我注意到在您的代码中,onmouseout设置为调用timer(),这将创建一个没有定义
toggler
的无关超时函数。此外,您的代码将无限期地使用,大约每1000毫秒一次

您应该定义一个全局计时器变量来保存计时器引用。这样,该功能可以退出,您可以取消或以其他方式操作计时器。同样,您可以在这里实现一个单例模型,从而避免使用太多的计时器

var Timers = {}; // create a Timers object to hold our timers.
function timer(target){
    Timers.sectionOne = setTimeout(function(){ toggle(target); }, 1000);
}

编辑:除了所描述的@Bic方法之外,我还采用了这个方法,这个方法非常优雅。

我注意到在您的代码中,您将onmouseout设置为调用timer(),这将创建一个没有定义切换器的无关超时函数。此外,您的代码将无限期地使用,大约每1000毫秒一次

您应该定义一个全局计时器变量来保存计时器引用。这样,该功能可以退出,您可以取消或以其他方式操作计时器。同样,您可以在这里实现一个单例模型,从而避免使用太多的计时器

var Timers = {}; // create a Timers object to hold our timers.
function timer(target){
    Timers.sectionOne = setTimeout(function(){ toggle(target); }, 1000);
}

编辑:除了所描述的@Bic方法之外,我还采用了这个方法,这个方法非常优雅。

我注意到在您的代码中,您将onmouseout设置为调用timer(),这将创建一个没有定义切换器的无关超时函数。此外,您的代码将无限期地使用,大约每1000毫秒一次

您应该定义一个全局计时器变量来保存计时器引用。这样,该功能可以退出,您可以取消或以其他方式操作计时器。同样,您可以在这里实现一个单例模型,从而避免使用太多的计时器

var Timers = {}; // create a Timers object to hold our timers.
function timer(target){
    Timers.sectionOne = setTimeout(function(){ toggle(target); }, 1000);
}

编辑:除了所描述的@Bic方法之外,我还采用了这个方法,这个方法非常优雅。

我注意到在您的代码中,您将onmouseout设置为调用timer(),这将创建一个没有定义切换器的无关超时函数。此外,您的代码将无限期地使用,大约每1000毫秒一次

您应该定义一个全局计时器变量来保存计时器引用。这样,该功能可以退出,您可以取消或以其他方式操作计时器。同样,您可以在这里实现一个单例模型,从而避免使用太多的计时器

var Timers = {}; // create a Timers object to hold our timers.
function timer(target){
    Timers.sectionOne = setTimeout(function(){ toggle(target); }, 1000);
}


编辑:除了所描述的@Bic方法之外,我还采用了这个方法,这个方法非常优雅。

当这个方法起作用时,除非你很快,否则你会遇到尝试单击子菜单项的问题。您可能需要为mouseout事件添加额外的逻辑来处理用户悬停在某个子菜单项上的情况。对于悬停,我建议使用类似于hoverIntent的方法来处理。你可以自己写,但为什么?这是一个小型的库,仅此而已。我喜欢这个答案,所以我将停止使用我的代码,但我要补充的是,您仍然希望设置一个全局obj来保存计时器,这样您就不会让用户在1s内设置4个计时器。谢谢你们的回答。我发现它们非常有用,我发现这个代码已经足够了,因为我可以在setTimeout函数中添加更多的时间。您不一定需要全局计时器obj。通过在设置超时之前检查显示样式,可以防止多个计时器执行。我已经相应地更新了我的代码示例。虽然这样做有效,但如果您不快速单击子菜单项,您将遇到问题。您可能需要为mouseout事件添加额外的逻辑来处理用户悬停在某个子菜单项上的情况。对于悬停,我建议使用类似于hoverIntent的方法来处理。你可以自己写,但为什么?这是一个小型的库,仅此而已。我喜欢这个答案,所以我将停止使用我的代码,但我要补充的是,您仍然希望设置一个全局obj来保存计时器,这样您就不会让用户在1s内设置4个计时器。谢谢你们的回答。我发现它们非常有用,我发现这个代码已经足够了,因为我可以在setTimeout函数中添加更多的时间。您不一定需要全局计时器obj。通过在设置超时之前检查显示样式,可以防止多个计时器执行。我已经相应地更新了我的代码示例。虽然这样做有效,但如果您不快速单击子菜单项,您将遇到问题。您可能需要为mouseout事件添加额外的逻辑来处理用户悬停在某个子菜单项上的情况。对于悬停,我建议使用类似于hoverIntent的方法来处理。你可以自己写,但为什么?这是一个小型的库,仅此而已。我喜欢这个答案,所以我将停止使用我的代码,但我要补充的是,您仍然希望设置一个全局obj来保存您的计时器,这样您就不会让用户在1s内设置4个计时器。谢谢你们的回答