2013-07-09 4 views
1

Я смущен, почему это не работает, пожалуйста, может кто-нибудь указать мне в правильном направлении? Я написал несколько JQuery для перехода вниз подменю. Однако, перемещая мышь вокруг меню, она унесет тысячи событий, которые я пытаюсь дождаться, пока скроется шкура, прежде чем сделать еще одно скольжение. Однако это не работает:JQuery slide wait variable not setting

$("li.title").children('ul').hide(); 
var hidden = true; 

$("li.title").hover(
    function() { 
     if (hidden == true){ 
     var height = $(this).children('ul').height() + $(this).height(); 
     $(this).height(height); 
     $(this).children('ul').slideDown(); 
     var hidden = false; 
     } 
    }, 
    function() { 
     $(this).height(25); 
     $(this).children('ul').hide(function() { 
     var hidden = true; 
     }); 
    } 
); 
+0

Вы можете разместить свой HTML и пример jsFiddle.net, если это возможно? – j08691

+0

Можете ли вы предоставить свой HTML? Или скрипка? –

ответ

1

Вам необходимо удалить var. Проблема в том, что вы создаете новый экземпляр hidden, который относится к вашим функциям обратного вызова и не видит глобальный hidden.

$("li.title").children('ul').hide(); 
var hidden = true, 
    myTimeout; 

$("li.title").hover(
    function() { 
     clearTimeout(myTimeout); 
     myTimeout = setTimeout(function(){ 
      if (hidden == true){ 
      var height = $(this).children('ul').height() + $(this).height(); 
      $(this).height(height); 
      $(this).children('ul').slideDown(); 
      hidden = false; //Removed var here 
      } 
     },100); 
    }, 
    function() { 
     clearTimeout(myTimeout); 
     myTimeout = setTimeout(function(){ 
     $(this).height(25); 
     $(this).children('ul').hide(function() { 
     hidden = true; //and here 
     }); 
     },100); 
    } 
); 
3

Удалить var из вашей hidden переменной в функции обратного вызова в режиме висения. Вы переназначаете эти переменные локально, поэтому он не слушает глобальную переменную hidden.

Изменить это:

var hidden = false;

к этому:

hidden = false;

+0

Фантастический ответ, это, похоже, выполнило эту работу. Теперь еще один вопрос, он все еще стреляет до того, как закончится другое событие. Я надеялся, что переменная исправит это, знаете ли вы, что все это дожидается до тех пор, пока скрытие не закончится? –

+0

Попробуйте установить 'hidden = false' перед вызовом' $ (this) .children ('ul'). SlideDown() '. Это может сработать, иначе вы, вероятно, могли бы сделать что-то, используя события mousePoint/'mouseleave' в jQuery. – jrthib

+0

@SimonStaton Я внесла некоторые изменения в свой ответ, который должен работать с использованием тайм-аутов. Я не тестировал его, поэтому его, возможно, нужно настроить. – marteljn