Frage

Wie kann ich ein Versprechen stornieren, ohne das Element aus dem DOM zu entfernen?

Geige

Ich habe diesen Code ausgeführt:

$("#box")
  .delay(2000)
  .show("slow")
  .delay(2000)
  .promise()                            
  .then(function(){log("Done");});

Gibt es danach eine Möglichkeit, das Versprechen zu widerrufen?Beide clearQueue() Und stop(true) hat nicht funktioniert, da es sich nicht um eine Animation handelt, die ich abzubrechen versuche.das habe ich gesehen remove() Sollte es tun ...aber ich möchte nur das Versprechen stoppen, nicht das gesamte Element entfernen.

War es hilfreich?

Lösung

Gute Nachrichten.Seit gestern können Sie Ihr Versprechen widerrufen.

Ich habe die neue Version meines kleinen Plugins veröffentlicht jquery-timing das unter anderem zwei Methoden bereitstellt: .wait() und .unwait().

var deferred = $("#box").delay(2000).show("slow").delay(2000).promise();
$.wait(deferred, function(){ log("Done"); });

Wenn Sie den Rückruf anschließend abmelden möchten:

$.unwait();

Diese statischen Versionen von „Wait“ und „Unwait“ unterstützen auch einen optionalen Gruppennamen, um keinen Handler, sondern nur einen bestimmten Satz abzubrechen.

Darüber hinaus können Sie noch viel mehr clevere Dinge tun, wie zum Beispiel:

$('#box').wait(deferred).addClass('ready');

oder der gesamte Code in einer Kette, ohne Unwait-Option:

$("#box").delay(2000).show("slow")
  .delay(2000).join(function(){log("Done");})).addClass('ready');

oder dasselbe noch kürzer mit der Möglichkeit, die beiden Pausen abzubrechen:

$("#box").wait(2000).show("slow",$)
  .wait(2000, function(){log("Done");})).addClass('ready');

Sehen Sie sich einfach die Dokumente, Beispiele und APIs an, die am besten zu Ihnen passen.

Andere Tipps

Ich glaube, Sie können verwenden $('#box').remove();

Aus der jQuery-Dokumentation hier: http://api.jquery.com/promise/

Das zurückgegebene Promise ist mit einem Deferred-Objekt verknüpft, das in .data() für ein Element gespeichert ist.Da die Methode .remove() sowohl die Daten des Elements als auch das Element selbst entfernt, wird verhindert, dass ungelöste Promises des Elements aufgelöst werden.Wenn es notwendig ist, ein Element aus dem DOM zu entfernen, bevor sein Promise aufgelöst wird, verwenden Sie stattdessen .detach() und folgen Sie nach der Auflösung mit .removeData().“

Ich nehme nicht an, dass Sie so etwas wollen würden http://jsfiddle.net/2cq8M/ ?Ich beziehe zwei Versprechen mit ein (eines nur, um den Fall am Ende der Animationsreihe zu bearbeiten, das andere, um es je nach Bedarf zu lösen oder abzulehnen).

In diesem Fall möchten Sie anstelle eines Versprechens ein Deferred verwenden. Sie können jedoch das Versprechen der Animation verwenden, um das Deferred aufzulösen.

http://jsfiddle.net/LG9eZ/9/

var stopDone = true;

function log(msg) {
    $(".debug").append(new Date() + " - " + msg + "<br/>");
}

log("Starting");

var boxAnimation = new $.Deferred();
boxAnimation.done(function() {
    log("Done");
});
boxAnimation.fail(function() {
    log("Stopped");
});


$("#box").delay(2000).show("slow").delay(2000).promise().then(function() {
    boxAnimation.resolve(); // when all the animations are done, resolve the deferred.
}); 


if (stopDone)
{
    boxAnimation.reject();
}

Als Randbemerkung: Aufschiebungen können nur einmal abgelehnt oder gelöst werden.Sobald sie abgelehnt oder gelöst wurden, können Sie ihren Status nicht mehr ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top