I have several textboxes that are added dynamically after an ajax call. These boxes are tied to event handlers with .live() that currently work fine. I want to replace that with the newer .on() function.
This is what I have
$('.MyTextBox').live({
mouseenter: function () { .... },
mouseleave: function () { .... },
blur: function () { ... }
});
When I replace .live() with .on() it doesn't work; the textboxes don't display their normal behavior after they're added.
If I write $('#MainDiv .MyTextBox').live({...
, where MainDiv is the top DOM element where all the action happens, nothing happens either.
What am I missing?
Thanks
The fix is easy enough, simply bind the OnClick event to the parent of the elements you want to be able to click on. That way, if the element you want to click on is removed and re-appended, the handler will still be there listening as the parent was never removed.
on() method: This method attaches events not only to existing elements but also for the ones appended in the future as well. The difference here between on() and live() function is that on() method is still supported and uses a different syntax pattern, unlike the above two methods.
Nevertheless, Native javascript is one of the best jQuery alternatives, in fact, It is the framework of JS. Javascript is the best because any browsers ships with javascript and you do not need to install jQuery in your application.
In short: . bind() will only apply to the items you currently have selected in your jQuery object. . live() will apply to all current matching elements, as well as any you might add in the future. The underlying difference between them is that live() makes use of event bubbling.
Heres the example they have, but with the delegate:
http://jsfiddle.net/HDtz3/
vs non-delegate: http://jsfiddle.net/HDtz3/1/
This is why i hate the new on syntax.
In yours simply do:
$('#MainDiv').on({ mouseenter: function () { .... }, mouseleave: function () { .... }, blur: function () { ... } }, '.MyTextBox');
and it should work
tl;dr: For direct swap-in replacement (accounts for dynamic loading), see the General Example below.
As other posters have noted, the accepted answer works, but $(#MainDiv')
needs be a "non-dynamic element (not being loading again through ajax)". This is preferable performance-wise, as the event bubbling "distance" is limited. In the example, it only needs to bubble up to it's parent element to be handled.
The solution would be to bind to the "parent-most" element that is not going to be reloaded (via AJAX usually) - in the example, you'd need to bind to $('#MainDiv')
's parent.
However,
live()
, all you need to do is bind to the document
element instead.//Replace:
$(selector).live(events, handler); // Where `events` is a string
//With:
$(document) .on(events, selector, handler);
//Replace:
$(selector).live(events); // Where `events` is
// an object of `handler`s
//With: // (as in OP's example)
$(document) .on(events, selector);
Note that with the on()
examples,selector
's container(s) can change and the binding will be automatically applied; the same functionality as live()
.
//Deprecated live() version:
$('.MyTextBox').live({
mouseenter: function () { .... },
mouseleave: function () { .... },
blur: function () { ... }
});
//New on() version
$(document).on({
mouseenter: function () { .... },
mouseleave: function () { .... },
blur: function () { ... }
},'.MyTextBox');
Aaron, Matt, I think you've got the selector in the wrong order (for a live
conversion), Have a look at the API documentation for on
- http://api.jquery.com/on/#example-7
$("body").on("click", "p", function(){
//stuff
});
When I tried your method (I came here looking for a solution for updating my core version), console errors popped up for everything (1.8, 1.9 and 2.0). The target element should be the second parameter not the last. Not sure why your answer has been accepted as it doesn't work. Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With