jQuery API

.mouseleave()

.mouseleave( handler(eventObject) ) Returns: jQuery

Description: Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.

  • version added: 1.0.mouseleave( handler(eventObject) )

    handler(eventObject)A function to execute each time the event is triggered.

  • version added: 1.4.3.mouseleave( [eventData], handler(eventObject) )

    eventDataA map of data that will be passed to the event handler.

    handler(eventObject)A function to execute each time the event is triggered.

  • version added: 1.0.mouseleave()

This method is a shortcut for .bind('mouseleave', handler) in the first two variations, and .trigger('mouseleave') in the third.

The mouseleave JavaScript event is proprietary to Internet Explorer. Because of the event's general utility, jQuery simulates this event so that it can be used regardless of browser. This event is sent to an element when the mouse pointer leaves the element. Any HTML element can receive this event.

For example, consider the HTML:

<div id="outer">
  Outer
  <div id="inner">
    Inner
  </div>
</div>
<div id="other">
  Trigger the handler
</div>
<div id="log"></div>

The event handler can be bound to any element:

$('#outer').mouseleave(function() {
  $('#log').append('<div>Handler for .mouseleave() called.</div>');
});

Now when the mouse pointer moves out of the Outer <div>, the message is appended to <div id="log">. You can also trigger the event when another element is clicked:

$('#other').click(function() {
  $('#outer').mouseleave();
});

After this code executes, clicks on Trigger the handler will also append the message.

The mouseleave event differs from mouseout in the way it handles event bubbling. If mouseout were used in this example, then when the mouse pointer moved out of the Inner element, the handler would be triggered. This is usually undesirable behavior. The mouseleave event, on the other hand, only triggers its handler when the mouse leaves the element it is bound to, not a descendant. So in this example, the handler is triggered when the mouse leaves the Outer element, but not the Inner element.

Example:

Show number of times mouseout and mouseleave events are triggered. mouseout fires when the pointer moves out of child element as well, while mouseleave fires only when the pointer moves out of the bound element.

<!DOCTYPE html>
<html>
<head>
  <style>
div.out {
width:40%;
height:120px;
margin:0 15px;
background-color:#D6EDFC;
float:left;
}
div.in {
width:60%;
height:60%;
background-color:#FFCC00;
margin:10px auto;
}
p {
line-height:1em;
margin:0;
padding:0;
}
</style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  
<div class="out overout"><p>move your mouse</p><div class="in overout"><p>move your mouse</p><p>0</p></div><p>0</p></div>

<div class="out enterleave"><p>move your mouse</p><div class="in enterleave"><p>move your mouse</p><p>0</p></div><p>0</p></div>


<script>
    var i = 0;
    $("div.overout").mouseover(function(){
      $("p:first",this).text("mouse over");
    }).mouseout(function(){
      $("p:first",this).text("mouse out");
      $("p:last",this).text(++i);
    });

    var n = 0;
    $("div.enterleave").mouseenter(function(){
      $("p:first",this).text("mouse enter");
    }).mouseleave(function(){
      $("p:first",this).text("mouse leave");
      $("p:last",this).text(++n);
    });

</script>

</body>
</html>

Demo:

Support and Contributions

Need help with .mouseleave() or have a question about it? Visit the jQuery Forum or the #jquery channel on irc.freenode.net.

Think you've discovered a jQuery bug related to .mouseleave()? Report it to the jQuery core team.

Found a problem with this documentation? Report it on the GitHub issue tracker

  • Guest

    After attaching mouseleave event to <div> container and then loading a <form> to a child <div> using AJAX load method, the <div> container starts behaving like it has mouseout instead of mouseleave. ie, everytime I mouse over an <input> element, the <div> container fades out. I tried to unbind before load and then bind after load but still no dice. Here is some code:

    HTML:
    <div id=”ftr-blurb”>
    <div id=”ftr-blurbmid”>
    <div id=”ftr-blurb-copy”></div>
    </div>
    </div>

    JS:
    function blurb_out () {
    $( '#ftr-blurb' ).fadeOut ( 200 );
    }
    function blurb_content ( file ) {
    $( '#ftr-blurb' ).unbind ( 'mouseleave' ), blurb_out );
    $( '#ftr-blurb-copy' ).load ( file, function () {
    $( '#ftr-blurb-copy' ).fadeIn ( 200 );
    setTimeout ( blurb_bindmouseleave, 10 );
    } );
    }
    function blurb_bindmouseleave () {
    $( '#ftr-blurb' ).bind ( 'mouseleave', blurb_out );
    }

    Not really sure how to overcome this problem. Any suggestions? Thanks!!</div></div></div></form></div>

  • hureaerocvry

    thank

  • Msm_eg

    im using in in drupal it tells me mouseenter is not a function

  • teo

    Note that, if the inner element's border coincides with the outer element's border, so that by leaving the inner through that border you're also leaving the outer, the outer element will NOT receive the mouseleave event.

    Such as in this example:

    [ OUTER [ INNER ]]

    (I've marked both edges on the right but suppose they actually coincide, i.e. the space between them is exactly zero)
    In this case, leaving the inner element by the right side means leaving both: but the outer element WON'T fire the mouseleave event.

    This is a bug, so I will file a bug report; however while this is not fixed it is very important to document it, because it is essential to know it.

    This is true for both IE and Firefox. If I understand correctly, IE has a javascript event for this, while firefos has not so jQuery emulates it. So I guess the bug in the case of IE is probably in Javascript rather than jquery…

  • teo

    Note that, if the inner element's border coincides with the outer element's border, so that by leaving the inner through that border you're also leaving the outer, the outer element will NOT receive the mouseleave event.

    Such as in this example:

    [ OUTER [ INNER ]]

    (I've marked both edges on the right but suppose they actually coincide, i.e. the space between them is exactly zero)
    In this case, leaving the inner element by the right side means leaving both: but the outer element WON'T fire the mouseleave event.

    This is a bug, so I will file a bug report; however while this is not fixed it is very important to document it, because it is essential to know it.

    This is true for both IE and Firefox. If I understand correctly, IE has a javascript event for this, while firefos has not so jQuery emulates it. So I guess the bug in the case of IE is probably in Javascript rather than jquery…