Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Скрывается popover если часто изменять значение формы (https://javascript.ru/forum/jquery/56432-skryvaetsya-popover-esli-chasto-izmenyat-znachenie-formy.html)

Roman-Fov 16.06.2015 03:44

Скрывается popover если часто изменять значение формы
 
Всем привет. У меня есть форма с фильтрами. При изменении значений хочу вывести popover с кнопкой "Перейти" которая скрывается через 4 секунды. Проблема проявляется если изменять значения формы чаще чем в 4 секунды. Старый popover исчезает, на долю секунды появляется новый и сразу же исчезает.

Вот мой код:

function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};


$('.filter__entity input, .filter__entity select').on('change keypress keydown', debounce(
    function(){
        //$('.filter__entity').popover('hide');
        $filterForm = $('*[data-role=filter-form]');
        action = $filterForm.attr('action');
        data = $filterForm.serialize();
        console.log(data);
        $(this).parents('.filter__entity').popover('destroy');
        $(this).parents('.filter__entity').popover({
            'content': '<a href="' + action + '?' + data + '" class="filter__submit button" style="margin: 1em;">Подобрать</a>',
            'html': true,
            'delay': { 'show': 300, 'hide': 100, },
        }).popover('show');

        // autohiding
        $('.filter__entity').on('shown.bs.popover', function() {
            var $pop = $(this);
            setTimeout(function () {
                $pop.popover('hide');
            }, 4000);
        });
    }, 300)
);

Полагаю, что виной тому autohiding, который срабатывает для второго popover, хотя должен был сработать для первого. Что я делаю не так?

Roman-Fov 16.06.2015 04:40

Как вообще убивается таймаут для элемента?

ksa 16.06.2015 08:19

Цитата:

Сообщение от Roman-Fov
Как вообще убивается таймаут для элемента?

Стандартно. :)
Цитата:

Отмена выполнения

Вы можете отменить выполнение setTimeout при помощи clearTimeout, используя для этого идентификатор таймаута.

var timeout_id = setTimeout(...)
clearTimeout(timeout_id)

http://javascript.ru/setTimeout

Roman-Fov 16.06.2015 12:44

Пробовал вставлять его перед:
var $pop = $(this);
setTimeout(function () {

Но вменяемых результатов это не принесло. Скрывалось раньше чем нужно.

ksa 17.06.2015 08:22

Цитата:

Сообщение от Roman-Fov
Пробовал вставлять его перед:
var $pop = $(this);
setTimeout(function () {

Кого "его"? :blink:
Ты в состоянии сделать тестовый пример?


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