【发布时间】:2013-07-20 02:12:13
【问题描述】:
我有一个输入字段,它会显示一个自定义下拉菜单。我想要以下功能:
- 当用户点击输入字段外的任意位置时,菜单应被移除。
- 更具体地说,如果用户单击菜单内的 div,则应删除该菜单,并且应根据单击的 div 进行特殊处理。
这是我的实现:
输入字段有一个onblur() 事件,当用户在输入字段外单击时删除菜单(通过将其父级的innerHTML 设置为空字符串)。菜单中的 div 也有onclick() 事件执行特殊处理。
问题是onclick() 事件在单击菜单时永远不会触发,因为输入字段的onblur() 首先触发并删除菜单,包括onclick()s!
我通过将菜单 div 的 onclick() 拆分为 onmousedown() 和 onmouseup() 事件并在鼠标按下时设置一个全局标志来解决问题,该标志在鼠标抬起时被清除,类似于 this answer 中的建议。因为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;
...
}
【问题讨论】:
标签: javascript onclick onblur