Kudayar Pirimbaev
Kudayar Pirimbaev

Reputation: 1320

jQuery: Mouse entering again stops slideDown() effect

On the following page, hovering on a text appends a div with a text with a slide effect. The problem is that when it slides up back to delete div, mouse-entering again on a text stops sliding and div remains without a text. Entering and leaving fast appends div's. How can I resume sliding down in that case?

index.html

<!DOCTYPE html>
<html>
    <head>

        <script src = "http://code.jquery.com/jquery-1.10.1.min.js" type = "text/javascript"></script>
        <script src = "script.js" type = "text/javascript"></script>
    </head>

    <body>
        <div id = "main_div" style = "width: 33%">
            <div id = "hover_div">
                <h1 style = "width: 300px; background-color: blue; margin: 0; border: 1px solid #DDDDDD" id = "text1">Hover to see the truth</h1>
            </div>
        </div>
    </body>
</html>

script.js

$(document).ready (function() {

    $(document).on ("mouseenter", "#text1", function() {
        $("#main_div").append ("<div style = 'background-color: red; width: 300px; height: 200px; margin: 0; border: 1px solid #DDDDDD' id = 'descr'></div>");
        $("#descr")
            .hide()
            .append ("<h3 id = 'truth' style = 'float: left; height: 100px'>You're an idiot</h3>")
            .slideDown ("slow");
    });

    $(document).on ("mouseleave", "#text1", function() {
        $("#descr").slideUp ("slow", function() {
                $(this).remove();
        });
    });

    $(document).on ("mouseenter", "#descr", function() {
        $("#descr").slideUp ("slow", function() {
                $(this).remove();
        });
    });

});

Demo: Fiddle

Upvotes: 0

Views: 108

Answers (3)

Atif
Atif

Reputation: 10880

Simply add

$("#descr").remove();

just after

$(document).on ("mouseenter", "#text1", function() {

Demo - http://jsbin.com/efoqux/1/edit or http://jsfiddle.net/atif089/prS8R/6/

Upvotes: 1

Kevin Bowersox
Kevin Bowersox

Reputation: 94499

Check if the element is animated before performing any other animations.

$(document).on ("mouseenter", "#text1", function() {
     //Do not append div multiple times
     if($("#descr").length ==0){
         $("#main_div").append ("<div style = 'background-color: red; width: 300px; height: 200px; margin: 0; border: 1px solid #DDDDDD' id = 'descr'></div>");
     }

     //Guard against animation      
     if($("#descr").is(":animated")){ 
         return false;
     }

     $("#descr")
          .hide()
          .append ("<h3 id = 'truth' style = 'float: left; height: 100px'>You're an idiot</h3>")
           .slideDown ("slow");
        });

$(document).on ("mouseleave", "#text1", function() {
    //Guard against animation
    if($("#descr").is(":animated")){ 
       return false;
    }

    $("#descr").slideUp ("slow", function() {
        $(this).remove();
     });
});

$(document).on ("mouseenter", "#descr", function() {
    if($("#descr").is(":animated")){ 
        return false;
    }

    $("#descr").slideUp ("slow", function() {
        $(this).remove();
    });
});

Working Example http://jsfiddle.net/DJTmt/

Upvotes: 0

painotpi
painotpi

Reputation: 6996

Try this in your $(document).on ("mouseenter", "#text1", .. function,

$("#main_div").children(":not('#hover_div')").remove().end()

Test Link

Upvotes: 0

Related Questions