我试着在这里找到这个问题的解决方案,但不能,并决定写一个问题。
因此,我尝试在Vue中构建一个简单的下拉菜单组件,该组件具有切换按钮,用户可以自由地点击和标记项目,但一旦焦点离开组件,菜单就会折叠。
现在,我用@blur
和@focus
事件维护了焦点,但是Toggle
按钮有一个问题,如果我将相同的侦听器附加到它,那么单击它会显示并立即隐藏菜单,因此您必须再次单击以展开它。
下面是fiddle演示的问题。
但是,如果我删除了侦听器,那么在焦点位于组件内部之后单击按钮就会出现问题。我想我的方法是错误的,所以下面是预期的行为:
Toggle
按钮只是一个 * 切换按钮 *。它应该在单击时折叠/展开列表- 当列表关闭时,只能通过单击
Toggle
按钮来展开列表 - 当列表展开时,单击
Toggle
按钮或将焦点移到列表外,可以折叠列表。这包括将焦点移到按钮上(即单击切换按钮展开列表,然后单击列表外的某个位置,但不聚焦任何项目)。
EDIT:感谢@Sphinx,我成功地让下拉菜单工作,因为我期望它。这里是更新的fiddle。
5条答案
按热度按时间nimxete21#
对于您的案例,正如问题下方的评论所指出的,您必须处理许多情况,例如
@focus
和@click
将连续触发,<button>
的@blur
和<ul></li>
的@blur
将在单击其中任何一个时触发。这不是一个好主意。但是你可以检查This fiddle,它是
setTimeout
和clearTimeout
的一个解决方案。然后你可能已经看到它延迟了setTimeout(()=>{}, 100)
100ms(我加了些木头,您可以打开浏览器控制台检查工作流)。原因是我们必须等待足够的时间以确保下一个事件处理程序(比如先触发焦点,然后再触发点击)可以及时清除之前的setTimeout
,除非菜单可能先打开,然后再关闭。(PS:对于一些旧机器,100ms可能不够,这取决于当前渲染完成的速度)1.删除
@focus
和@blur
1.当
this.showMenu
为true(已打开)时,为Dom = document添加一个侦听器=click
,它将在触发时执行this.hide()
。1.然后在
this.hide()
中,从Dom = document中删除侦听器=click
。1.为了防止在点击按钮和菜单时菜单塌陷,添加修饰符= stop,它将停止点击事件向上层Dom节点的传播。
如果将
<button>
和<ul>
Package 为一个<div>
,则只需像<template><div @click.stop><button></button<ul>...<ul></div></template>
一样添加修饰符=stop
。以下是一个演示:
vjrehmav2#
我不确定这是否能解决您要完成的任务,但您可以尝试使用@mouseenter和@mouseout
小提琴在这里:https://jsfiddle.net/xhmsf9yw/5/
qnakjoqk3#
我有40%的把握我明白问题所在...
根据你的描述,似乎这个按钮不应该是一个开关,而是一个打开。
模板:
方法:
这将打开这菜单当它是关闭的,但是将不关闭它
https://jsfiddle.net/wc1oehx9/
xpszyzbs4#
这些具有多种交互方式的UI类型的技巧是设置UI元素的状态,并让UI元素反映该状态。
所以我做的是这样的:
我的解决方案是:https://jsfiddle.net/jaiko86/e0vtf2k1/1/
超文本:
联森:
jpfvwuh45#
我曾经遇到过类似的问题,我参考了下面的代码来解决它。要深入解释这个问题是如何工作的,请访问我提到的网站link。
这是HTML:
这是CSS: