Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.hover(...) and on.("hover"...) behaving differently

Tags:

jquery

hover

Using JQuery I am trying to chain a couple of functions when an element has a hover state.

I would normally use the .hover event function, but after reading some tutorials I read that using .on is better as you can use one event handler to monitor all bubbling events within a document.

However, I am having problems when I chain two functions together like so:

$("element").on( "hover", function() {         
    console.log("one");     
}, function() {         
    console.log("two");     
});

I expected the result to be one two (which was the case when using .hover) but instead I get two two.

Can anyone explain what I am doing wrong or whether this is expected behaviour and why?

Reproduced using .hover(...): http://jsfiddle.net/gXSdG/

Reproduced using .on(hover...): http://jsfiddle.net/gXSdG/1/

like image 200
My Head Hurts Avatar asked May 28 '12 19:05

My Head Hurts


2 Answers

.on() can only take 1 function, so you have to interrogate the passed event to check what the event was. Try this:

$("element").on("hover", function(e) {
    if (e.type == "mouseenter") {
        console.log("one");   
    }
    else { // mouseleave
        console.log("two");   
    }
});

Example fiddle

Alternatively you can split the two events which constitute the hover() method - mouseenter and mouseleave:

$("#element").on("mouseenter", function() {
  console.log("one");   
}).on('mouseleave', function() {
  console.log("two");   
});
#element {
  background-color: black;
  height: 100px;
  margin: 100px;
  width: 100px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="element"></div>
like image 133
Rory McCrossan Avatar answered Nov 15 '22 06:11

Rory McCrossan


You've just confused about what was happening in the first place, there is no function chaining in either of your examples. The APIs for hover and on are different, read them carefully, and here's an overview as it pertains to your problem:

hover takes either one or two arguments, both functions. The first is run when the mouse enters, the second when the mouse leaves.

on takes only one callback, and your first function is never used, since it's used for a different parameter, and the second one is used as the callback and called for all hover events, that is, mouse enter and mouse leave.

like image 29
Andrew Marshall Avatar answered Nov 15 '22 05:11

Andrew Marshall