function1 = function(){
something.on('transitionend', function(){
// now function2 should run
});
}
function2 = function(){
alert('ok');
}
function1();
function2();
J'ai donc entendu parler des promesses de jQuery. Je renverrais un objet "différé" et, dans le gestionnaire d'événements, j'appellerais différé.resolve ();
Mais qu’arrivera-t-il si j’ai plusieurs gestionnaires d’événements là-bas et si je veux que la fonction suivante ne soit exécutée que lorsque tous ont été congédiés? .
Existe-t-il un autre moyen de détecter si la fonction1 a terminé tout son travail?
Essaye ça,
$.when($.ajax(fuction1())).then(function () {
fuction2;
});
Ici, fuction1 est votre première fonction à appeler et fuction2, votre deuxième fonction.
Soit vous prenez l'approche de promesse, soit vous prenez l'approche de rappel.
Avec les rappels, vous passeriez function2
en tant que paramètre à function1
;
function1 = function(callback){
something.on('transitionend', function(){
callback();
});
}
function2 = function(){
alert('ok');
}
function1(function2);
... mais alors vous êtes imbriqué si vous avez function3
dépendant de function2
et function4
dépendant de 3.
C'est pourquoi vous emprunterez la voie différée.
function1 = function(){
var def = new jQuery.Deferred();
something.on('transitionend', function(){
def.resolve(arguments);
});
return def.promise();
}
function2 = function(){
alert('ok');
}
function1().done(function2);
... ce qui vous permettrait d'enchaîner des fonctions successives plutôt que de les imbriquer (à condition qu'elles aient toutes rendu des promesses, bien sûr).
La combinaison des gestionnaires d'événements et des programmes différés est un peu compliquée. Donc, si vous aviez plusieurs gestionnaires d'événements, vous finirez par devoir faire quelque chose de boiteux, tel que;
function1 = function(){
var def = new jQuery.Deferred();
var wait = 4;
function maybeFire() {
if (--wait) {
def.resolve();
}
}
something.on('transitionend', maybeFire);
something.on('somethingelse', maybeFire);
something.on('somethingelse', maybeFire);
something.on('somethingelse', maybeFire);
return def.promise();
}
function2 = function(){
alert('ok');
}
function1().done(function2);
La manière real de combiner plusieurs différés consiste à utiliser $.when()
, mais malheureusement, vous ne disposez pas de plusieurs différés, et leur ajout sera aussi compliqué que d'utiliser l'approche maybeFire
.
Remarque: L'événement transitionend
peut se déclencher plusieurs fois si all
est défini dans la valeur css
transition
.
Essayer (ce modèle)
c'est-à-dire
html
<button>click</button>
css
button {
width: 100px;
-webkit-transition: width 1s;
}
.transition {
width: 150px
}
js
$(function() {
// `$.Callbacks("once")` to fire `alert` once ,
// even if `all` set within `css` `transition`
// property value
var callbacks = $.Callbacks();
function2 = function(j) {
alert(j);
};
callbacks.add(function2);
$(window).on("transitionComplete", function(e, i) {
// function2(i);
callbacks.fireWith($(this), [i]);
});
// `webkitTransitionEnd transitionend msTransitionEnd oTransitionEnd`
function1 = function() {
$("button").on('transitionend', function (e) {
$(window).trigger("transitionComplete", ["ok"]);
});
};
function1();
$("button").on("click", function(e) {
$(this).toggleClass("transition");
});
});