Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/02/2012, 18h05   #1
Invité de passage
 
Inscription : décembre 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 6
Points : 1
Points : 1
Par défaut Wait until flag=true avant de continuer la procédure

Bonjour à tous.

J'essaie de créer une fonction qui me permettrait de mettre un délais d'exécution après un reload, afin que celui-ci puisse avoir le temps de modifier les variables <hidden> de la page appelante avant que la fonction soit finalisé.

Du genre:

Code :
1
2
3
4
5
6
function reload_drop()
buffer.location.replace("check_login.php...;
if (document.getElementById('may_sub').value == '1'){
  do_login;
  ...;
}
Le hic, c'est que la variable 'may_sub' est comparée, avant qu'elle soit modifié. J'ai donc fait ce fichier de test pour expérimenter la fonction check_state. Mon problème, c'est que j'ai un erreur JS "object required" au deuxième <input>.

Ce doit être con comme erreur, mais je ne trouve pas.

Quelqu'un peux m'aider?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
?>
<html>
<head>
<title>Untitled</title>
</head>
<body>
<input type="hidden" id="test_val" value="0" />
<input type="button" id="btn" name="btn" value="start" onclick="javascript:check_state(document.getElementById('test_val').value, display())" /> 
<input type="button" id="btn1" name="btn1" value="change" onclick='change_state()' />
 
<script type="javascript">
//________________________________________________________
// Verify the state of a hidden tag and send the next 
// procedure when true, else, wait some time
//________________________________________________________
function check_state(variable, other_func){
if (variable){
other_func();
} else {
setTimeout('check_state()', 500);
} 
}
 
//________________________________________________________
//	Change the state of the hidden tag
//________________________________________________________
function change_state(){
document.getElementById('test_val').value = 1 ;
}
 
//________________________________________________________
//	Display when the state of the hidden tag has changed
//________________________________________________________
function display(){
alert('change made');
}
</script>
 
</body>
</html>
f.leduc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 18h28   #2
Membre confirmé
 
Avatar de SPACHFR
 
Inscription : février 2004
Messages : 502
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 502
Points : 243
Points : 243
Bonjour,

modifie Ligne 12
Code :
1
2
 
<script type="javascript">
par
Code :
1
2
 
<script type="text/javascript">
et
Code :
1
2
3
4
5
6
7
8
 
function check_state(variable, other_func){
if (variable){
other_func();
} else {
setTimeout('check_state()', 500);
} 
}
par
Code :
1
2
3
4
5
6
7
8
function check_state(variable, other_func){
if (variable){
var f=eval(other_func);
} else {
setTimeout('check_state()', 500);
} 
}
__________________
S'il n'y a pas de solution c'est qu'il n'y a pas de problème.
SPACHFR est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 09/02/2012, 19h05   #3
Membre Expert
 
Avatar de Watilin
 
Homme Matilin Torre
Étudiant
Inscription : juin 2010
Messages : 679
Détails du profil
Informations personnelles :
Nom : Homme Matilin Torre
Âge : 23
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2010
Messages : 679
Points : 1 202
Points : 1 202
SPACHFR, de quelle époque tu viens ? Eval is evil, c'est bien connu, de même que passer des chaînes à setTimeout. La seule syntaxe sûre est :
Code JS :
setTimeout(check_state, 500);

F.leduc, ton erreur au 2e input vient du fait que tu appelles la fonction display au lieu de simplement la passer en référence à check_state. Retire les parenthèses et ce sera bon :
Code HTML :
<input type="button" id="btn" name="btn" value="start" onclick="check_state(document.getElementById('test_val').value, display)" />

Ensuite, tu vas avoir un autre problème du fait que tu testes directement if (variable) au lieu de if (variable != '0'). En effet, la chaîne '0' n'est pas considérée comme nulle…

De plus, quand tu fais ton setTimeout, il faut repasser les arguments à check_state. Pour cela, il faut utiliser une fonction anonyme :
Code JS :
1
2
3
setTimeout(function() {
	check_state(variable, other_func);
}, 500);
Mais ceci va poser un autre problème : variable sera toujours passée en paramètre à chaque appel, et ne correspondra plus à la valeur du champ caché quand cette dernière changera. Ce qu'il faudrait, c'est passer à la place une référence vers le champ, pour pouvoir vérifier sa valeur à chaque timeout :
Code JS :
1
2
3
4
5
6
7
8
9
10
function check_state(champ, other_func) {
	console.log(other_func);
	if (champ.value != '0') {
		other_func();
	} else {
		setTimeout(function() {
			check_state(champ, other_func);
		}, 500);
	} 
}
Et donc modifier le code du bouton en conséquence :
Code HTML :
<input type="button" id="btn" name="btn" value="start" onclick="check_state(document.getElementById('test_val'), display)" />

Pour finir, j'aimerais attirer ton attention sur le fait que cette méthode s'apparente à de l'attente active (voir Wikipédia ou autre), même si elle ne monopolyse pas le processeur (grâce à la désynchronisation de setTimeout), et qu'utiliser la programmation par évènements sera certainement plus astucieux.

__________________
Disposition de clavier ergonomique française : Bépo
Watilin est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 09/02/2012, 19h12   #4
Invité de passage
 
Inscription : décembre 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 6
Points : 1
Points : 1
Wow!. Je savais que c'était con comme erreur ...

J'ai fais quelques corrections et voudrais ton avis sur un autre bug:

J'ai mis le deuxième paramètre de check_state entre ' ', sinon il s'exécutait

Code html :
<input type="button" id="btn" name="btn" value="start" onclick="javascript:check_state(document.getElementById('test_val').value, 'display()')" />

J'ai modifier la fonction pour qu'elle soit récursive

Code :
1
2
3
4
5
6
7
8
function check_state(variable, other_func){
alert(variable + ' ' + other_func); // test
if (variable == 1){
	var f=eval(other_func);
} else {
setTimeout('check_state(variable, other_func)', 500);  
}                                   
}
Par contre, au deuxième appel de alert(), variable est non défini!

Tu sais pourquoi?

Merci pour le coup de main.
f.leduc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 19h32   #5
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 13 808
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 41
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 13 808
Points : 35 787
Points : 35 787
Code :
onclick="javascript:..."

Et si je mets
Code :
onclick="georges_clooney:..."
ça va me sortir du café ?
Les attributs d'événements attendent déjà du JavaScript, il est inutile d'utiliser une pseudo-url !

Code :
var f=eval(other_func);

Tu as regardé le message de Watilin ?

Code :
check_state(document.getElementById('test_val').value, 'display()')
Idem...
__________________
Pas de question technique par MP !
Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, contactez-moi !
Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
Mon livre sur jQuery
Bovino est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 19h39   #6
Invité de passage
 
Inscription : décembre 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 6
Points : 1
Points : 1
Oui j'ai lu, mais j'étais en train de rédiger quand il a envoyé sa réponse.

J'e l'applique et je vous reviens...
f.leduc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 20h17   #7
Invité de passage
 
Inscription : décembre 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 6
Points : 1
Points : 1
Merci Watilin.

J'ai appliqué tes correctifs et ça marche!


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<input type="button" id="btn" name="btn" value="start" onclick="check_state(document.getElementById('test_val'), display)" /> 
 
...
 
//________________________________________________________
function check_state(variable, other_func){
writeInConsole(variable.value + ' ' + other_func); // just for testing
if (variable.value == 1){
	other_func();
} else {
		setTimeout(function() {check_state(variable, other_func);}, 500);
	} 
}
Mais j'ai ajouté une fonction writeInConsole (trouvé sur le web) parce que si je l'exécute dans chrome, c'est ok, mais dans PHPEd, il n'y a pas de console

Code :
1
2
3
4
5
6
7
8
9
//________________________________________________________
function writeInConsole (text) {
    if (typeof console !== 'undefined') {
        console.log(text);    
    }
    else {
        alert(text);    
    }
}
Cette solution me donnera suffisamment de temp pour terminer le reload (un cycle ou deux) et ainsi pouvoir évaluer le vrai statut des variables retournées.

Pour ce qui est de la programmation évènementielle, quand je serai grand, je m'y appliquerai, pour l'instant, cette solution est plus de mon calibre...

Merci à tous pour votre support et vos bons conseils.
f.leduc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 08h42   #8
Responsable JavaScript & AJAX

 
Avatar de vermine
 
Inscription : mars 2008
Messages : 2 694
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mars 2008
Messages : 2 694
Points : 5 783
Points : 5 783
Par défaut Le Duc, l'Aigle Noir ?! Barbara, c'est toi ?!

Citation:
Envoyé par f.leduc Voir le message
J'e l'applique et je vous reviens...

C'est alors que je l'ai reconnu, surgissant du passé, il m'était revenu.

__________________
Elen Poukram - Isegoria - Sandawe
vermine est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h41.


 
 
 
 
Partenaires

Hébergement Web