Как отключить двойные клики или тайм-ауты с помощью jQuery? - PullRequest
1 голос
/ 19 февраля 2012

У меня есть якорь, который использует событие jQuery .click для запуска нескольких функций.

jQuery(document).ready(function(){  
    jQuery('a.slide_circ').click(function(){ 
        do_all_functions();
        return false; 
    });
});

Это код вкратце .. Работает так, как нужно, каждый клик по якорному классу slide_circ запускает do_all_functions.

Но у меня там проблема. Если пользователь делает двойной щелчок, он запускает 2 или более функций ... И как идея пойти в ад.

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

Ответы [ 3 ]

5 голосов
/ 19 февраля 2012

Используйте метод .data для присвоения состояния элементу.Затем используйте setTimeout для сброса состояния:

jQuery(document).ready(function() {
    jQuery('a.slide_circ').click(function() { 
        var $this = jQuery(this);
        if ($this.data('activated')) return false;  // Pending, return

        $this.data('activated', true);
        setTimeout(function() {
            $this.data('activated', false)
        }, 500); // Freeze for 500ms

        do_all_functions();
        return false; 
    });
});
0 голосов
/ 19 февраля 2012

Вы можете проверить последнюю дату прогона и отменить, если она была меньше полсекунды назад:

jQuery(document).ready(function() {
    jQuery('a.slide_circ').each(function() {
        var lastRun = null;

        $(this).click(function() {
            if(lastRun && new Date() - lastRun < 500) {
                // Less than 500ms; ignore.
                return false;
            }

            // Set the last run:
            lastRun = new Date().getTime();

            // Continue:
            do_all_functions();
            return false; 
        });
    });
});

Преимущество в том, что он немного более эффективен.

0 голосов
/ 19 февраля 2012

Несколько способов сделать это, но один из них:

jQuery(document).ready(function(){ 
    var do_all_functions_running = false; 
    jQuery('a.slide_circ').click(function(){
        if (!do_all_functions_running) { 
            do_all_functions_running = true;
            do_all_functions();
            do_all_functions_running = false;
        }
        return false;   
    });  
});

Не идеально, но это сработает.

...