LINUX.ORG.RU

[JavaScript][Spry] Осечки onmouseover/onmouseout

 


0

2

Хочу сделать так, что бы при наведении мыши на определенный объект, он уплывал вверх, а при onmouseout соответственно опускался, за основу взял Slide Example 2. Проблема в том, что при быстром и резком перемещении мыши иногда объект залипает и происходит обратное действие: объект опускается при onmouseover и поднимается при onmouseout. Как с этим бороться?

<html>
    <script src="http://labs.adobe.com/technologies/spry/includes/SpryEffects.js" type="text/javascript"></script>
    
    <div onmouseover="some.start(); return false;" onmouseout="some.start(); return false;" id="someobject">
        <img src="http://www.linux.org.ru/black/lor-new.png" width="282" height="60">
    </div>
    
    <script type="text/javascript">
        var some = new Spry.Effect.Slide('someobject', {toggle:true});
    </script>
</html>

Я бы сделал костыльно:
На вызове onmouseover присваивал некой переменной sliding значение 1,
Когда эффект «поднятия» бы уже закончился, проверял бы значение sliding: если оно ещё равно 1, то обнулял бы. Если равно "-1", то вызывал бы функцию «опускания» объекта, а переменную sliding при этом снова бы обнулял.
Функция в onmouseout проверяла бы значение sliding, и если оно оказывалось ненулевым, то переменной присваивалось бы значение "-1", и вызов функции «опускания» не происходил бы. Если бы sliding имела значение 0, то вызывалась бы функция «опускания» объекта.

Terrens
()
Ответ на: комментарий от Terrens

Увы не работает, что я делаю не так:

<html>
    <script src="http://labs.adobe.com/technologies/spry/includes/SpryEffects.js" type="text/javascript"></script>
    
    <div onmouseover="sliding=1;
                      some.start();
                      if (sliding == 1){
						  sliding=0;
					  }else if(sliding == -1){
						  some.start()
						  sliding=0;
					  }"
		  onmouseout="if (sliding != 0){
			              sliding=-1;
			          }else if (sliding == 0){
				          some.start();
				      }">SLIDE</div><br><br><br>
    
    <div id="someobject">
        <img src="http://www.linux.org.ru/black/lor-new.png" width="282" height="60">
    </div>
    
    <script type="text/javascript">
        var sliding;
        var some = new Spry.Effect.Slide('someobject', {toggle:true});
    </script>
</html>

tr0ll
() автор топика

Всё, я понял, о чём речь, когда открыл такую страницу.

Проблема в том, что если быстро и резко перемещать указатель, то одно из событий может не сработать. Поскольку в обоих обработчиках используется одна и та же функция, причём как раз запоминающая, что она делала в предыдущий её вызов, то и происходит такой глюк.

Значит, нужно отслеживать, вызывался ли предыдущий обработчик.

Добавлено позднее: Только хотел поделиться радостью, как ошибка снова всплыла.

Terrens
()

Сам ловил такие глюки, причем это применимо к любому типу событий. Лечить не пробовал, но думаю стоит выставить задержку после срабатывания события. Будет время - попробую. На тему подписываюсь, может у кого уже проверенное решение есть

gnunixon ★★★
()
Ответ на: комментарий от tr0ll

мои глаза мои глаза, там так принято что-ли код в атрибутах писать?

trashymichael ★★★
()

Я сдаюсь.
Единственное, что мне ещё кажется разумным и могущим исправить ситуацию: контролировать направление движения объекта, используя информацию из библиотеки SpryEffects.

Terrens
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.