Подтвердить что ты не робот

Bootstrap modal: закрыть текущий, открыть новый

Я искал какое-то время, но я не могу найти решение для этого. Я хочу следующее:

  • Откройте URL-адрес внутри модальности Bootstrap. У меня это работает. Таким образом, содержимое загружается динамически.
  • Когда пользователь нажимает кнопку внутри этого мода, я хочу, чтобы текущий модальный скрыть, и сразу же после этого я хочу, чтобы новый модал открывался с новым URL (который пользователь нажал). Это содержимое второго модально также загружается динамически.
  • Если пользователь закрывает этот второй модальный, первый модальный должен вернуться снова.

Я смотрел на это несколько дней, надеюсь кто-то может мне помочь.

Спасибо заранее.

4b9b3361

Ответ 1

Не видя конкретного кода, трудно дать вам точный ответ. Тем не менее, из документов Bootstrap вы можете скрыть модальные, как это:

$('#myModal').modal('hide')

Затем покажите другой модал, когда он будет скрыт:

$('#myModal').on('hidden.bs.modal', function () {
  // Load up a new modal...
  $('#myModalNew').modal('show')
})

Вам нужно будет найти способ вставить URL в новое модальное окно, но я бы предположил, что это будет тривиально. Не видя код, сложно привести пример.

Ответ 2

Я знаю, что это поздний ответ, но это может быть полезно. Здесь правильный и чистый способ сделать это, как упомянуто выше @karima. Вы можете запустить сразу две функции; trigger и dismiss модальный.

Разметка HTML;

<!-- Button trigger modal -->
<ANY data-toggle="modal" data-target="TARGET">...</ANY>

<div class="modal fade" id="SELECTOR" tabindex="-1">
  <div class="modal-dialog">
   <div class="modal-content">
    <div class="modal-body"> ... </div>
     <div class="modal-footer">           <!-- ↓ -->  <!--      ↓      -->
      <ANY data-toggle="modal" data-target="TARGET-2" data-dismiss="modal">...</ANY>
     </div>
   </div>
  </div>
</div>

Демо

Ответ 3

Это не совсем ответ, но он полезен, когда вы хотите закрыть текущий модальный и открыть новый модальный.

В html в одной и той же кнопке вы можете попросить закрыть текущий модаль с увольнением данных и открыть новый модальный файл непосредственно с целью передачи данных:

<button class="btn btn-success" 
data-toggle="modal" 
data-target="#modalRegistration" 
data-dismiss="modal">Register</button>

Ответ 4

Проблема с data-dismiss="modal" заключается в перемещении вашего содержимого влево

Я делюсь тем, что сработало для меня, проблема со статусом открывалась pop1 из pop2

JS CODE

var showPopup2 = false;
$('#popup1').on('hidden.bs.modal', function () {
    if (showPopup2) {
        $('#popup2').modal('show');
        showPopup2 = false;
    }
});

$("#popup2").click(function() {
    $('#popup1').modal('hide');
    showPopup2 = true;
});

Ответ 5

Я использую этот метод:

$(function() {
  return $(".modal").on("show.bs.modal", function() {
    var curModal;
    curModal = this;
    $(".modal").each(function() {
      if (this !== curModal) {
        $(this).modal("hide");
      }
    });
  });
});

Ответ 6

Используя следующий код, вы можете скрыть первый модальный и сразу же открыть второй модальный, используя ту же стратегию, вы можете скрыть второй модальный и показать первый.

$("#buttonId").on("click", function(){
    $("#currentModalId").modal("hide");
    $("#currentModalId").on("hidden.bs.modal",function(){
    $("#newModalId").modal("show");
    });
});

Ответ 7

Вам нужно добавить следующий атрибут в ссылку или кнопку, где вы хотите добавить эту функцию:

 data-dismiss="modal" data-toggle="modal" id="forgotPassword" data-target="#ModalForgotPassword"

Отдельный блог: http://sforsuresh.in/bootstrap-modal-window-close-current-open-new-modal/

Ответ 8

С помощью BootStrap 3 вы можете попробовать следующее: -

var visible_modal = jQuery('.modal.in').attr('id'); // modalID or undefined
if (visible_modal) { // modal is active
    jQuery('#' + visible_modal).modal('hide'); // close modal
}

Протестировано для работы с: http://getbootstrap.com/javascript/#modals (сначала нажмите "Запустить демо-мода" ).

Ответ 9

У меня точно такая же проблема, и мое решение только в том случае, если модальный диалог имеет атрибут [role = "dialog" ]:

/*
* Find and Close current "display:block" dialog,
* if another data-toggle=modal is clicked
*/
jQuery(document).on('click','[data-toggle*=modal]',function(){
  jQuery('[role*=dialog]').each(function(){
    switch(jQuery(this).css('display')){
      case('block'):{jQuery('#'+jQuery(this).attr('id')).modal('hide'); break;}
    }
  });
});

Ответ 10

У меня была такая же проблема, как @Gravity Grave, при которой прокрутка не работает, если вы используете

data-toggle="modal" data-target="TARGET-2" 

в сочетании с

data-dismiss="modal"

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

Мое решение в конце концов состояло в том, чтобы установить html внутреннего компонента на модальный и использовать css для постепенного уменьшения ввода текста.

Ответ 11

Использование функции щелчка:

$('.btn-editUser').on('click', function(){
    $('#viewUser').modal('hide'); // hides modal with id viewUser 
    $('#editUser').modal('show'); // display modal with id editUser
});

Заголовки:

Убедитесь, что тот, который вы хотите показать, является независимым модальным.

Ответ 12

data-dismiss="modal" 

используется для закрытия существующей открытой модели. Вы можете установить его на новую модель

Ответ 13

$("#buttonid").click(function(){
    $('#modal_id_you_want_to_hid').modal('hide')
});

// same as above button id
$("#buttonid").click(function(){
$('#Modal_id_You_Want_to_Show').modal({backdrop: 'static', keyboard: false})});

Ответ 14

Я использую другой способ:

$('#showModal').on('hidden.bs.modal', function() {
        $('#easyModal').on('shown.bs.modal', function() {
            $('body').addClass('modal-open');
        });
    });

Ответ 15

Если вы хотите закрыть ранее открытый модальный режим при открытии нового модального кода, вы должны сделать это из javascript/jquery, сначала закрыв текущий открытый модальный, а затем давая тайм-аут в 400 мс, чтобы он мог закрыться, а затем открыть новый модальный как показано ниже:

$('#currentModal').modal('hide');

setTimeout(function() {
       //your code to be executed after 200 msecond 
       $('#newModal').modal({
           backdrop: 'static'//to disable click close
   })
}, 400);//delay in miliseconds##1000=1second

Если вы попытаетесь сделать это с помощью data-dismiss="modal", тогда у него будет проблема с прокруткой, как упоминалось в @gravity и @kuldeep в комментариях.

Ответ 16

Ни один из ответов не помог мне, так как я хотел достичь чего-то, что было точно таким же, как указано в вопросе.

Я создал для этого плагин jQuery.

/*
 * Raj: This file is responsible to display the modals in a stacked fashion. Example:
 * 1. User displays modal A
 * 2. User now wants to display modal B -> This will not work by default if a modal is already displayed
 * 3. User dismisses modal B
 * 4. Modal A should now be displayed automatically -> This does not happen all by itself 
 * 
 * Trying to solve problem for: http://stackoverflow.com/questions/18253972/bootstrap-modal-close-current-open-new
 * 
 */

var StackedModalNamespace = StackedModalNamespace || (function() {
    var _modalObjectsStack = [];
    return {
        modalStack: function() {
            return _modalObjectsStack;
        },
        currentTop: function() {
            var topModal = null;
            if (StackedModalNamespace.modalStack().length) {
                topModal = StackedModalNamespace.modalStack()[StackedModalNamespace.modalStack().length-1];
            }
            return topModal;
        }
    };
}());

// http://stackoverflow.com/a/13992290/260665 difference between $.fn.extend and $.extend
jQuery.fn.extend({
    // https://api.jquery.com/jquery.fn.extend/
    showStackedModal: function() {
        var topModal = StackedModalNamespace.currentTop();
        StackedModalNamespace.modalStack().push(this);
        this.off('hidden.bs.modal').on('hidden.bs.modal', function(){   // Subscription to the hide event
            var currentTop = StackedModalNamespace.currentTop();
            if ($(this).is(currentTop)) {
                // 4. Unwinding - If user has dismissed the top most modal we need to remove it form the stack and display the now new top modal (which happens in point 3 below)
                StackedModalNamespace.modalStack().pop();
            }
            var newTop = StackedModalNamespace.currentTop();
            if (newTop) {
                // 3. Display the new top modal (since the existing modal would have been hidden by point 2 now)
                newTop.modal('show');
            }
        });
        if (topModal) {
            // 2. If some modal is displayed, lets hide it
            topModal.modal('hide');
        } else {
            // 1. If no modal is displayed, just display the modal
            this.modal('show');
        }
    },
});

Рабочий скрипт для справки, JSFiddle: https://jsfiddle.net/gumdal/67hzgp5c/

Вам просто нужно вызвать новый API "showStackedModal()" вместо "modal('show')". Скрытая часть по-прежнему может быть такой же, как и раньше, и уложенная в стеке подстановка отображения и скрытия модалов автоматически берется.

Ответ 17

Простое и элегантное решение для BootStrap 3.x. Таким же способом можно повторно использовать такой способ.

$("#myModal").modal("hide");
$('#myModal').on('hidden.bs.modal', function (e) {
   $("#myModal").html(data);
   $("#myModal").modal();
   // do something more...
}); 

Ответ 18

В первом модальном формате

заменить modal уволить ссылку в нижнем колонтитуле с близкой ссылкой ниже.

<div class="modal-footer">
      <a href="#"  data-dismiss="modal" class="btn btn-primary" data-toggle="modal" data-target="#second_model_id">Close</a>
</div>

Во втором модальном:

Затем второй модальный замените top div нижним тегом div.

<div class="modal fade" tabindex="-1" role="dialog" aria-labelledby="add text for disabled people here" aria-hidden="true" id="second_model_id">

Ответ 19

У меня была такая же проблема: я пишу это здесь на тот случай, если кто-то в будущем наткнется на это и у него будут проблемы с несколькими модалами, которые также должны иметь прокрутку (я использую Bootstrap 3.3.7)

То, что я сделал, так это кнопка внутри моего первого модала:

<div id="FirstId" data-dismiss="modal" data-toggle="modal" data-target="#YourModalId_2">Open modal</div>

Он будет скрывать первое, а затем отображать второе, а во втором модале у меня будет кнопка закрытия, которая будет выглядеть следующим образом:

<div id="SecondId" data-dismiss="modal" data-toggle="modal" data-target="#YourModalId_1">Close</div>

Так что это закроет второй модал и откроет первый, и чтобы прокрутка работала, я добавил в свой файл.css следующую строку:

.modal {
overflow: auto !important;
}

PS: просто примечание, вы должны иметь эти модалы отдельно, второстепенный модал не может быть вложен в первый, так как вы прячете первый

Итак, вот полный пример, основанный на модальном примере начальной загрузки:

<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal">
  Launch demo modal
</button>

<!-- Modal 1 -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        Add lorem ipsum here
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" data-dismiss="modal" data-toggle="modal" data-target="#exampleModal2">
          Open second modal
        </button>
      </div>
    </div>
  </div>
</div>

<!-- Modal 2 -->
<div class="modal fade" id="exampleModal2" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal"  data-toggle="modal" data-target="#exampleModal">Close</button>
      </div>
    </div>
  </div>
</div>

Ответ 20

Попробуй это

    $('#model1').modal('hide');
setTimeout(function(){
    $('#modal2').modal('show');
},400);

Ответ 21

если вы используете MDB использовать этот код

    var visible_modal = $('.modal.show').attr('id'); // modalID or undefined
    if (visible_modal) { // modal is active
        $('#' + visible_modal).modal('hide'); // close modal
    }