JavaScript/jQuery:全局变量被莫名其妙地重置,导致菜单收缩问题

JavaScript/jQuery:全局变量被莫名其妙地重置,导致菜单收缩问题,javascript,jquery,global-variables,Javascript,Jquery,Global Variables,单击一次“我的列表”菜单时,它会展开,但如果再次单击,它不会收缩 问题是listsExpanded被listsExpand()正确设置为true后,被莫名其妙地重置为false。这会导致$(“#中间包装”)内的检查。委托()再次不适当地调用listsExpand(),而不是像它应该调用的那样调用listsContract() 我不知道在哪里或者为什么会发生这种重置,但我认为这与粘滞的浅蓝色菜单功能有关。在我滚动到之后开始移除和替换这个蓝色条之前,小白色菜单的扩展/收缩没有问题 关于是什么导致了这

单击一次“我的列表”菜单时,它会展开,但如果再次单击,它不会收缩

问题是
listsExpanded
listsExpand()
正确设置为
true
后,被莫名其妙地重置为
false
。这会导致
$(“#中间包装”)内的检查。委托()
再次不适当地调用
listsExpand()
,而不是像它应该调用的那样调用
listsContract()

我不知道在哪里或者为什么会发生这种重置,但我认为这与粘滞的浅蓝色菜单功能有关。在我滚动到之后开始移除和替换这个蓝色条之前,小白色菜单的扩展/收缩没有问题


关于是什么导致了这种情况,您有什么想法吗?

问题是当与
.delegate()
一起使用时,
hover
事件不支持函数参数(in和out)。您需要使用
mouseenter
mouseleave
而不是
hover

更改为:

$('#mid-wrap').delegate('#lists', 'mouseenter', function() {
    listsMouseIn = true;
}).delegate('#lists', 'mouseleave', function() {
    listsMouseIn = false;
});
仅供参考,如果这些HTML对象是静态的,而不是动态添加的,那么您可以在实际对象上使用直接事件处理程序,而不是.delegate,并在处理单击时只使用stopPropagation(),从而大大简化代码。然后,您将在对象中首先看到单击,并且不会多次处理相同的单击,从而需要所有这些全局标志来跟踪状态


您还可以使用对象的可见性作为菜单是否也打开/关闭的检测机制,而不是全局变量。

悬停处理程序的第一部分(带有
listsMouseIn=true;
)实际上从未触发,因此每当您单击时,
$('body')。mouseUp()
处理程序假定您没有悬停“列表”按钮,因此仅为
$(“#中间换行”)隐藏菜单。委托(…)
处理程序在毫秒后再次显示它

替换

$('#mid-wrap').delegate('ul#lists', 'hover', funcIn, funcOut);


似乎很管用。

非常感谢。测试对象的可见性实际上是我最初的方法,我遇到了同样的问题。此外,不幸的是,由于IE7错误,必须动态添加HTML对象。但这是可行的——我不知道点击被处理了不止一次。
$('#mid-wrap').delegate('ul#lists', 'mouseover', funcIn).
               delegate('ul#lists', 'mouseout', funcOut);