11

DOM から要素を削除せずに promise をキャンセルするにはどうすればよいですか?

フィドル

私はこのコードを実行しました:

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

この後、約束を取り消す方法はありますか?キャンセルしようとしているのはアニメーションではないため、両方とも機能clearQueue()しませんでした。stop(true)私はそれremove()を行うべきだと見ました...しかし、要素全体を削除するのではなく、約束を止めたいだけです。

4

4 に答える 4

2

私はあなたが使用できると信じています$('#box').remove();

ここのjQueryドキュメントから:http://api.jquery.com/promise/

返された Promise は、要素の .data() に格納されている Deferred オブジェクトにリンクされます。.remove() メソッドは要素のデータと要素自体を削除するため、要素の未解決の Promise が解決されないようにします。Promise が解決される前に DOM から要素を削除する必要がある場合は、代わりに .detach() を使用し、解決後に .removeData() に従ってください。"

于 2012-03-08T00:16:25.263 に答える
1

この場合、promise の代わりに deferred を使用したいのですが、アニメーションの promise を使用して deferred を解決できます。

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();
}

補足として、deferred は 1 回だけ拒否または解決できます。拒否または解決されると、その状態を変更することはできません。

于 2012-04-17T14:43:12.123 に答える
1

http://jsfiddle.net/2cq8M/のようなものが必要だとは思いませんか?私は 2 つの Promise を使用しています (1 つは一連のアニメーションの最後でケースを処理するためのもので、もう 1 つは必要に応じて解決または拒否するためのものです)。

于 2012-03-08T00:45:44.420 に答える