Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Повторное срабатывание каллбака метода hide() (https://javascript.ru/forum/jquery/60811-povtornoe-srabatyvanie-kallbaka-metoda-hide.html)

project1 21.01.2016 13:17

Повторное срабатывание каллбака метода hide()
 
Написал простенький плагин вкладок. Вопрос снизу в комментарии при вызове плагина.
<div class="tab-section">
    <div class="tabs">
        <a href="0" class="tab tab-current">Самовывоз в Москве</a>
        <a href="1" class="tab">Доставка по Москве</a>
        <a href="2" class="tab">Доставка в регион России</a>
    </div>
    <div class="tab-content">
        Контент Самовывоз в Москве
    </div>
    <div class="tab-content">
        Контент Доставка по Москве
    </div>
    <div class="tab-content tab-section">
        Контент Доставка в регион России
        <div class="tabs">
            <a href="2" class="tab tab-current">Почтой России</a>
            <a href="4" class="tab">Транспортной компанией "Деловые линии"</a>
        </div>
        <div class="tab-content tab-section">
            Почтой России
            <div class="tabs">
                <a href="2" class="tab tab-current">Обычная</a>
                <a href="3" class="tab">Срочная</a>
            </div>
            <div class="tab-content">
                Контент Почтой России Обычная
            </div>
            <div class="tab-content">
                Почтой России Срочная
            </div>
        </div>
        <div class="tab-content tab-section">
            Транспортной компанией "Деловые линии"
            <div class="tabs">
                <a href="4" class="tab tab-current">До терминала</a>
                <a href="5" class="tab">До адреса</a>
            </div>
            <div class="tab-content">
                Транспортной компанией "Деловые линии" До терминала
            </div>
            <div class="tab-section">
                Транспортной компанией "Деловые линии" До адреса
            </div>
        </div>
    </div>
</div>

$.fn.tabs = function (callback, duration) {
    this.find('> .tabs > .tab').on('click', function(event) {
        var tab = $(this);
        var content = tab.addClass('tab-current')
            .siblings('.tab')
            .removeClass('tab-current')
            .closest('.tab-section')
            .find('> .tab-content')
            .eq(tab.index());

        content.show(duration || 0, function() {
            content.siblings('.tab-content').hide(duration || 0, function() {
                if (typeof callback === 'function') {
                    return callback.apply(tab, [content, event]);
                }
            });
        });

        return false;
    });

    var current = window.location.hash;
    var index = 0;

    return this.each(function() {
        if (current) {
            index = $('> .tabs > .tab[href="' + current + '"]', this).index();
        } else {
            index = $('> .tabs > .tab-current', this).index();
        }
        $('> .tabs > .tab', this).eq(index < 0 ? 0 : index).click();
    });
};

$('.tab-section').tabs(function() {
    if (this.is(':visible')) {
        alert(this.text()); //Если кликать по корневым вкладкам (Самовывоз в Москве, Доставка по Москве и Доставка в регион России), то каллбак срабатывает 2 раза, а по всем остальным, которые лежат внутри этих - 1 раз...
    }
});

рони 21.01.2016 14:42

project1,
callback срабатывает для каждого элемента анимации, а не для всех !!!

project1 21.01.2016 15:08

А как сделать, чтобы 1 раз сработал? Мне нужно чтобы каллбак вкладки сработал 1 раз и только после окончания анимации.

project1 21.01.2016 15:13

Добавил проверку внутри каллбака hide()
if ($(this).is(':last-of-type')) {
    //типа если анимация последней вкладки завершилась и больше не будет вызываться hide(), только в таком случае при нажатии на последнюю вкладку каждый группы, каллбак вообще не срабатывает ((
}

рони 21.01.2016 15:16

project1,
либо условие когда очередь анимаций закончится либо тоже самое но через promise -- оба варианта тут
http://javascript.ru/forum/misc/6053...tml#post402676

project1 21.01.2016 21:03

Спасибо, помогло :)


Часовой пояс GMT +3, время: 19:00.