我一直在弄清楚使下拉菜单键盘可访问的逻辑。
HTML 的结构如下(为了清晰起见,使用了额外的类名):
<ul>
<li class="primaryMenuItem">
<a href="">Link 1</a>
<ul class="popUpMenu">
<li><a href="">Sub Link 1</a></li>
<li><a href="">Sub Link 2</a></li>
</ul>
</li>
<li class="primaryMenuItem">
<a href="">Link 2</a>
<ul class="popUpMenu">
<li><a href="">Sub Link 1</a></li>
<li><a href="">Sub Link 2</a></li>
</ul>
</li>
</ul>
链接 1 和链接 2 悬停时将显示子菜单列表(下拉菜单)。我用一些 jQuery 和 jQuery hoverIntent 插件可以很好地工作。
问题是目前这只适用于鼠标。
下一个挑战是让它通过键盘工作。
我可以轻松地将焦点事件添加到顶级链接,然后触发二级菜单:
$('ul.primaryMenuItem a:first').focus([call showMenu function])
这很好用。
要关闭菜单,一个选项是,当打开另一个菜单时,检查是否已经打开了另一个菜单,如果有,关闭它。
这也很好用。
但是,失败的地方是,如果您打开了最后一个菜单并从中跳出。由于您尚未进入另一个菜单,因此该菜单保持打开状态。
挑战在于弄清楚如何/何时关闭菜单以及需要的逻辑(jQuery)来解决这个问题。理想情况下,当焦点位于页面上的元素上时,我会关闭菜单,而不是菜单的任何子元素。
从逻辑上讲,我正在寻找这个:
$('li.primaryMenuItem').blur([close $(this).find('ul.popUpMenu'))
但是,您不能这样做,因为 LI 实际上没有焦点,而是其中的锚标记。
有什么建议么?
更新:
也许是一个更好/更简单的提问方式:
通过 jQuery,有没有办法“观察”来查看焦点是否已经移到特定对象的所有子对象之外?