Toggling click handlers in Javascript

click, events, handler, javascript, jquery

Solution

Update: Since this form of `toggle()` was removed in jQuery 1.9, the solution below does not work anymore. See this question for alternatives.

It looks like toggle() would solve your problem:

$("#mybutton").toggle(myFirstHandlerFunction, mySecondHandlerFunction);

The code above will register `myFirstHandlerFunction` and `mySecondHandlerFunction` to be called on alternate clicks.

Problem

I have an HTML button to which I attach an event, using jQuery's `bind()`, like so: ``` $('#mybutton').bind('click', myFirstHandlerFunction); ``` In `myFirstHandlerFunction`, I'd like this handler to replace itself with a new handler, `mySecondHandlerFunction`, like this: ``` function myFirstHandlerFunction(e) { $(this).unbind('click', myFirstHandlerFunction).bind('click', mySecondHandlerFunction); } ``` In the second click handler, `mySecondHandlerFunction`, I'd like to toggle the button back to its original state: unbind the `mySecondHandlerFunction` handler and reattach the original handler, `myFirstHandlerFunction`, like so: ``` function mySecondHandlerFunction(e) { $(this).unbind('click', mySecondHandlerFunction).bind('click', myFirstHandlerFunction); } ``` This works great, except for one small detail: because the click event has not yet propagated through each of the button's click handlers, the click event is passed on to the button's next click handler, which happens to be the handler that was just bound in the previous handler. The end result is `mySecondHandlerFunction` being executed immediately after `myFirstHandlerFunction` is executed. This problem can be easily solved by calling `e.stopPropagation()` in each handler, but this has the negative side-effect of cancelling any other click handlers that may have been attached independently. Is there a way to safely and and consistently toggle between two click handlers, without having to stop the propagation of the click event?

Original source

Related problems