1

У меня возникли серьезные проблемы, связанные с работой очереди JQuery. Все определенные функции выполняют одновременно, поэтому изменение класса происходит до того, как animation- мы хотим, чтобы исчезать, а затем изменить класс, а затем исчезает снова.Проблемы с очередью JQuery

function animatePlusMinus(){ 
    if ($(this).hasClass("ui-icon-minus")) { 
     $(this).queue("goPlus",function(next) { 
       $(this).fadeOut(500); 
       next(); 
      }) 
      .queue("goPlus", function (next) { 
       $(this).removeClass("ui-icon-minus").addClass("ui-icon-plus").fadeIn(500); 
      }) 
      .dequeue("goPlus"); 

    } else if ($(this).hasClass("ui-icon-plus")) { 
     $(this) 
      .queue("goMinus", function (next) { 
       $(this).fadeOut(500); 
       next(); 
      }) 
      .queue("goMinus", function (next) { 
       $(this).removeClass("ui-icon-plus").addClass("ui-icon-minus").fadeIn(500); 
      }) 
      .dequeue("goMinus"); 
    } 
} 

я мог бы сделать этот простой пример с функцией обратного вызова на fadeOut, однако я хотел бы расширить эту логику таким образом, чтобы она нуждалась в надлежащей очереди. Мне также нужно научиться использовать .queue()!

UPDATE: Here is an JSFiddle

ответ

1

Прямо сейчас, вы звоните next сразу после того, как начал угасанием.

Решение состоит в том, чтобы передать next в качестве обратного вызова для fadeOut:

function animatePlusMinus(){ 
    if ($(this).hasClass("ui-icon-minus")) { 
     $(this).queue("goPlus",function(next) { 
       $(this).fadeOut(500, next); 
      }) 
      .queue("goPlus", function (next) { 
       $(this).removeClass("ui-icon-minus").addClass("ui-icon-plus").fadeIn(500); 
      }) 
      .dequeue("goPlus"); 

    } else if ($(this).hasClass("ui-icon-plus")) { 
     $(this) 
      .queue("goMinus", function (next) { 
       $(this).fadeOut(500, next); 
      }) 
      .queue("goMinus", function (next) { 
       $(this).removeClass("ui-icon-plus").addClass("ui-icon-minus").fadeIn(500); 
      }) 
      .dequeue("goMinus"); 
    } 
} 

Но если вы ищете более общее решение, вы, вероятно, лучше погрузиться в promises, а не в очередях. Здесь, с выполнением обещаний jQuery, вы можете сделать

function animatePlusMinus(){ 
    if ($(this).hasClass("ui-icon-minus")) { 
     $(this).fadeOut(500).promise().then(function(){ 
      $(this).removeClass("ui-icon-minus").addClass("ui-icon-plus").fadeIn(500); 
     }); 
    } else if ($(this).hasClass("ui-icon-plus")) { 
     $(this).fadeOut(500).promise().then(function(){ 
      $(this).removeClass("ui-icon-plus").addClass("ui-icon-minus").fadeIn(500);   
     }); 
    } 
} 
+0

Без 'dequeue' очередь не начинается вообще. Без 'next' он не переходит к следующей функции. – Jess

+0

@Jess Да, я неправильно понял вашу цель. См. Отредактированный ответ. –

+0

Спасибо! Я знал, что это будет что-то глупое. Интерфейс обещаний выглядит многообещающим * на будущее, но похоже, что поддержка еще не достаточно широка в браузерах. * (heh) – Jess

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