I created a fiddle to try to debug a problem I'm having where once I rearrange html elements with jQuery, hover events on those elements don't work anymore.
However, I came across this interesting situation here: http://jsfiddle.net/4yv1trj4/
I have a main div
that changes color once I hover over it.
$("#block").hover(function() {
$(this).css("backgroundColor", "red");
}, function() {
$(this).css("backgroundColor", "#888");
});
If you click the button, the main div
's ID changes to block2
:
$("#block").attr("id","block2");
but $("#block").hover()
still fires when I hover over #block2
. Also, all hover calls on #block2
do not work. Is there a fundamental principle of how jQuery works that would explain this?
The jQuery methods are used to change the element ID which are described below: jQuery attr() Method: This method set/return attributes and values of the selected elements. If this method is used to return the attribute value, it returns the value of first selected element.
The jQuery #id selector uses the id attribute of an HTML tag to find the specific element. An id should be unique within a page, so you should use the #id selector when you want to find a single, unique element.
To change the id attribute of an HTML element, you can use the jQuery attr() method which allows you to set an element's attribute value. You can change any HTML element id attribute value by using the example above as a reference.
To select an HTML ID using JavaScript we need to point to it and then store it as a variable. Here is the one line of JavaScript we need to target this element and store it as a variable: Code from a text editor: const chocolateDescription = document. getElementById('chocolateCupcake');
When you do this:
$("#block").hover(function() {
$(this).css("backgroundColor", "red");
}, function() {
$(this).css("backgroundColor", "#888");
});
you're telling jQuery to look for the element with the block
ID and bind the hover event to it. Once this is done, the event will remain bound to that element, no matter what happens to its ID afterwards.
That is, unless you have some code that unbinds it, of course.
As an extension to lucasnadalutti's answer: It's worth noting that you can add the binding to the container and yield the result you expect:
Example:
$("body").on("mouseenter", "#block", function () {
$(this).css("backgroundColor", "red");
}).on('mouseleave', "#block", function () {
$(this).css("backgroundColor", "#888");
});
Notice the binding on the body
, not the actual element. A trick to keep in your back pocket.
Demo: jsFiddle
Update:
From the comment section, it's clear a warning is needed - you should bind to the nearest element on the page. body
was used here as a simple example.
Although I think this solution would suit you elegantly, you should read Should all jquery events be bound to $(document)? before you start abusing that power.
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