我有一个输入字段,可以打开一个自定义下拉菜单:
以下是我的实施方案:
输入字段有一个 onblur()
事件,每当用户单击输入字段外部时,该事件就删除菜单(通过将其父级的 innerHTML
设置为空字符串)。菜单中的 div 也有执行特殊处理的 onclick()
事件。
问题在于单击菜单时 onclick()
事件从来不会触发,因为输入字段的 onblur()
首先触发,然后删除菜单,包括 onclick()
!
我通过将菜单 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;
...
}