Javascript 如何使下拉菜单在一定时间后消失
我有一个侧菜单,当您将鼠标悬停在标签中的第一部分时,它会下拉。我想知道如何让JavaScript代码重复自身,以在一定时间后再次检查列表处于何种状态,从而关闭菜单。有人能帮我吗 HTML JavaScriptJavascript 如何使下拉菜单在一定时间后消失,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
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个计时器。谢谢你们的回答