How to disable double clicks or timeout clicks wit

2019-02-20 19:35发布

I have an anchor which is using jQuery .click event to start a few functions.

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

This is the code in short.. Its working as it needs to, every click on anchor class slide_circ start do_all_functions.

But I have a problem there. If user make double clicks they run 2 times or more the functions... And the how idea go to hell.

I think that I need to disable the double click some way or to set timeout on my function so its not running each time. Can anyone help me ?

3条回答
冷血范
2楼-- · 2019-02-20 19:59

You can check the last date of the run, and cancel if it was less than half a second ago:

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; 
        });
    });
});

It has the advantage of being a little more efficient.

查看更多
啃猪蹄的小仙女
3楼-- · 2019-02-20 20:11

A few ways to do it, but one way is:

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;   
    });  
});

Not perfect, but it'll work.

查看更多
狗以群分
4楼-- · 2019-02-20 20:18

Use the .data method to assign the state to the element. Then, use setTimeout to reset the state:

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; 
    });
});
查看更多
登录 后发表回答