How can I temporarily disable the onclick event listener, (jQuery preferred), after the event has been fired?
Example:
After the user clicks on the button and fires this function below, I want to disabled the onclick listener, therefore not firing the same command to my django view.
$(".btnRemove").click(function(){
$(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){
$.each(returned_data, function(i, item){
// do stuff
});
}
});
Thanks a lot,
Aldo
There are a lot of ways to do it. For example:
or
We can also use event delegation for clearer code and better performance:
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/onewhy 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
I would use a class eg 'ajax-running'. The click event would only be executed if the clicked element does not have the 'ajax-running' class. As soon you ajax call finishes you can remove the 'ajax-running' class so it can be clicked again.
you could also just hide the button (or the containing div)
and you can just call .show() if you need to display it again.
Also depending on your use case you should consider using a loading overlay instead
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.
edit: to be safe you should also care about the other ajax completion routines (there are only three:
success
,error
,complete
see docs) or elseactive
might stay false.