2013-04-30 3 views
0

Я выполняю действие удаления на странице, когда пользователь нажимает кнопку подтверждения на кнопке модального окна twitter bootstrap.Как работает цепочка событий для нескольких объектов?

У меня есть две кнопки: один позволяет пользователю отменить действие, а другой - подтвердить.

Когда пользователь нажимает кнопку подтверждения, когда модаль скрыт, я выполняю свои действия, поэтому, например, я могу показать анимацию и фактически удалить элемент.

Если пользователь нажимает на несколько элементов, но его/ее выбор является кнопкой отмены, когда он нажимает на элемент, который он хочет удалить, удаление выполняется также на элементах, где был выбран выбор Отмена.

Не следует ли исключать «скрытое» событие из элемента после его выполнения?

Я знаю, что могу отключить изменение цепочки событий $('#confirmDeleteModal').on('hidden', function() { до $('#confirmDeleteModal').off('hidden').on('hidden', function() {, но я действительно понял бы, почему это происходит. Я что-то упускаю?

Код:

$(document).ready(function(){ 
    $('.delete').on('click', function() { 
     var itemID = $(this).data('product-id') 

     $('#confirmDeleteModal').modal('show'); 

     $('#confirmDelete').on('click', function() { 

      $('#confirmDeleteModal').on('hidden', function() { 
       // Here I do my stuff to perform deletion 
       $('#result').append('This method has been called for ' + itemID + ' <br />') 
      }); 
     }); 
    }); 
}); 

Я надеюсь, что разоблачили четко на мой вопрос. Я подготовил JS Bin, а также: http://jsbin.com/inulaw/5/edit

+0

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

+0

Хотелось бы знать, почему это происходит: как только «скрытое» событие завершено, почему оно срабатывает снова? Поскольку вы говорите, что я не должен встраивать такие события, есть ли лучший способ сделать это? –

ответ

1

Проблема здесь состоит в том, что вы подключаете дополнительные слушателей к click и hidden событий каждый раз. Чтобы исправить это, запустите метод jQuery .off('eventName') перед вызовом .on('eventname').

Вот ваш код обновлен и работает прекрасно в JS Bin:

$(document).ready(function(){ 
    $('.delete').on('click', function() { 
     var itemID = $(this).data('product-id') 

     $('#confirmDeleteModal').modal('show'); 

     $('#confirmDeleteModal').off('hidden'); // must reset from previous 
     $('#confirmDelete').off('click').on('click', function() { 

      $('#confirmDeleteModal').on('hidden', function() { 

        // Here I do my stuff to perform deletion 
        $('#result').append('This method has been called for ' + itemID + ' <br />') 
      }); 
     }); 
    }); 
}); 

EDIT: я переехал $('#confirmDeleteModal').off('hidden'); выше события щелчка, так что сбрасывает или нет щелкнуло подтверждение.

+0

Я пробовал и, похоже, не работает. Я по-прежнему получаю такое же поведение. Я думаю, это потому, что, когда вы отключаете «скрытое» событие, это событие еще не было поставлено в очередь. –

+0

Хммм ... проверить [этот jsFiddle] (http://jsfiddle.net/mike_marcacci/jCwdN/) Я сделал. Разве это не работает, как вы собираетесь? –

+0

Я вижу .. Я пропустил (нажмите) на самой кнопке. Это тоже странно ... так как я нажимаю эту кнопку только один раз, как это может быть связано с другими событиями? –

Смежные вопросы