Хотя добавление stop()
до animate()
решит проблему, возможно, стоит понять источник проблемы.
В этом случае пользователь наблюдает задержку анимации, поскольку несколько анимацийв очереди перед ним.
Один участник в резервном копировании очереди, потому что вызов завершения функции анимации выполняется один раз для анимированного элемента, а не один раз для анимации в целом.В следующем примере полный вызов вызывается дважды, что, в свою очередь, вызывает другую анимацию, в результате чего в очередь входят 4 анимации.
Например:
$("ul#menu a").click(function() {
myId = this.id;
$("ul#menu, h1#logo").animate({left: '-=572'}, 500, function() {
// This code will run twice, once when ul#menu finishes animating
// and once when h1#logo finishes animating. Is this the desired
// behavior? Is it safe to call api.goTo() twice?
$("#lang").css("display", "none");
$("#"+myId+"pr").animate({left: 0}, 200);
if(myId == "dojazd") {
$("#outer-mapka").css("left", "50%").css("margin-left", "-213px");
}
else {
api.goTo(myId.charAt(myId.length-1));
}
});
});
Другой участник очередиРезервное копирование и основной вклад, из-за общего селектора.В следующем примере при щелчке по закрытой ссылке происходит анимация всех 7 текстовых классов, а после завершения они вызывают еще 2 анимации.В результате получается 21 анимация:
$("a.close").click(function() {
api.goTo(1);
// The .text selector matches seven different elements. Thus, a when
// clicking the close link, seven animations are added to the queue.
$(".text").animate({left: "-=950"}, 200, function() {
$(".text, #outer-mapka").css("left", "-950px");
// And two more animations are added to the queue.
$("ul#menu, h1#logo").animate({left: '0'}, 500, function() {} );
$("#lang").css("display", "block");
});
});
Таким образом, когда вы щелкаете меню, закрываете страницу, а затем снова щелкаете меню, может наблюдаться задержка в ожидании прохождения 21 анимации через очередь.*
Чтобы решить эту проблему, можно использовать флаг, чтобы указать, должна ли выполняться полная функция.Кроме того, более конкретная информация о селекторах может помочь предотвратить ненужные вызовы.Вот возможное решение, реализующее оба:
$(window).load(function() {
mCustomScrollbars();
$(function(){
var menu_visible=true; // Flag to indicate if menu is visible.
$("ul#menu a").click(function() {
myId = this.id;
$("ul#menu, h1#logo").animate({left: '-=572'}, 500, function() {
// If the menu is not visible, then return as this function has
// already ran.
if (!menu_visible) return;
// Will be hiding the menu, so set the flag to false.
menu_visible = false;
$("#lang").css("display", "none");
$("#"+myId+"pr").animate({left: 0}, 200);
if(myId == "dojazd") {
$("#outer-mapka").css("left", "50%").css("margin-left", "-213px");
}
else {
api.goTo(myId.charAt(myId.length-1));
}
});
});
// For each text class.
$(".text").each(function() {
// Store a handle to the text.
var $text=$(this);
// Add a click event to a close link within the text.
$("a.close", $text).click(function() {
api.goTo(1);
// Only animate the text containing the close link.
$text.animate({left: "-=950"}, 200, function() {
$(".text, #outer-mapka").css("left", "-950px");
$("ul#menu, h1#logo").animate({left: '0'}, 500, function() {
// The menu is visible so set the flag.
menu_visible=true;
}) ;
$("#lang").css("display", "block");
});
});
});
});
});