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');