Boosttrap .dropdown ('toggle') работает слишком хорошо: тогда выпадающий список нельзя использовать - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть выпадающее меню, содержащее текстовую зону.Когда клавиша возврата нажата в текстовой зоне, я хочу закрыть раскрывающийся список.Вот что делает следующее:

$(document).ready(function(){
  $('#edit').keypress(function(e) {
    var KeyEnter = 13;
    var keycode = (e.keyCode ? e.keyCode : e.which);
    if (keycode == KeyEnter) {
      $('#menu').dropdown('toggle');
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.bundle.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>

<div class="dropdown" id="menu">
  <button class="w-75 text-left btn btn-light dropdown-menu-toggle dropdown-toggle" type="button" data-toggle="dropdown" data-default-label="localhost:8080" aria-expanded="true">
    <code class="dropdown-toggle-text is-default" id="server">localhost:8080</code>
  </button>
  <div class="dropdown-menu dropdown-select w-75">
    <div class="dropdown-input">
      <input type="search" id="edit" class="dropdown-input-field form-control">
    </div>
    <div class="dropdown-content" id="list">
      <div class="dropdown-divider"></div>
      <a class="dropdown-item" href="#"><code>localhost:8080</code></a>
      <a class="dropdown-item" href="#"><code>172.17.0.2:8080</code></a></div>
  </div>
</div>

Дело в том, что после закрытия раскрывающегося списка с помощью .dropdown('toggle') пользователь больше не может использовать текстовую зону: при нажатии на нее, чтобы выделить ее, раскрывающийся список закрывается.

Как это исправить?


Как воспроизвести ошибку

  1. Нажмите на кнопку с надписьюlocalhost:8080;откроется выпадающее меню.
  2. Щелкните пустую текстовую зону;он получает фокус.
  3. Нажмите клавишу возврата на клавиатуре;раскрывающееся меню закрывается.
  4. Повтор № 1.(Нажмите на выпадающую кнопку с надписью localhost:8080; откроется выпадающее меню.)
  5. Повторите # 2.(Щелкните пустую текстовую зону; она получает фокус.)

Наблюдаемое поведение

Раскрывающееся меню закрывается.

Ожидаемое поведение

Раскрывающийся списокменю остается открытым, его состояние после # 5 такое же, как и после # 2.

1 Ответ

0 голосов
/ 13 декабря 2018

Проблема с вашим кодом заключается в том, что событие click из поля всплывает до родительского.Он попадает в выпадающее событие, а затем действует как щелчок.Решение состоит в том, чтобы не дать этим щелчкам распространяться вверх по дереву.

$("#edit").click(function(e){
    e.stopPropagation();
}).keypress(function(e) {
    // ... your code
});

Обратите внимание, что return false; вместо e.stopPropagation(); также будет действовать так, как если бы был вызван e.preventDefault();, что может вызвать другие проблемы вбудущее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...