等到jquery animation / slidingown完成后再开始新的

时间:2014-04-27 13:39:39

标签: javascript jquery mouseover

我有以下导航菜单JSFIDDLE

我想让每个鼠标悬停事件都等到动画包含完成后再开始一个新动画,如果新的菜单项悬停(再次触发相同的鼠标悬停事件),它将启动。

我尝试使用.stop(),但这并不能解决问题。

如果你真的很快地在子标题(站点/站点)之间悬停,你可以很快看到颜色下降。

JS

var parentList = $('.parent');

    // declare variables
    var currentChildTitle;
    var currentTitle;
    var banner;

    // setup append div function
    function dropBanner(currentTitle){
        // create the banner variable dom node
        banner = $('<div class="' + currentTitle + '"/></div>');
        // add it to the dom
        $('.boxes').append(banner);
        // animate it
        $('.' + currentTitle).stop().slideDown(300);
    }

    // setup a function to limit the number of divs appended
    function chop(){
        if ($('.boxes div').length > 15) {
            $('.boxes div').eq(0).remove();
        }
    }

    // listen for mouseover the parent list items
    parentList.on('mouseover', function(e) {

        if (!($(this).find('.locations-wrapper').is(':visible'))) {
            $(this).find('.locations-wrapper').stop().slideDown(300);
        };  

        // grab the current list item title
        currentTitle = $(this).find('a').attr('title');

        // call dropBanner passing the current list item title 
        dropBanner(currentTitle);
        chop();

    });

    // listen for mouseleave
    parentList.on('mouseleave', function() {
        $(this).find('.locations-wrapper').delay(300).slideUp(300);
        $('.boxes div').delay(300).slideUp(300);    
    });

    // listen for mouseover the submenu list items
    $('.sub-menu').on('mouseover', 'li', function(e){

        // grab the current list item title
        currentTitle = $(this).find('a').attr('title');

        // call dropBanner passing the current list item title 
        dropBanner(currentTitle);
        chop();

        // stop the bubbling up effect to parent list items
        e.stopPropagation();
    });

编辑:尝试用以下方式听取事件的完成但仍然没有运气..

用此替换dropBanner函数。有用的链接http://css-tricks.com/examples/jQueryStop/

JSFIDDLE

function dropBanner(currentTitle){
  // create the banner variable dom node
  banner = $('<div class="' + currentTitle + '"/></div>');
  // add it to the dom
  $('.boxes').append(banner);
  // $('.' + currentTitle).stop().slideDown(300);

  // animate it
  if ($('.boxes').find('div').last().hasClass('animated')) {        
    $('.' + currentTitle).slideDown(300);
  } else {
    $('.' + currentTitle).addClass('animated').slideDown(300, function(){
      $('.' + currentTitle).removeClass('animated').dequeue();
    });
  }
}

1 个答案:

答案 0 :(得分:1)

使用标志:

var adding = false; // global

function dropDown(){
     adding = true;
     ....

     $('.' + currentTitle).stop().slideDown(300, function(){
         adding = false; // function called on completing animation
     });    
}

然后检查所需的事件:

if(adding) return; // do nothing

DEMO - 可能需要在您想要的地方添加更多if个结构