jQuery:在 blur() 事件之前触发 click()

标签 jquery click onblur

我有一个输入字段,我尝试在其中提供自动完成建议。代码看起来像

<input type="text" id="myinput">
<div id="myresults"></div>

在输入的 blur() 事件中我想隐藏结果的 div:

$("#myinput").live('blur',function(){
     $("#myresults").hide();
});

当我在输入中写入内容时,我向服务器发送请求并获得 json 响应,将其解析为 ul->li 结构并将此 ul 放入我的 #myresults div。

当我点击这个已解析的 li 元素时,我想将 li 的值设置为 input 并隐藏 #myresults div

$("#myresults ul li").live('click',function(){
     $("#myinput").val($(this).html());
     $("#myresults").hide();
});

一切都很好,但是当我点击我的 li blur() 事件在 click() 之前触发并且输入的值没有得到 li 的 html。

如何在 blur() 之前设置 click() 事件?

最佳答案

解决方案一

聆听 mousedown 而不是 click

mousedownblur 事件在您按下鼠标按钮时相继发生,但 click 仅在您释放鼠标按钮时发生。

解决方案2

您可以在 mousedown 中使用 preventDefault() 来阻止下拉菜单窃取焦点。轻微的优势是当鼠标按钮被释放时将选择该值,这是 native 选择组件的工作方式。 JSFiddle

$('input').on('focus', function() {
    $('ul').show();
}).on('blur', function() {
    $('ul').hide();
});

$('ul').on('mousedown', function(event) {
    event.preventDefault();
}).on('click', 'li', function() {
    $('input').val(this.textContent).blur();
});

关于jQuery:在 blur() 事件之前触发 click(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10652852/

相关文章:

javascript - 使用 jQuery 缩小文本搜索的选择范围

JQuery 表排序器 : The sorting arrows don't show

javascript - 我试图让这段代码点击按钮

javascript - onblur - 如何判断点击了什么;或者如何判断 onclick 事件是否正在等待运行

Javascript OnFocus 和 OnBlur 事件

html - 将 onBlur 与 JSX 和 React 结合使用

javascript - 使用 jQuery 监听外部应用程序对元素所做的样式更改

javascript - 如何使用 jquery 隐藏/显示 <panel>?

jQuery 单击处理程序性能 - 附加到类或每个元素

javascript - jQuery - 从 iframe 动态创建的元素上的事件绑定(bind)