Reputation: 897
I was using jQuery .bind()
and .unbind()
to handle an animation event on scroll.
$(window).bind('scroll', function(){
... code ...
if(code_was_successful){
$(window).unbind(e);
}
});
As of 1.7 (I'm using 1.11) we're supposed to use .on()
and .off()
, but .off()
seems to have no support for an event handler unbinding itself. For normal click events and such, I'd have to save the handler to a variable and set up another event handler to unbind it (which defeats the purpose), and for scroll events it's impossible since .off()
requires a selector to unbind a specific handler, and scroll events can't have one.
What's the modern way to do this?
Upvotes: 18
Views: 23753
Reputation: 1034
Using off
is the modern way, unbind
is the old way. Use off
.
See jquery documentation:
As of jQuery 3.0, .unbind() has been deprecated. It was superseded by the .off() method since jQuery 1.7, so its use was already discouraged.
Upvotes: 2
Reputation: 816462
What's the modern way to do this?
Use a named function expression:
$(window).on('scroll', function handler(){
... code ...
if(code_was_successful){
$(window).off('scroll', handler);
}
});
.off() requires a selector to unbind a specific handler
No it does not. Just like .on
doesn't require a selector. You only need the selector if you want to unbind a delegated event handler.
As you can read in the documentation of .off
about the selector argument:
A selector which should match the one originally passed to .on() when attaching event handlers.
So if you didn't use one in .on
, you don't use one in .off
.
Upvotes: 20
Reputation: 3281
you can use .on()
and .off()
like so:
function scrollHandler(e){
if (myCondition) $(e.target).off('scroll', scrollHandler);
}
$(window).on('scroll', scrollHandler);
Upvotes: 2