jQuery / Método / .delay() - Adiar a próxima operação da fila de efeitos
No jQuery, .delay() adia operações posteriores de uma fila, normalmente a de efeitos. Não pausa uma função em execução nem interrompe todo o JavaScript. Um método que não usa essa fila pode executar imediatamente mesmo encadeado depois de .delay().
Identificar quais operações esperam
A documentação de .delay() define .delay(duration, queueName). duration é em milissegundos; sem queueName, a espera entra na fila de efeitos padrão fx. Uma fila guarda operações que serão executadas em sequência para aquele elemento. A espera começa quando o trabalho anterior termina e chega a vez do atraso.
| Operação seguinte | Fila de efeitos padrão | Depois de .delay() |
|---|---|---|
| .fadeIn(), .fadeOut() | Normalmente usada | O efeito começa após a espera |
| .show(0) | Usada como efeito com duração | Mostra imediatamente quando chega sua vez |
| .show(), .hide() | As formas imediatas sem argumento não a usam | Podem executar imediatamente apesar do encadeamento |
.delay(800) acrescenta uma espera de 800 milissegundos. "fast" e "slow" representam 200 e 600 milissegundos, mas números deixam a comparação mais clara. O tempo anterior é separado: um efeito de 200 milissegundos termina antes de começar a espera adicional de 800 milissegundos.
Exemplo completo de show(0) e show()
Salve todo o código em UTF-8 como delay-demo.html e abra no navegador. É preciso internet para carregar a versão oficial completa do jQuery pela rede de distribuição de conteúdo, CDN; não é preciso instalar pacotes. Não use a versão slim, que exclui efeitos.
O código carrega 4.0.0. Espera na fila, exibição imediata, continuação do JavaScript, restauração durante a espera e cancelamento do temporizador nativo foram executados com 3.7.1 e 4.0.0. As duas caixas começam ocultas e cada botão de exibição controla uma caixa diferente.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Delay a queued effect, not JavaScript</title>
<style>
body { font: 16px/1.6 sans-serif; margin: 24px; }
.box { display: none; padding: 16px; margin: 12px 0; background: #e4f2ef; }
button, select { padding: 8px; margin: 4px; }
</style>
<script src="https://code.jquery.com/jquery-4.0.0.min.js"></script>
</head>
<body>
<h1>Delay a queued effect, not JavaScript</h1>
<label for="wait">Wait:</label>
<select id="wait"><option value="800">800 ms</option><option value="200">200 ms</option></select>
<button type="button" id="run">Queued show(0)</button>
<button type="button" id="trap">Immediate show()</button>
<button type="button" id="reset">Reset</button>
<div class="box" id="queued">A queued display operation</div>
<div class="box" id="plain">An immediate display operation</div>
<p>Queue phase: <span id="phase">ready</span></p>
<p id="continued"></p>
<p id="result" aria-live="polite"></p>
<script>
$(function () {
const $queued = $("#queued");
const $plain = $("#plain");
let busy = false;
function report() {
const queued = $queued.is(":visible") ? "visible" : "hidden";
const plain = $plain.is(":visible") ? "visible" : "hidden";
$("#result").text(`queued=${queued} | plain=${plain}`);
}
$("#run").on("click", function () {
if (busy) return;
busy = true;
$("#phase").text("waiting");
$queued.stop(true, false).hide()
.delay(Number($("#wait").val()))
.show(0, function () {
busy = false;
$("#phase").text("done");
report();
});
$("#continued").text("Script continues immediately");
report();
});
$("#trap").on("click", function () {
$plain.stop(true, false).hide()
.delay(Number($("#wait").val())).show();
report();
});
$("#reset").on("click", function () {
$queued.add($plain).stop(true, false).hide();
busy = false;
$("#phase").text("ready");
$("#continued").text("");
report();
});
report();
});
</script>
</body>
</html>
Resultado inicial:
queued=hidden | plain=hidden
- Mantenha Wait em 800 ms e pressione Queued show(0). Queue phase mostra waiting e a primeira caixa continua oculta.
- Script continues immediately aparece logo: .delay() não bloqueou o JavaScript seguinte.
- Depois da espera, a primeira caixa aparece, phase muda para done e o resultado para
queued=visible | plain=hidden. - Pressione Reset e depois Immediate show(). A segunda caixa aparece sem esperar, com
queued=hidden | plain=visible. .show() sem argumentos executa fora da fila. - Restaure novamente, escolha 200 ms e execute Queued show(0) para uma espera menor.
- Durante a espera de 800 ms, pressione Reset. Ambas ficam ocultas e phase volta a ready. A primeira não reaparece após o prazo original.
O zero de .show(0) é a duração do efeito de exibição depois que chega sua vez, não cancela a espera anterior. .show() imediato e .show(0) colocado na fila têm comportamentos diferentes.
Gerenciar nomes de filas e restauração
.queue() gerencia a fila de trabalho de um elemento. Com um nome personalizado, use o mesmo para a espera e o trabalho seguinte. Não suponha início automático: inicie a fila explicitamente, por exemplo com .dequeue("work").
Reset usa .stop(true, false) para limpar a fila de efeitos deste exemplo e interromper seu andamento atual. Nas duas versões testadas, restaurar durante a espera impediu a exibição prevista. .delay() não devolve um ID de temporizador nativo nem um identificador independente de cancelamento; não serve para agendar e cancelar qualquer tarefa JavaScript em geral.
.clearQueue() remove entradas ainda pendentes. Remover trabalho futuro e interromper trabalho em andamento são operações diferentes. O exemplo restaura apenas suas duas caixas; busy ignora pedidos adicionais de Queued show(0) durante a execução para não acumular esperas.
Usar temporizadores para funções comuns
Para trabalho sem relação com a fila de animação, agende a função com setTimeout(). Guarde o ID devolvido e passe para clearTimeout() quando precisar cancelar. Execute este trecho completo no Console das ferramentas de desenvolvimento: later, previsto para 800 milissegundos, é cancelado e somente cancelled aparece.
const timer = setTimeout(() => console.log("later"), 800);
clearTimeout(timer);
console.log("cancelled");
cancelled
Tempos de temporizadores e filas de efeitos não garantem um instante exato de execução. Outras tarefas do navegador e o estado da aba podem atrasá-la. Vincule etapas importantes à conclusão real em vez de estimar uma espera fixa.
Se um método parece não esperar, confira se usa fila e se elemento e nome correspondem. Se a caixa não aparecer, verifique seleção e alvo existente, início da fila personalizada, carregamento do jQuery completo em Network e erros no Console.




