Je dois ajouter un délai d'environ 100 milisecondes à mon code Javascript mais je ne veux pas utiliser la fonction setTimeout
de l'objet window
et je ne veux pas utiliser une boucle occupée. Est-ce que quelqu'un a des suggestions?Mettre un retard en Javascript
Répondre
Malheureusement, setTimeout()
est le seul moyen fiable (pas la seule façon, mais le seul moyen fiable ) pour mettre en pause l'exécution du script sans bloquer l'interface utilisateur.
Il est pas difficile à utiliser en fait, au lieu d'écrire ceci:
var x = 1;
// Place mysterious code that blocks the thread for 100 ms.
x = x * 3 + 2;
var y = x/2;
vous utilisez setTimeout()
de réécrire cette façon:
var x = 1;
var y = null; // To keep under proper scope
setTimeout(function() {
x = x * 3 + 2;
y = x/2;
}, 100);
Je comprends que l'utilisation setTimeout()
implique plus la pensée qu'un fonction souhaitable sleep()
, mais malheureusement, le plus tard n'existe pas. Beaucoup de solutions de contournement sont là pour essayer de mettre en œuvre de telles fonctions. Quelques boucles en utilisant occupées:
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
autres using an XMLHttpRequest
tied with a server script that sleeps for a amount of time before returning a result. Malheureusement, ce sont des solutions de contournement et sont susceptibles de causer d'autres problèmes (tels que la congélation des navigateurs). Il est recommandé de coller simplement avec la manière recommandée, qui est setTimeout()
).
J'utilise NoScript sur mon ordinateur portable précisément à cause de personnes qui utilisent des fonctions comme cette fonction de sommeil ou d'autres boucles serrées inutiles. Sinon, il brûle soudainement un trou sur mes genoux. –
** @ James M.:** Totalement d'accord ... Je n'ai jamais compris pourquoi il y a un si grand stigmate autour de 'setTimeout()'. –
Je ne crois pas que setTimeout() ait un quelconque stigmate qui l'entoure, c'est juste qu'il ne produit pas toujours l'effet désiré facilement. Dites, par exemple, si vous voulez faire tourner le processeur au ralenti pendant une courte période de temps dans une boucle de processus intensive pour éviter de bloquer le navigateur. L'obtention de ce résultat avec setTimeout peut être difficile pour les programmeurs JavaScript inexpérimentés. – KingRadical
This thread a une bonne discussion et une solution utile:
function pause(iMilliseconds)
{
var sDialogScript = 'window.setTimeout(function() { window.close(); }, ' + iMilliseconds + ');';
window.showModalDialog('javascript:document.writeln ("<script>' + sDialogScript + '<' + '/script>")');
}
Malheureusement, il semble que cela ne fonctionne pas dans certaines versions de IE, mais le fil a beaucoup d'autres propositions dignes si cela se révèle être un problème pour vous.
On dirait une solution en attente d'un problème. Je ne peux pas penser à une seule situation dans laquelle 'setTimeout' ne ferait pas son travail. Mais +1 pour la créativité. :) –
En fait, seul le setTimeout
convient à ce travail et normalement, vous ne pouvez pas définir des délais exacts avec des méthodes non déterminées comme des boucles occupées.
Vous ne pouvez pas mettre en pause l'interpréteur js avec setTimeout. –
Vous ne pouvez appeler une fonction qu'après un délai. setTimeout ne bloque pas. Le reste du code fonctionne comme il est censé le faire. –
J'ai juste eu un problème où j'avais besoin de résoudre cela correctement.
Via Ajax, un script reçoit des messages X (0-10). Ce que je voulais faire: Ajouter un message au DOM toutes les 10 secondes.
le code j'ai fini avec:
$.each(messages, function(idx, el){
window.setTimeout(function(){
doSomething(el);
},Math.floor(idx+1)*10000);
});
En fait, penser aux délais d'attente en tant que "timeline" de votre script.
C'est ce que nous voulons code:
DoSomething();
WaitAndDoNothing(5000);
DoSomethingOther();
WaitAndDoNothing(5000);
DoEvenMore();
C'est COMMENT NOUS AVONS BESOIN DE LUI DIRE LE JAVASCRIPT:
At Runtime 0 : DoSomething();
At Runtime 5000 : DoSomethingOther();
At Runtime 10000: DoEvenMore();
Hope this helps.
Merci pour la réponse expliquant le comportement de SetTimeOut. Le problème est que plus tard lorsque le code est long, ou dépend des réponses du serveur, il devient difficile de visualiser même le calendrier en quelques secondes. –
Utilisez une fonction AJAX qui appellera une page php de façon synchrone, puis dans cette page vous pourrez mettre la fonction php usleep() qui agira comme un retard.
function delay(t){
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST","http://www.hklabs.org/files/delay.php?time="+t,false);
//This will call the page named delay.php and the response will be sent to a division with ID as "response"
xmlhttp.send();
document.getElementById("response").innerHTML=xmlhttp.responseText;
}
s'il vous plaît formater le code pour le rendre lisible – kleopatra
Ne pas oublier les bases de la conception de sites Web. Le principe fondamental est de réduire la charge du serveur autant que vous le pouvez. Pour une simple temporisation, vous demandez une page du serveur un nombre infini de fois. Pense juste à ce que tu fais ici. –
- 1. Mettre du code HTML dans un iframe (en utilisant javascript)
- 2. Temps de retard sur clic
- 3. wxPython: wx.CallLater étant très en retard
- 4. variables en retard dans la R
- 5. événement Java manipulation avec un retard
- 6. Retard ou attente-pour
- 7. Saut incontrôlable - retard sIFR
- 8. avec retard hoverintent
- 9. retard Tricky sur mouseover
- 10. Puis-je attacher en retard aux gestionnaires d'événements en C#?
- 11. Comment mettre en surbrillance div en utilisant javascript ou jquery
- 12. J'ai un retard involontaire à jouer un Mix_Chunk
- 13. Retard de temps de classe Objective-C?
- 14. recherche du texte dans un autre texte et le mettre en évidence en utilisant javascript
- 15. Mettre en surbrillance dans Visual Studio pour Javascript?
- 16. Gestion des événements pour les objets liés en retard
- 17. Où puis-je mettre javascript dans ContentPlaceHolder?
- 18. Retard de signature sur le cadre compact
- 19. jQuery comment réinitialiser une fonction de retard
- 20. Retard de recouvrement chevauchant IIS 6.0
- 21. Comment puis-je pré-mettre en cache des images pour un affichage rapide avec javascript?
- 22. Mettre l'accent dans une zone de texte avec un nom de variable en utilisant javascript
- 23. Mettre un site web en mode maintenance?
- 24. Mettre en place un référentiel SVN spécifique
- 25. service de retard au démarrage du système
- 26. trouver un objet en Javascript
- 27. Mettre en surbrillance un morceau de code dans un lstlisting
- 28. en utilisant javascript pour suivre un autre script javascript?
- 29. JavaScript Auto suggérer de mettre à jour plusieurs champs
- 30. Développer un bordereau de paris en Javascript
Pouvez-vous expliquer pourquoi setTimeout ne convient pas/ne répond pas à vos besoins? – eyelidlessness