Show.bs.modal срабатывает несколько раз, когда вы закрываете и снова открываете модальные

Я сделал скрипку, иллюстрирующую проблему, с которой я сейчас сталкиваюсь. Поэтому каждый раз, когда я закрываю и открываю модальный, shown.bs.modal также срабатывает несколько раз. В этой скрипке каждый раз, когда вы закрываете и открываете модальный, количество предупреждений также увеличивается (когда он должен запускаться только один раз). http://jsfiddle.net/j36h2/1/

function openTestModal(){
    $('#testModal').modal({
        keyboard: false,
        backdrop: 'static'
    });

    $('#testModal').on('shown.bs.modal', function (e) {
        alert('');
    });
}

$('.testButton').click(function(){
    openTestModal();
});

Ответ 1

Вам нужно извлечь свою функцию предупреждения из события click:

http://jsfiddle.net/SyCNj/2/

извлечение:

function openTestModal(){
    $('#testModal').modal({
        keyboard: false,
        backdrop: 'static'
    });
}

$('#testModal').on('shown.bs.modal', function (e) {
   alert('');
});

$('.testButton').click(function(){
    openTestModal();
});

Ответ 2

или вы можете попробовать следующее:

$('#testModal').on('shown.bs.modal', function (e) {
 alert('');
 $(this).off('shown.bs.modal');
});

Ответ 3

Принятый ответ от @Put12co22mer2 правильный. Тем не менее, есть моменты, когда вы хотите переустановить событие при открытии модального. Скажем, у вас есть некоторые варианты, которые следует использовать.

function openTestModal(options){
    $('#testModal').modal({
        keyboard: false,
        backdrop: 'static'
    });

    $('#testModal').one('shown.bs.modal', function (e) {
        // do something with options
        alert(options.foo);
    });
}

$('.testButton').click(function(){
    openTestModal({ foo: bar});
});

Затем вы можете использовать one вместо on. Результат будет таким же, как развязка, но, по-моему, немного чище.

http://api.jquery.com/one/

Метод .one() идентичен .on(), за исключением того, что обработчик unbound после первого вызова

Ответ 4

Это связано с тем, что у вас есть несколько обработчиков событий для события, сначала нажмите один раз, когда вы прослушиваете один раз, второй клик дважды и так далее, слушайте событие вне контекста функции openTestModal.

Ответ 5

Нижеприведенная функция используется для всех диалогов в моем приложении.

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

function messageBox(action,...) {               
    $("#modal-btn-ok").off("click");
    $("#modal-btn-ok").on("click", function(e) {
        action(e);
    }); 

Ответ 6

Определите переменную и установите для нее значение 1; например:

function openTestModal(){
                $('#testModal').modal({
                    keyboard: false,
                    backdrop: 'static'
                });
               var e=1;
                $('#testModal').on('shown.bs.modal', function (e) {
                    alert('');
                    e=0;
                });
            }

Ответ 7

Вы можете попробовать следующее: (Bootstrap v3.3.6)

$('#dialog')
.modal({show: false})
.on('hide.bs.modal', function () {
    //..................
}).on('shown.bs.modal', function (event) {
    //..................                  
}).on('hidden.bs.modal', function () {
    $("#dialog").off();
});
$('#dialog').modal('show');