检测HTML select元素是否展开(无需手动跟踪状态)

8
我希望能够检测下拉菜单是否展开。我不想使用额外的点击/鼠标悬停等事件处理程序,因为下拉菜单是动态的,而且由于其他原因,我不能使用类似jQuery live这样的东西。基本上,我想要的是:给定一个任意的select元素(没有其他附加的事件处理程序、类等),可以给出一个关于它是否展开的真/假答案。
对于我的具体应用程序,我正在处理鼠标滚轮事件,但不想在下拉菜单打开时处理它们(这将覆盖浏览器的默认功能)。然而,当鼠标悬停在select上时,我仍然希望处理鼠标滚轮事件,但没有打开它。

1
没有看到下拉菜单是如何实现的,我们实际上无能为力。 - sdleihssirhc
抱歉,标准的HTML<select>。正在更新标题。 - ScottR
1
所以基本上你想要在事件发生后创建一些功能,但是你不想使用事件处理程序?我不明白。如果有某种方法可以在某个时间点确定下拉菜单是否打开,而不仅仅是使用实际事件来解决这个问题,那么你会在何时运行此检测代码,使用计时器或其他方式吗?这不正是事件处理程序的用途吗? - Jamie Treworgy
@jamietre 我认为他的意思是,他将使用鼠标滚轮事件,但不想有全局变量跟踪选择状态,而是希望在选择上具有事件处理程序来改变全局变量。……如果这有意义的话。 - sdleihssirhc
好的,我懂了。所以可以在每个鼠标滚轮事件上测试一些(可能不存在的)属性,或者测试你根据选择事件自己设置的属性,或者根据选择绑定/解绑操作。我想不出针对后两种解决方案的问题。 - Jamie Treworgy
显示剩余2条评论
3个回答

7

我之前也研究过这个问题,出于类似的原因。但除了手动追踪之外,我无法找到其他解决方案,而手动追踪并不起作用。打开/关闭选择(下拉)有几种方法,比如 Alt+Dn Arrow。如果用户点击浏览器外部的某个东西,那么打开的选择将关闭。试图跟踪选择的状态是徒劳的,除非其他人提供了我所错过的解决方案,否则您必须尽可能优雅地编写代码来绕过它。


没错,这正是我想的。当鼠标悬停时,我将让它忽略鼠标滚轮事件 <叹气>。 - ScottR

3
即使它没有展开,当它获得焦点时怎么样?您明确要求展开,因为您不想覆盖默认的浏览器行为,但是浏览器的行为应该是在项目获得焦点时滚动项目,即使它没有展开,所以我建议您最好检测焦点。如果您同意这一点,那么您可以使用JQuery的focus()blur()方法或focusin()focusout()方法轻松检测字段何时获得焦点和何时失去焦点。希望这有所帮助。
参考链接: http://api.jquery.com/focus/ http://api.jquery.com/blur/ http://api.jquery.com/focusin/ http://api.jquery.com/focusout/

最好不要保留状态。但如果必须的话,那也可以。 - ScottR

0
也许你可以像这样做:
$('#dropdown').live('click', function(){
    //bind mousewheel here
});

$('#dropdown').live('change', function(){
    //unbind mousewheel here
})

1
是的。不幸的是,“我不能使用类似jQuery live这样的东西”(就像问题中所述)。 - ScottR
你能否在下拉菜单上放置一个类? - locrizak
我更喜欢一些只能在给定任意选择元素的情况下工作的东西。 - ScottR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接