bootstrap 4 modal не закрывается после вызова hide

обзор

во время вызова ajax отображается модальный прогресс, затем по завершении или сбою он должен быть скрыт вызовом $("#progessDialog").modal("hide");. Похоже, что hide событие не стреляют. У меня есть крюк события в обработчике сбоя ajax, определенном для регистрации при запуске события hide, и он никогда не регистрирует, но другой журнал печатает, как ожидалось для этого условия:

   $('#progessDialog').on('hidden.bs.modal', function (e) {
       console.log('calling modal hide');
   });

воспроизведение:

  • нажмите на одно из значений (555 или 222), чтобы запуск встроенного редактирования
  • изменить значение
  • tab out

забавно

после того, как модальный отказывается скрываться и вызов js завершен, когда я ввожу $("#progessDialog").modal("hide") в консоли разработчика модальный скрывается, как ожидалось.

Примечание: не закончено, поэтому пока не тряпка на пользовательском интерфейсе, однако, я открыт для конструктивной критики, чтобы улучшить UX / JS. Существует нулевая проверка, которая приходит следующий.

Я видел несколько других вопросов SO, которые похожи по своей природе, но не совсем одинаковы (эти вопросы, похоже, имеют некоторые из модальных скрытых, но не фон - мой случай-полный модальный).

вот скрипка js, воспроизводящая проблему:https://jsfiddle.net/willtx/8dpL5rLd/29/

модальные

  <div class="modal fade" id="progessDialog" data-backdrop="static" data-keyboard="false" tabindex="-1" role="dialog" aria-labelledby="progessDialog" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-body">
                    <h5 class="modal-title" id="progessDialoglLabel">Processing...</h5>
                    <div class="progress">
                        <div class="progress-bar progress-bar-striped bg-info" role="progressbar" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
                    </div>
                </div>
            </div>
        </div>

1 ответов


в конце концов, решение для этого довольно простое.
Как указано в документах Bootstrap о .modal('show'), вызов возвращается вызывающему до того, как модальный фактически был показан (т. е. до shown.bs.modal событие происходит).

в вашем случае это означает, что когда вы отдаете приказ на режимное открыться, это начинается открыть, но сразу после этого выполнение продолжается с другим кодом. Так в конце операции, когда вы вызываете .modal('hide') метод, модальный фактически не закончил загружаться полностью. Чтобы обойти это, вы можете посмотреть на shown.bs.modal событие, когда модальный закончил загрузку, а затем просто вызовите .modal('hide').

кроме того, поскольку вы хотите закрыть модальный в разных местах, может быть удобно написать функцию, которая обрабатывает закрытие модального. Что-то вроде ниже.

function closeModal() {
    $('#progessDialog').on('shown.bs.modal', function(e) {
        $("#progessDialog").modal("hide");
    });
}

вот ваша скрипка с предложенным модификация:https://jsfiddle.net/dferenc/5wehfss9/