clearTimeout не работает должным образом - PullRequest
1 голос
/ 05 января 2011

Скользящее меню Javascript остается открытым.clearTimeout не работает должным образом - вы можете помочь мне, пожалуйста

<html>
<head>
<style>
#Menu1 {position:absolute;
 top:-190px; left:150px;
 font-size:15px;visibility:visible;
 background-color:#D0BCFE;
 width:114px;z-index:0;border-style:solid;
 }
#Menu2 {position:absolute;
 top:-190px; left:580px;
 font-size:15px;visibility:visible;
 background-color:#D0BCFE;
 width:114px;z-index:0;border-style:solid;
 }
#Menu3 {position:absolute;
 top:-190px; left:1005px;
 font-size:15px;visibility:visible;
 background-color:#D0BCFE;
 width:114px;z-index:0;border-style:solid;
 }

TD.TDHREFMENUS{font-size:20;color:red;position:relative;z-index:0;background-color:#C4ABFE;border-style:solid;width:114px;}
</style>
<script>

var stopUp=null;
var stopDown=null;
var mov=-143;
var on;

function down(id){

    if (!on){
       on=true;
       clearTimeout(stopUp)
       stopUp=null;
    }

    var obj=document.getElementById(id)
    obj.style.top=mov +"px";
    if (mov <=27){
       mov+=2;
       stopDown=setTimeout(function (){ down(id) }, 20)
    }
}

function up(id){

    if (on){
       on=false;
       clearTimeout(stopDown)
       stopDown=null; 
    }

    var obj=document.getElementById(id)
    obj.style.top=mov +"px";
    if (mov >=-143){
       mov-=2;
       stopUp=setTimeout(function(){ up(id)}, 20);
    }

}


</script>

</head>

<body leftmargin=0 marginwidth=0 topmargin=0 marginheight=0>


<div id="Menu1" onmouseover="down('Menu1')" onmouseout="up('Menu1')">
URL 1<br>
URL 2<br>
URL 3<br>
URL 4<br>
URL 5<br>
URL 6<br>
URL 7<br>
URL 8<br>
</div>
</div>

<div id="Menu2" onmouseover="down('Menu2')" onmouseout="up('Menu2')">
URL 1<br>
URL 2<br>
URL 3<br>
URL 4<br>
URL 5<br>
URL 6<br>
URL 7<br>
URL 8<br>
</div>
</div>

<div id="Menu3" onmouseover="down('Menu3')" onmouseout="up('Menu3')">
URL 1<br>
URL 2<br>
URL 3<br>
URL 4<br>
URL 5<br>
URL 6<br>
URL 7<br>
URL 8<br>
</div>
</div>

<TABLE cellSpacing=0 cellPadding=0 BORDER=1 WIDTH=100%>
<TBODY>
<TR>
<TD align=middle CLASS="TDHREFMENUS"><span onmouseover="down('Menu1')" onmouseout="up('Menu1')">MENU 1</span>
</TD>
<TD align=middle CLASS="TDHREFMENUS"><span onmouseover="down('Menu2')" onmouseout="up('Menu2')">MENU 2</span>
</TD>
<TD align=middle CLASS="TDHREFMENUS"><span onmouseover="down('Menu3')" onmouseout="up('Menu3')">MENU 3</span>
</TD>
</TR>
</TBODY>
</TABLE>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>

<html>
<head>

РЕДАКТИРОВАТЬ: Когда я тестировал, это работало, если я зависал над одним меню, но если я быстро перемещал мышь над несколькими меню,первый работает, но остальные меню также останавливаются.

Menu1 {позиция: абсолютная;

top:-190px; left:150px;
font-size:15px;visibility:visible;
background-color:#D0BCFE;
width:114px;z-index:0;border-style:solid;
}

Menu2 {позиция: абсолютная;

top:-190px; left:580px;
font-size:15px;visibility:visible;
background-color:#D0BCFE;
width:114px;z-index:0;border-style:solid;
}

Menu3 {позиция: абсолютная;

top:-190px; left:1005px;
font-size:15px;visibility:visible;
background-color:#D0BCFE;
width:114px;z-index:0;border-style:solid;
}

TD.TDHREFMENUS {font-size: 20; цвет: красный; позиция: относительная; z-index: 0; цвет фона: # C4ABFE; border-стиль: сплошной; ширина: 114px;}

var stopUp = null;var stopDown = null;вар мов = -143;var on;function down (id) {if (! on) {on = true;clearTimeout (stopUp) stopUp = null;} var obj = document.getElementById (id) obj.style.top = mov + "px";if (mov = -143) {mov- = 2;stopUp = setTimeout (function () {up (id)}, 20);}}

URL 1
URL 2
URL 3
URL 4
URL 5
URL 6
URL 7
URL8
URL 1
URL 2
URL 3
URL 4
URL 5
URL 6
URL 7
URL 8
URL 1
URL2
URL 3
URL 4
URL 5
URL 6
URL 7
URL 8

МЕНЮ 1 МЕНЮ 2 МЕНЮ 3

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Ваши <div> не сбалансированы. У вас есть два закрывающих </div> с для каждого открывающего.

1 голос
/ 05 января 2011

Сброс тайм-аута не приведет к сбросу позиции объекта - , поскольку переменная mov используется совместно, это приведет к проблемным операциям во время переходов. Вы получите «последнее» значение перемещения, даже еслиновый перемещаемый элемент не выровнен соответственно.

Возможные исправления:

  1. Всегда получать позицию элемента из значения CSS - это сохранитпозиция для каждого элемента (так же работает анимация в jQuery).

  2. Сохранение поиска ( или привязка ) для каждого перемещения элемента, которое поддерживает позицию.Хотя я бы использовал первый, так как он проще.Для следующей части (поддержание идентификаторов таймера) будет использоваться # 2: -)

Кроме того, вам нужно будет поддерживать работу таймеров до тех пор, пока операция не будетбыло завершено (не просто произошел переход).Таким образом, общие значения stopUp и stopDown приведут к тем же проблемам , что и с указанным выше общим mov.(Это прозрачно обрабатывается с помощью очередей анимации jQuery).Тем не менее, № 1 сверху не работает хорошо здесь.Итак, давайте рассмотрим использование # 2 с привязками замыкания - для этого необходимо, чтобы события щелчка были присоединены в коде.

function addFlyout (elm) {
   var timerId
   elm.onmouseover = function () {
      // now can use timerId and it will only be accessible
      // to things within *this* invocation of addFlyout, including
      // inside here.
      timerId = setTimeout(function () {
         ...
         if (needToDoMore) {
           // it's easy to reference the anonymous function inside
           // with arguments.callee. alternatively, setInterval could be used
           timerId = setTimeout(arguments.callee, ...)
         }
      }, ...);
   }
   elm.onmouseout = function () {
      // ditto
   }
}
...
addFlyout(document.getElementById("Menu1"))

Заметки о закрытии Jibbering JS содержатмного полезной информации.Этот подход также может быть использован для mov, но, как и выше, я думаю, что в этом случае проще просто всегда получать текущее значение CSS.

Кроме того, проверьте свою разметку (избегая других глупостей браузера) изнать о проблемах с onmouseover / out - если перемещенный элемент перемещается (или изменяет форму) элемента, обрабатывающего события мыши, могут быть проблемы с инициируемыми событиями или пропущенными .

Использование jQuery - или аналогичного кросс-браузерного фреймворка - может упростить код и тривиально обработать вышеуказанный случай. (jQuery даже поставляется со встроенной функцией анимациитоже!)

jQuery (без использования готовой системы) будет выглядеть примерно так:

// get all elements to apply animation to
var elements = $("#Menu1").add("#Menu2").add("#Menu3")
elements.hover(function () { // over
  $(this).stop().animate({top: 140})
}, function () { // out
  $(this).stop().animate({top: 0})
})

Угадайте, что я бы порекомендовал: -)

Удачного кодирования.

...