Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Limitation de délai dans des scripts (IE)

31 réponses
Avatar
CriCri
Salut le SAMU

Savez-vous ressusciter Internet Explorer?
J'ai un script JS qui introduit volontairement des délais (au choix de
l'utilisateur) pour permettre d'admirer ce qui est affiché (et faire des
captures d'écran etc).
(Z'inquiétez pas pô - z'allez le voir quand il sera perfectionné ;-))

Habituellement, après un certain temps, le navigateur considère que le
script est coincé dans une boucle et t'en prévient; te donnant ainsi
l'occasion de le terminer.

Or, selon le navigateur les résultats sont très variables:
1. Opéra n'a rien à dire; il veut bien patienter jusqu'à la nouvelle lune.
2. La grande famille Gecko (Netscape, Mozilla, SeaMonkey, Firefox) est
paramétrable: il suffit de régler "dom.max_script_run_time" à la valeur
voulue.
3. En revanche Internet Explorer (6) ne semble réagir à rien: j'en ai
marre de fouiller 10000 clés dans la BDR pour rien trouver. Quelqu'un
sait-il ce qu'il faut modifier (ou probablement plutôt rajouter) pour
modifier son comportement?

Merci pour vos délais.
CriCri

--
bitwyse [PGP KeyID 0xA79C8F2C]
Les conseils - c'est ce qu'on demande quand on connaît déjà la réponse
mais aurait préféré ne pas la savoir.
http://www.le-maquis.net

10 réponses

1 2 3 4
Avatar
CriCri
Sylvain SF a écrit :

sinon inutile de demander conseil.



Je n'ai jamais demander de conseils sur ce sujet: certes il m'intéresse
mais je n'en discuterai plus avec quelqu'un qui semble penser comme il
écrit (ou vice-versa).

PLONK!

--
bitwyse [PGP KeyID 0xA79C8F2C]
Les conseils - c'est ce qu'on demande quand on connaît déjà la réponse
mais aurait préféré ne pas la savoir.
http://www.le-maquis.net
Avatar
Doug713705
Le mercredi 28 mai 2008 01:34, CriCri s'est exprimé de la sorte sur
fr.comp.os.ms-windows :

Javascript ne peut pas exécuter plusieurs tâches en même temps.



Bien sûr que si: il peut exécuter une tâche dans Internet Explorer, une
tâche dans SeaMonkey, une tâche dans Opéra...



Euh... pas tout à fait.
Plusieurs instances de javascript peuvent exécuter en même temps une tache
chacune mais chaque instance n'exécute qu'une tache à la fois.

Javascript, comme son nom l'indique, n'est que du script exécuté
séquentiellement "pas à pas" (ligne par ligne si tu préfères) à partir
duquel on peut gérer certains évènements (mais ça ne change pas le
problème).

Les pros confirmeront ou infirmeront mon explication.
--
@+
Doug - Linux user #307925 - Gentoo rocks ;-)
[ Plus ou moins avec une chance de peut-être ]
Avatar
CriCri
Salut

Doug713705 a écrit :

Plusieurs instances de javascript peuvent exécuter en même temps une
tache chacune mais chaque instance n'exécute qu'une tache à la fois.




Tu as absolument raison - en fait c'est ce que je voulais dire mais je
n'ai pas été clair. Chaque interpréteur étant un child de son propre
navigateur.

Javascript, comme son nom l'indique, n'est que du script exécuté
séquentiellement "pas à pas" (ligne par ligne si tu préfères) à
partir duquel on peut gérer certains évènements...



Idem. En revanche si un nouvel évènement se produit, déclenchant un
nouveau script pendant le temps d'exécution d'un autre déjà existant les
deux peuvent cohabiter sans interruption de l'un ni de l'autre -
par le spawn d'un nouveau process ou le démarrage d'un nouveau thread
(selon la volonté du programmeur).

On peut également envisager l'exécution de plusieurs scripts
simultanément: indépendamment associés à d'autres objets sur la même page.

Amicalement
CriCri

--
bitwyse [PGP KeyID 0xA79C8F2C]
Les conseils - c'est ce qu'on demande quand on connaît déjà la réponse
mais aurait préféré ne pas la savoir.
http://www.le-maquis.net
Avatar
Doug713705
Le jeudi 29 mai 2008 10:59, CriCri s'est exprimé de la sorte sur
fr.comp.os.ms-windows :

Idem. En revanche si un nouvel évènement se produit, déclenchant un
nouveau script pendant le temps d'exécution d'un autre déjà existant les
deux peuvent cohabiter sans interruption de l'un ni de l'autre



Ben non justement, la boucle est bloquante même pour un évènement.

Essaie ce bout de code pour t'en convaincre :
Principe : Cliquer sur "Start" pour lancer la boucle et pendant l'exécution
de celle ci, cliquer sur "Click me".

L'alert "BINGO" déclanchée par le clic sur "Click me" n'apparaît pas avant
que "GAME OVER" n'apparaisse signalant la fin de la boucle déclenché par la
clic sur "Start"

<HTML>
<HEAD>
<script type='text/javascript'>
function boucle(time){
for(i=0;i<time;i++){
document.getElementById('bouton').value='GAME OVER !';
}
}
</script>
</HEAD>
<BODY>
<input type='button' value='Start' onClick='boucle(200000)'>
<input ID='bouton' type='button' value='Click me' onClick='alert("BINGO")'>
</BODY>
</HTML>
--
@+
Doug - Linux user #307925 - Gentoo rocks ;-)
[ Plus ou moins avec une chance de peut-être ]
Avatar
Doug713705
Le jeudi 29 mai 2008 10:59, CriCri s'est exprimé de la sorte sur
fr.comp.os.ms-windows :

Idem. En revanche si un nouvel évènement se produit, déclenchant un
nouveau script pendant le temps d'exécution d'un autre déjà existant les
deux peuvent cohabiter sans interruption de l'un ni de l'autre



Ben non justement, la boucle est bloquante même pour un évènement.

Essaie ce bout de code pour t'en convaincre :
Principe : Cliquer sur "Start" pour lancer la boucle et pendant l'exécution
de celle ci, cliquer sur "Click me".

L'alert "BINGO" déclanchée par le clic sur "Click me" n'apparaît pas avant
que "GAME OVER" n'apparaisse signalant la fin de la boucle déclenché par la
clic sur "Start"

<HTML>
<HEAD>
<script type='text/javascript'>
function boucle(time){
for(i=0;i<time;i++){
}
document.getElementById('bouton').value='GAME OVER !';
}
</script>
</HEAD>
<BODY>
<input type='button' value='Start' onClick='boucle(200000)'>
<input ID='bouton' type='button' value='Click me' onClick='alert("BINGO")'>
</BODY>
</HTML>
--
@+
Doug - Linux user #307925 - Gentoo rocks ;-)
[ Plus ou moins avec une chance de peut-être ]
Avatar
Doug713705
Le jeudi 29 mai 2008 10:59, CriCri s'est exprimé de la sorte sur
fr.comp.os.ms-windows :

(Ne pas tenir compte des autres messages dont le code fourni n'était pas
validant)

Idem. En revanche si un nouvel évènement se produit, déclenchant un
nouveau script pendant le temps d'exécution d'un autre déjà existant les
deux peuvent cohabiter sans interruption de l'un ni de l'autre



Ben non justement, la boucle est bloquante même pour un évènement.

Essaie ce bout de code pour t'en convaincre :
Principe : Cliquer sur "Start" pour lancer la boucle et pendant l'exécution
de celle ci, cliquer sur "Click me".

L'alert "BINGO" déclanchée par le clic sur "Click me" n'apparaît pas avant
que "GAME OVER" n'apparaisse signalant la fin de la boucle déclenché par la
clic sur "Start"

<HTML>
<HEAD>
<script type='text/javascript'>
function boucle(time){
for(i=0;i<time;i++){
document.getElementById('rien').value="rien";
}
document.getElementById('bouton').value='GAME OVER !';
}
</script>
</HEAD>
<BODY>
<input type='button' value='Start' onClick='boucle(200000)'>
<input type='hidden' ID='rien' value=''>
<input ID='bouton' type='button' value='Click me' onClick='alert("BINGO")'>
</BODY>
</HTML>
--
@+
Doug - Linux user #307925 - Gentoo rocks ;-)
[ Plus ou moins avec une chance de peut-être ]
Avatar
Sylvain SF
Doug713705 wrote on 30/05/2008 00:18:

Essaie ce bout de code pour t'en convaincre : [...]



ou lire la doc ...

Sylvain.
Avatar
Le Gaulois
Sylvain SF a écrit :

ou lire la doc ...



Chouette un RTFM, ça manquait dans ce forum. Vivement que ça
devienne comme chez les manchots.
Avatar
CriCri
Salut

Doug713705 a écrit :

Ben non justement, la boucle est bloquante même pour un évènement.



Je ne voulais pas parler de boucles bloquantes, mais de scripts qui
peuvent s'exécuter imbriqués sans s'interrompre.

Essaie ce bout de code...



Tu peux cliquer sur n'importe quoi à n'importe quel moment et rien ne
bloque rien.
(Je sais ce que je veux démontrer mais c'est difficile de trouver un
exemple très simple et assez court...)
--------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>JS x 36</title>
<script TYPE='text/javascript'>
var i = 0, compte = 0;
var tid = new Array( 16 );
function compteur()
{
document.getElementById( "compteur" ).value = ++compte;
}
</script>
</head>
<body>
<p><input TYPE="button" VALUE="- vite" STYLE="width:96px" onClick="if (i) clearInterval(tid[--i]); return true;">
<input TYPE="text" ID="compteur" VALUE="0" STYLE="text-align:right;" READONLY>
<input TYPE="button" VALUE="+ vite" STYLE="width:96px" onClick="if (i<15) tid[i++]=setInterval('compteur()',500); return true;"></p>
<p><input TYPE="button" VALUE="Instantané" STYLE="width:96px" onClick="document.getElementById('valeur').value = compte; return true;">
<input TYPE="text" ID="valeur" VALUE="0" STYLE="text-align:right;" READONLY>
<input TYPE="button" VALUE="Reset" STYLE="width:96px" onClick="document.getElementById('valeur').value = compte = 0; return true;"></p>
</body>
</html>
--------

Amicalement
CriCri

--
bitwyse [PGP KeyID 0xA79C8F2C]
Les conseils - c'est ce qu'on demande quand on connaît déjà la réponse
mais aurait préféré ne pas la savoir.
http://www.le-maquis.net
Avatar
Doug713705
Le vendredi 30 mai 2008 12:04, CriCri s'est exprimé de la sorte sur
fr.comp.os.ms-windows :

Salut

Doug713705 a écrit :

Ben non justement, la boucle est bloquante même pour un évènement.



Je ne voulais pas parler de boucles bloquantes, mais de scripts qui
peuvent s'exécuter imbriqués sans s'interrompre.



Ah ? j'avais donc mal compris ce passage de ton post initial :

"Habituellement, après un certain temps, le navigateur considère que le
script est coincé dans une boucle et t'en prévient; te donnant ainsi
l'occasion de le terminer."

D'autant plus que les symptômes que tu signalait à ce moment sont typiques
d'une boucle infinie (ou trop longue).

Essaie ce bout de code...



Tu peux cliquer sur n'importe quoi à n'importe quel moment et rien ne
bloque rien.



Dans le code que j'ai fourni ou dans le tien ?
Pour mon code je n'ai pas testé sous I.E (pas de Windows sous la main) mais
avec SeaMonkey ça bloque.

Si tu parles de ton code, c'est normal puisque tu utilises setInterval().
Pendant l'interval de pause, l'execution du code peut continuer.

Tu remarqueras que les autres contributeurs t'ont d'ailleurs conseillé
l'utilisation conjointe de setInterval() et de setTimeout().

Mais bon, pour le coup ce n'est pas spécifique à Windows.

Amicalement



Pareillement.

--
@+
Doug - Linux user #307925 - Gentoo rocks ;-)
[ Plus ou moins avec une chance de peut-être ]
1 2 3 4