11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

je recherche à ajouter un délai de 1 ou 2 secondes à un javascript existant mais étant une bille en javascript je n'arrive pas à modifier ce simple code.


<script type="text/javascript">
// Méthode pour changer la visibilité d'une balise dont l'ID est passée en paramètre

function toggleVisibility(tagId) {
if (!document.getElementById) {
msg = 'Votre navigateur est trop ancien pour profiter de votre visite\n';
msg += 'Veuillez le mettre à jour ou vous en procurer un autre';
return false;
}
var tagToToggle;
try { // On tente de récupérer la balise cible dont on doit changer la visibilité
tagToToggle = document.getElementById(tagId);
} catch (e) { // Si échec de la récupération de la balise cible
alert('Je n\'ai pas pu trouver la balise cible');
}
try { // Seulement pour les non IE
if (tagToToggle.style.display == 'none') {
tagToToggle.style.display = 'inline';
} else {
tagToToggle.style.display = 'none';
}
} catch (e) {
}
// Pour IE
if (tagToToggle.style.visibility == 'hidden') {
tagToToggle.style.visibility = 'visible';
} else {
tagToToggle.style.visibility = 'hidden';
}
}
</script>


l'appel à la fonction se fait ainsi :
"javascript:toggleVisibility(\'ok-'.$id.'\')"


si vous avez une solution pour moi je vous serai éternellement reconnaissant Smiley cligne
Modifié par buzza (31 Jan 2007 - 06:31)
IL n'existe pas de fonction telle sleep ou delay en javascript.
La façon de faire la plus simple pour détourner cet obstacle est de faire deux fonctions, et d'appeler la deuxième grâce à setTimeout.
QuentinC a écrit :
IL n'existe pas de fonction telle sleep ou delay en javascript.
La façon de faire la plus simple pour détourner cet obstacle est de faire deux fonctions, et d'appeler la deuxième grâce à setTimeout.


Evidemment ! QuentinC a encore grillé tout le monde sur ce truc ! Il avait déjà ma reconnaissance éternelle, mais cela ne suffisait certainement pas !

Alleché tout de même par quelques miettes, je me permets mon grain de sel :

La méthode proposée par Quentinc est évidemment la seule raisonnable.
Mais il faut tout de même faire attention :
Le monde autour ne s'arrête pas de tourner après armement du timeout.
En d'autres termes, l'utilisateur peut avoir fait des actions pendant le laps de temps spécifié.

Il est en l'occurrence fort probable que ta fonction soit associée à un gestionnaire d'évènement. Ne va-t-il pas se produire quelle que chose non souhaitable si cet évènement (ou un autre) se reproduit pendant le laps de temps spécifié ?
C'est d'autant probable que l'utilisateur est a priori impatient. Si il n'est pas habitué et que rien ne se produit suite à une de ses actions, il va recommencer très rapidement.

En finale, je pense une bonne pratique de rajouter l'assignation d'une variable globale dans la première fonction, variable indiquant que l'on a déjà requis le timeout, variable remise à 0 à la fin de l'exécution de la seconde fonction, variable testable dans tout autre gestionnaire d'évènement et en particulier dans la première fonction.

En clair, cela donne quelle que chose du style :


var ToRqst;
ToRqst=0;

fct1(...){

if(ToRqst)return;
ToRqst=1;
setTimeout(fct2,délai);}

fct2(...){

...Ton Code...
ToRqst=0;}


Dans cet exemple, on ignore tout simplement la sollicitation si celle-ci est déjà requise, mais tu peux envisager de multiples autres traitements ainsi que des tests de ToRqst dans d'autres gestionnaires d'événement.

Comme diraient nos amis britanniques, je crois vraiment que cette pratique est sage. It is wise to !
Tiens... je crois même que l'on devrait l'ériger en standard !
Modifié par aCOSwt (31 Jan 2007 - 07:31)
Allez ! Tant qu'on y est...

Pourquoi pas un vrai-faux-vrai sleep ?

Handle with extreme care of course...


	var	Sleeping;

function JSleep(delay){

	Sleeping=1;
	setTimeout(dummy,delay);
	for(;Sleeping;);}
	
function dummy(){

	Sleeping=0;}


Encore une fois handle with care car je ne suis pas sûr que cette fonctionnalité de sleep aille systématiquement dans le sens de l'accessibilité.

Mais comme cela peut dépendre des cas et que... provide... (bon ! vous allez commencer à le savoir...)
Modifié par aCOSwt (31 Jan 2007 - 09:55)
Merci pour vos réponses mais alors ce n'est pas une bille mais un boulet en javascript que je dois etre lol.

Par contre pour etre plus clair si je veux avoir une temporisation sur la fonction c'est pour cela :

1. l'utilisateur clic sur un lien qui disparait en fade
2. mon div cache avec le message apparait

et actuellement les 2 se produisent en meme temps ce qui produit un defaut d'affichage alors je pensais que si je pouvais le retarder le temps que le fade se termine je n'aurai pas se probleme

Ce que je ne vois pas comment faire c'est comment appelé la fonction du timeout vu que j'ai un argument a passé dans mon lien ( id du div a rendre visible)
a écrit :
'Votre navigateur est trop ancien pour profiter de votre visite\n';
msg += 'Veuillez le mettre à jour ou vous en procurer un autre';

Smiley lol
Bonjour,

buzza a écrit :

1. l'utilisateur clic sur un lien qui disparait en fade


Envisager Flash, avec contenu alternatif HTML si tu veux être /accessible/référençé/etc.

C'est une question de choix raisonné de moyens: flash est plus facile et pertinent quand les effets priment sur le contenu.
en fait c'est surtout d'afficher un nouveau texte sans avoir a recharger la page, ce n'est pas vraiment important en terme d'accesibilité/referencement. Il ne manque pas grand chose pour que le resultat soit nikel sur les derniers navigateurs avec javascript activé
aCOSwt a écrit :
Allez ! Tant qu'on y est...

Pourquoi pas un vrai-faux-vrai sleep ?

Handle with extreme care of course...


	var	Sleeping;

function JSleep(delay){

	Sleeping=1;
	setTimeout(dummy,delay);
	for(;Sleeping;);}
	
function dummy(){

	Sleeping=0;}


Encore une fois handle with care car je ne suis pas sûr que cette fonctionnalité de sleep aille systématiquement dans le sens de l'accessibilité.

Mais comme cela peut dépendre des cas et que... provide... (bon ! vous allez commencer à le savoir...)


L'utilisation du timeout dans cette fonction pourrait être intérressant si seulement l'attente ne se passait pas dans une boucle (for ou while), car ca n'enlève pas le soucis de bloquer le navigateur ...
A force de recherches, je suis tombé sur Narrative Javascript qui a priori, arrive à faire des sleep non "saturant". Mais leur code n'est pas très clair.
En plus il faut le complier à leur sauce ...
Il y a peut-être moyen d'en extraire juste le moyen de faire le sleep ... si quelqu'un à une idée !
Rhrhrohoho mais pourquoi toujours flash nom de *#~%! quand ça roule en javascript ?

Pour répondre à la question du paramètre à passer dans la fonction du setTimeout, il y a plusieurs écoles :

1.
setTimeout("fonction(" + parametre + ");", 1000);

2.
setTimeout(function () { fonction(parametre); }, 1000);

3.

setTimeout(fonction, 1000, parametre);


La 1 fonctionne avec des navigateurs un peu plus anciens.
La 2 et la 3 permettent de passer des paramètres complexes tels qu'objets et tableaux de manière simple, ce que ne permet pas directement la technique 1 (il faut d'abord convertir l'objet complexe en chaîne).
La technique 3, fort pratique et lisible, ne fonctionne pas avec IE, ce qui nécéssite de s'en retourner à la technique n°2 dans la grande majorité des cas.