我希望在一段时间后使用JavaScript为我的子菜单设置时间。我的代码是:
function buildsubmenus(){
for (var i=0; i<menuids.length; i++){
var ultags=document.getElementById(menuids[i]).getElementsByTagName("ul")
for (var t=0; t<ultags.length; t++){
ultags[t].parentNode.getElementsByTagName("a")[0].className="subfolderstyle"
if (ultags[t].parentNode.parentNode.id==menuids[i])
//if this is a first level submenu
//dynamically position first level submenus to be width of main menu item
ultags[t].style.left=ultags[t].parentNode.offsetWidth+"px"
else
//else if this is a sub level submenu (ul)
//position menu to the right of menu item that activated it
ultags[t].style.left=ultags[t-1].getElementsByTagName("a")[0].offsetWidth+"px"
ultags[t].parentNode.onmouseover=function(){
this.getElementsByTagName("ul")[0].style.display="block"
if(this.getElementsByTagName("a").length == '1'){
this.getElementsByTagName("ul")[0].style.display="none"
}
}
function wait(){
setTimeout('times()', 5000)
}
ultags[t].parentNode.onmouseout=function times(){
this.getElementsByTagName("ul")[0].style.display="none"
}
}
for (var t= ultags.length-1; t>-1; t--){ //loop through all sub menus again, and use "display:none" to hide menus (to prevent possible page scrollbars
ultags[t].style.visibility="visible"
ultags[t].style.display="none"
}
}
}
我想在一段时间之后显示的函数是times()
,但每当我onmouse
时它会直接调用它并且它不会等待计算时间。
答案 0 :(得分:1)
问题是,你告诉我要把时间打电话给你!
ultags[t].parentNode.onmouseout=function times(){
this.getElementsByTagName("ul")[0].style.display="none"
}
你应该已经完成了
var waitToDelete = function(){
setTimeout(deleteList, 5000);
}
ultags[t].parentNode.onmouseout= waitToDelete;
function deleteList()
{
document.getElementById("Your Menu ID").getElementsByTagName("ul")[0].style.display="none";
}
答案 1 :(得分:0)
实际上,您的问题是您在调用setTimeout时没有引用正确的函数。换句话说,在setTimeout参数中对函数的调用是在window对象的上下文中执行的,而你的times()函数是在buildSubmenus对象的上下文中定义的(你可能没有意识到这一点,但定义你等待( )函数和你的times()函数在buildSubmenus体内意味着wait()和times()函数只在buildSubmenus函数的局部范围内定义和有效)
我打算尝试更正示例代码中的代码,但是有太多问题,并且缺少其他上下文,我认为如果我只是指向正确的方向,那将是最好的。在正确实现您在问题中发布的代码之前,您需要学习并理解closures和currying的概念。
另外,如果您不想理解为什么您的示例不起作用的内部工作原理,我建议您查看一个可以处理所有这些内容的javascript框架,例如{{3 }或Prototype.js。