Вопрос

Как я могу отменить обещание, не удаляя элемент от DOM?

Widdle

Я провел этот код:

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

После этого есть способ отменить обещание?Как генеракодицетагкод и генеракодицетагкод не работал, потому что это не анимация, которую я пытаюсь отменить.Я видел, что clearQueue() должен сделать это ... Но я только хочу остановить обещание, а не удалить весь элемент.

Это было полезно?

Решение

Хорошие новости.Счера вы можете отменить свое обещание.

Я опубликовал новую версию моего небольшого плагина jQuery-Timing , который предоставляет два метода средиМногие другие называли .Wait () и .unwait ().

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

Если вы тогда хотите отменить регистрацию обратного вызова:

$.unwait();
.

Эти статические версии ожидания и Nepaist также поддерживают дополнительное имя группы, чтобы не отменять любой обработчик, а только определенный набор.

Кроме того, вы можете сделать намного более умные вещи, как:

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

или весь код в одной цепи, без варианта NENTAUIAT:

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

или тот же самый короче с возможностью отменить две паузы:

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

Просто см. Документы, примеры и API, что подходит для вас лучшее.

Другие советы

Я верю, что вы можете использовать $('#box').remove();

Из документации jQuery здесь: http://api.jquery.com/promise/ .

Возвращенное обещание связано с отсроченным объектом, хранящимся на .data () для элемента.Поскольку метод .Remove () Удаляет данные элемента, а также сам элемент, он предотвращает разрешение любого из нерешенных обещаний элемента.Если необходимо удалить элемент из DOM до того, как его обещание разрешено, используйте .DETACH () вместо этого и следуйте с помощью .Removedata () после разрешения. "

Я не полагаю, вы хотите что-то вроде http://jsfiddle.net/2cq8m/ ?Я связан с двумя обещаниями (один только для обработки случая в конце набора анимаций, другой для разрешения или отклонения по мере необходимости).

Вы хотите использовать отсрочку в этом случае вместо обещания, однако, вы можете использовать обещание анимации для разрешения отложенного.

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

как боковая заметка, отложенные могут быть отклонены или разрешены только один раз.Как только они будут отклонены или разрешены, вы не можете изменить свое состояние.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top