2016-12-28 15 views
0

Я заметил, что jQuery выполняет некоторые функции async. Например, посмотрите на этот jsFiddleКак выполнить 3 функции последовательно?

Html

<button id="click"> 
    TestMe 
</button> 
<div class="example"> 
    Hello 
</div> 

JS

var ex = $(".example").first(); 

$("#click").click(function() { 
    ex.addClass("notransition") 
    .width("100%") 
    .removeClass("notransition"); 
}) 

CSS

.example { 
    background-color: white; 
    width: 50%; 
    transition: width .5s ease; 
} 

.example.notransition { 
    transition: none; 
} 

При нажатии кнопки ожидаемый результат, что DIV должен расширяться без анимации из-за класса . Непереход, но этого не произойдет.

Так как я могу связать эти три метода?

ответ

0

Поскольку addClass() и removeClass() не используют очередь, они выполняются одновременно.

Вы можете использовать .queue() и .dequeue()

var ex = $(".example").first(); 
$("#click").click(function() { 
    ex.addClass("notransition").width("100%").delay(500).queue(function() { 
     ex.removeClass("notransition").dequeue(); 
    }); 
}); 

Updated Fiddle


Или просто setTimeout

var ex = $(".example").first(); 
$("#click").click(function() { 
    ex.addClass("notransition").width("100%"); 
    setTimeout(function() { 
     ex.removeClass("notransition").dequeue(); 
    },500); 
}); 
+0

В вашем примере div все еще расширен с переходом. Так что это не сработает. – koMah

+0

@koMah, см. Обновленный ответ. Это должно быть '.addClass (« notransition »). Width (« 100% »). Delay (500)' – Satpal

2

Попробуйте: Используйте функцию .done()

var ex = $(".example").first(); 

$("#click").click(function() { 
ex.addClass("notransition").width("100%").done(function(){ 
    ex.removeClass("notransition"); 
}) 

}); 
1

Попробуйте это:

var ex = $(".example").first(); 

$("#click").click(function() { 
    ex.addClass("notransition").width("100%").delay(1000).queue(function(){ 
    ex.removeClass("notransition"); 
    }); 
}) 

Кажется, хорошо работать в моем тестировании.