jQuery:单击特定元素时防止输入焦点丢失

Bon*_*nes 5 jquery

我有一个包含自定义下拉菜单的输入。当您单击菜单项时,它应该将输入值设置为该项目的文本。我还希望菜单在输入失去焦点时隐藏。这产生了一个问题,点击菜单项会使输入失去焦点并在菜单项的单击事件可以运行之前隐藏菜单。我该如何解决?

$(document).on('click', '#inputMenu li', function (e) {
    $('#input').val($(this).text());
    $('#inputMenu').removeClass('active');
    e.preventDefault();
    return false
});
  
$('#input').on('focusout',function(e) {
    $('#inputMenu').removeClass('active');
});
 
$('#input').on('input',function(e) {
    $('#inputMenu').addClass('active');
});
Run Code Online (Sandbox Code Playgroud)
#inputMenu {
  display: none;
}

#inputMenu.active {
  display: block;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="input" type="text" placeholder="type something">
<ul id="inputMenu">
  <li>Click me to set text 1</li>
  <li>Click me to set text 2</li>
  <li>Click me to set text 3</li>
  <li>Click me to set text 4</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

Ahm*_*eki 8

这个问题是由事件的顺序引起的。您可以使用一个技巧,将之前触发的click事件替换mousedownfocusout.

$(document).on('mousedown', '#inputMenu li', function (e) {
    $('#input').val($(this).text());
    $('#inputMenu').removeClass('active');
    e.preventDefault();
    return false
});
  
$('#input').on('focusout',function(e) {
    $('#inputMenu').removeClass('active');
});
 
$('#input').on('input',function(e) {
    $('#inputMenu').addClass('active');
});
Run Code Online (Sandbox Code Playgroud)
#inputMenu {
  display: none;
}

#inputMenu.active {
  display: block;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="input" type="text" placeholder="type something">
<ul id="inputMenu">
  <li>Click me to set text 1</li>
  <li>Click me to set text 2</li>
  <li>Click me to set text 3</li>
  <li>Click me to set text 4</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

学分:

这个答案最初发布在这里