jQuery - How can I temporarily disable the onclick event listener after the event has been fired? jQuery - How can I temporarily disable the onclick event listener after the event has been fired? ajax ajax

jQuery - How can I temporarily disable the onclick event listener after the event has been fired?


There are a lot of ways to do it. For example:

$(".btnRemove").click(function() {    var $this = $(this);    if ($this.data("executing")) return;    $this        .data("executing", true)        .attr("src", "/url/to/ajax-loader.gif");    $.get("/url/to/django/view/to/remove/item/" + this.id, function(returnedData) {        // ... do your stuff ...        $this.removeData("executing");    });});

or

$(".btnRemove").click(handler);function handler() {    var $this = $(this)        .off("click", handler)        .attr("src", "/url/to/ajax-loader.gif");    $.get("/url/to/django/view/to/remove/item/" + this.id, function(returnedData) {        // ... do your stuff ...        $this.click(handler);    });}

We can also use event delegation for clearer code and better performance:

$(document).on("click", ".btnRemove:not(.unclickable)", function() {    var $this = $(this)        .addClass("unclickable")        .attr("src", "/url/to/ajax-loader.gif");    $.get("/url/to/django/view/to/remove/item/" + this.id, function(returnedData) {        // ... do your stuff ...        $this.removeClass("unclickable");    });});

If we don't need to re-enable the handler after it has been executed, then we can use the .one() method. It binds handlers that are to be executed only once. See jQuery docs: http://api.jquery.com/one


For how long do you want to disable the click event listener? One way is to unbind the event listener using jQuery's unbind http://docs.jquery.com/Events/unbind.

But it's best-practice not to unbind an event only to rebind it later. Use a boolean instead.

var active = true;$(".btnRemove").click(function() {    if (!active) {        return;    }    active = false;    $(this).attr("src", "/url/to/ajax-loader.gif");    $.ajax({        type: "GET",        url: "/url/to/django/view/to/remove/item/" + this.id,        dataType: "json",        success: function(returned_data) {            active = true; // activate it again !            $.each(returned_data, function(i, item) {                // do stuff                                   });        }    });});

edit: to be safe you should also care about the other ajax completion routines (there are only three: success, error, complete see docs) or else active might stay false.


why not disable the button ?Any specific reason that you want to disable this listner alone ?BTB, from your code, I see that you are making an ajax call. SO you specifically want to block user until the call comes back ? If yes, you can try blockUI, a jQuery plugin