Existe uma maneira de limpar todos os tempos limite de uma determinada janela? Suponho que os tempos limites estejam armazenados em algum lugar do window
objeto, mas não foi possível confirmar isso.
Qualquer solução cross-browser é bem-vinda.
javascript
timeout
marcio
fonte
fonte
Respostas:
Eles não estão no objeto janela, mas têm ids, que (afaik) são inteiros consecutivos.
Portanto, você pode limpar todos os tempos limite como:
fonte
Acho que a maneira mais fácil de fazer isso seria armazenar todos os
setTimeout
identificadores em um array, onde você pode iterar facilmenteclearTimeout()
em todos eles.fonte
Eu tenho uma adição à resposta do Pumbaa80 que pode ser útil para alguém desenvolvendo para IEs antigos.
Sim, todos os principais navegadores implementam ids de tempo limite como inteiros consecutivos (o que não é exigido pela especificação ). Embora o número inicial seja diferente de navegador para navegador. Parece que Opera, Safari, Chrome e IE> 8 iniciam ids de tempo limite de 1, navegadores baseados no Gecko de 2 e IE <= 8 de algum número aleatório que é salvo magicamente na atualização da guia. Você pode descobrir sozinho .
Tudo isso indica que no IE <= 8 o
while (lastTimeoutId--)
ciclo pode ser executado mais de 8 dígitos e mostrar a mensagem " Um script nesta página está fazendo com que o Internet Explorer seja executado lentamente ". Portanto, se você não puder salvar todos os ids de timeout ou não quiser substituir window.setTimeout, você pode considerar salvar o primeiro id de timeout em uma página e limpar os tempos limites até ele.Execute o código no carregamento inicial da página:
E, em seguida, limpe todos os tempos limite pendentes que provavelmente foram definidos por código estrangeiro tantas vezes que você deseja
fonte
Que tal armazenar os ids de tempo limite em uma matriz global e definir um método para delegar a chamada de função para a janela.
fonte
Você deve reescrever o
window.setTimeout
método e salvar seu ID de tempo limite.fonte
Para limpar todos os tempos limite, eles devem ser "capturados" primeiro :
Coloque o código abaixo antes de qualquer outro script e ele criará uma função de wrapper para o
setTimeout
& originalclearTimeout
.Um novo
clearTimeouts
método será adicionado aowindow
objeto, o que permitirá limpar todos os tempos limite (pendentes) ( link Gist ).fonte
Para completar, gostaria de postar uma solução geral que abrange ambos
setTimeout
esetInterval
.Parece que os navegadores podem usar o mesmo pool de IDs para ambos, mas de algumas das respostas para ClearTimeout e clearInterval o mesmo? , não está claro se é seguro confiar
clearTimeout
eclearInterval
executar a mesma função ou apenas trabalhar em seus respectivos tipos de temporizador.Portanto, quando o objetivo é eliminar todos os tempos limite e intervalos, aqui está uma implementação que pode ser um pouco mais defensiva entre as implementações quando não é possível testar todos eles:
Você pode usá-lo para limpar todos os temporizadores na janela atual:
Ou você pode usá-lo para limpar todos os temporizadores em um
iframe
:fonte
Eu uso Vue com Typescript.
fonte
Use um tempo limite global do qual todas as outras funções derivam do tempo. Isso fará com que tudo seja executado mais rápido e mais fácil de gerenciar, embora adicione alguma abstração ao seu código.
fonte
set_timeout
função global? Você poderia dar um exemplo de código?Acabamos de publicar um pacote que resolve exatamente esse problema.
npm install time-events-manager
Com isso, você pode ver todos os tempos limite e intervalos por meio de
timeoutCollection
&intervalCollection
objetos. Há também umaremoveAll
função que limpa todos os tempos limite / intervalos da coleção e do navegador.fonte
Já é muito tarde ... mas:
Basicamente, os IDs setTimeout / setInterval vão em ordem consecutiva, portanto, basta criar uma função de tempo limite fictício para obter o ID mais alto e limpar o intervalo em todos os IDs menores que esse.
fonte