Как исправить проблему с прокруткой в ​​Bootstrap 4, когда один модал закрыт, а другой открыт сразу после? - PullRequest
1 голос
/ 01 апреля 2020

В моем приложении есть код, который требует закрытия существующего modal и немедленного открытия другого modal. Код работает нормально, но есть scrolling issue (вертикальный / горизонтальный) со вторым модалом. Если я изменю размер экрана и пытаюсь прокрутить вертикально, прокручивается только фоновое содержимое. Я копался, чтобы найти проблему, и вот что я нашел. Я думаю, что есть проблема состояния гонки во времени. Если я поставлю setTime {...some code...,400}, это решит проблему. Я все еще верю, что есть более чистое решение для этого. Кроме того, если кто-то может объяснить, почему это происходит, это было бы здорово. Вот пример кода:

var COMMON_FUNC = {};
COMMON_FUNC.dialogBox = function(title, message, size) {
  title = title || 'HCS System';
  message = message || 'HCS Dialog Box';
  size = size || 'lg';

  var dialog = bootbox.dialog({
    onEscape: true,
    backdrop: true,
    size: size,
    title: '<strong>' + title + '</strong>',
    message: message
  });
  dialog.prop("id", "dialog-box");
};

$("#open-modal-one").on("click", function() {
  var div = '<div><button type="button" class="btn btn-sm btn-secondary edit-record">Edit</button></div>'
  COMMON_FUNC.dialogBox("Modal One", div, "xl");
});

$(document).on("click", ".edit-record", function() {
  $("#dialog-box").modal("hide");
  //setTimeout(function(){$("#second_modal").modal("show");},400);
  $("#second_modal").modal("show");
});
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootbox.js/5.4.0/bootbox.min.js"></script>

<h1>This is a test!</h1>
<button type="button" class="btn btn-sm btn-secondary" id="open-modal-one">Open Modal One</button>
<div class="modal fade" id="second_modal" tabindex="-1" role="dialog" aria-hidden="true">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">Second Modal</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      </div>
      <div class="modal-body">
        This is second modal. If I try to scroll vertically only background will scroll.
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary">Apply</button>
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
      </div>
    </div>
  </div>
</div>

1 Ответ

1 голос
/ 01 апреля 2020

Вы можете прослушать hide события первого модала и только после того, как это будет сделано, показать второй.

$(document).on("click", ".edit-record", function() {
  $("#dialog-box").one('hidden.bs.modal', function () {
    $("#second_modal").modal("show");
  }).modal("hide");
});

Вот так:

var COMMON_FUNC = {};
COMMON_FUNC.dialogBox = function(title, message, size) {
  title = title || 'HCS System';
  message = message || 'HCS Dialog Box';
  size = size || 'lg';

  var dialog = bootbox.dialog({
    onEscape: true,
    backdrop: true,
    size: size,
    title: '<strong>' + title + '</strong>',
    message: message
  });
  dialog.prop("id", "dialog-box");
};

$("#open-modal-one").on("click", function() {
  var div = '<div><button type="button" class="btn btn-sm btn-secondary edit-record">Edit</button></div>'
  COMMON_FUNC.dialogBox("Modal One", div, "xl");
});

$(document).on("click", ".edit-record", function() {
  $("#dialog-box").one('hidden.bs.modal', function () {
    $("#second_modal").modal("show");
  }).modal("hide");
});
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootbox.js/5.4.0/bootbox.min.js"></script>

<h1>This is a test!</h1>
<button type="button" class="btn btn-sm btn-secondary" id="open-modal-one">Open Modal One</button>
<div class="modal fade" id="second_modal" tabindex="-1" role="dialog" aria-hidden="true">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">Second Modal</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      </div>
      <div class="modal-body">
        This is second modal. If I try to scroll vertically only background will scroll.
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary">Apply</button>
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
      </div>
    </div>
  </div>
</div>
...