JQuery: один обратный вызов для всего класса, независимо от того, сколько элементов он содержит

Я почти уверен, что этот вопрос уже был задан (но я не нашел решения).

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

$('a').click(function() {
    var id = $(this).attr('rel');
    $('.jsForm').not('#'+id).slideUp('slow', function() {
        $('#'+id).slideToggle('slow');
    });
});

класс jsForm применяется к 3 различным элементам div, каждый из которых имеет уникальный идентификатор. Идентификатор происходит от тега a в атрибуте rel.

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

Но если у меня есть 3 div, функции обратного вызова вызываются 2 раза и переключаются дважды.

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

Я надеюсь, что вы можете понять мой вопрос. благодарю вас.

2 ответа

Решение

Вы можете использовать счетчик для выполнения только после последнего слайда:

$('a').click(function() {
    var id = $(this).attr('rel');
    var size = $('.jsForm').length - 1;
    var count = 0;
    $('.jsForm').not('#'+id).slideUp('slow', function() {
        if (++count == size) {
          $('#'+id).slideToggle('slow');
        }
    });
});

Вы можете сделать что-то вроде этого, когда вы проверяете обратный вызов, что вы достигли желаемого состояния. Здесь, например, видна только одна jsForm.

$('a').click(function() {
    var id = $(this).attr('rel');
    $('.jsForm').not('#'+id).slideUp('slow', function() {
        if($('.jsForm:visible').length == 1){
          $('#'+id).slideToggle('slow');
        }
    });
});
Другие вопросы по тегам