我有一个显示自定义下拉菜单的输入字段。我想要以下功能:
- 当用户单击输入字段外的任何位置时,应删除菜单。
- 更具体地说,如果用户单击菜单内的 div,则应删除菜单,并应根据单击的 div 进行特殊处理。
这是我的实现:
输入字段有一个onblur()
事件,当用户在输入字段外单击时删除菜单(通过将其父级设置innerHTML
为空字符串)。菜单内的 div 也有onclick()
执行特殊处理的事件。
问题是onclick()
单击菜单时事件永远不会触发,因为输入字段onblur()
首先触发并删除菜单,包括onclick()
s!
我通过将菜单 div 拆分为事件并在鼠标按下时设置全局标志来解决问题,该onclick()
标志onmousedown()
在onmouseup()
鼠标抬起时被清除,类似于此答案中的建议。因为onmousedown()
在之前触发onblur()
,如果单击菜单 div 之一,则将设置标志onblur()
,但如果屏幕上的其他位置被单击,则不会设置。如果单击了菜单,我会立即onblur()
从不删除菜单返回,然后等待onclick()
触发,此时我可以安全地删除菜单。
有没有更优雅的解决方案?
代码看起来像这样:
<div class="menu" onmousedown="setFlag()" onmouseup="doProcessing()">...</div>
<input id="input" onblur="removeMenu()" ... />
var mouseflag;
function setFlag() {
mouseflag = true;
}
function removeMenu() {
if (!mouseflag) {
document.getElementById('menu').innerHTML = '';
}
}
function doProcessing(id, name) {
mouseflag = false;
...
}