2013-10-05 3 views
0

Я заметил проблему, когда тестировал событие mouseover. В приведенном ниже примере есть изображение, когда вы его наводите, оно становится больше, когда мышь отсутствует, он возвращается к нормальному размеру, но когда вы нажимаете на него много раз быстрее, он становится все больше и меньше несколько раз, как если бы он запомнил каждый прогон мыши и продолжал играть в анимацию снова и снова.Как предотвратить JavaScript от применения события mouseover несколько раз

Настоящий пример: Here Продолжайте быстро перемещать мышь и вынимать изображение, а затем отвести мышь, и вы увидите.

ответ

2

Позвольте мне познакомить вас с CSS3, вещь, которая делает JQuery устаревшим: Demo

HTML:

<img src="......./Smiley.png" alt="smile" id="imgSmile" /> 

CSS:

#imgSmile { 
    width:200px; 
    transition:width 0.4s ease; 
} 
#imgSmile:hover { 
    width:250px; 
} 

JS: NONE!

+0

Выглядит чище, любые побочные эффекты при использовании css-переходов вместо javascript? как совместимость браузеров? –

+0

«делает jQuery устаревшим» своеобразным широким заявлением. –

+1

@TechSupport Браузеры, которые не поддерживают переходы, просто будут иметь изображение, скачкообразно увеличивающее размер. Я считаю эту мотивацию для пользователей обновлять свои браузеры, а не сидеть рядом, сознательно игнорируя уведомление об обновлении. –

2

Использование .stop():

$(this).stop().animate({width: "200px"}, 'fast'); 

http://jsfiddle.net/bR5cm/2/

+0

Итак, stop() заставляет зависший объект останавливаться на том, что когда-либо было в нем, и применить к нему анимацию с этой точки? –

+1

Из документов: Когда вызывается .stop() для элемента, текущая анимация (если есть) немедленно останавливается. –

0

Вы можете добавить класс в то время как вы живой и удалить его после того, как анимация будет сделано, и только применять новые анимации, если класс не применяется к элементу , Пример:

$(document).ready(function(){ 
     $('#imgSmile').width(200); 
     $('#imgSmile').mouseover(function() 
     { 
      if(!$(this).hasClass('animating')){ 
       $(this).css("cursor","pointer"); 
       $(this).addClass('animating'); 
       $(this).animate({width: "250px"}, 'slow',function(){ 
        $(this).removeClass('animating'); 
       }); 
      } 
     }); 

    $('#imgSmile').mouseout(function() 
     { 
      $(this).animate({width: "200px"}, 'slow'); 
     }); 
    }); 

Демо: http://jsfiddle.net/bR5cm/3/

+0

Этот способ не дает хорошего решения, несколько раз наведите курсор, затем отведите мышь и попытайтесь снова навести курсор, анимация не будет воспроизводиться, пока не пройдет некоторое время. –

Смежные вопросы