IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Wait until flag=true avant de continuer la procédure


Sujet :

JavaScript

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  2. #2
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    Bonjour,

    modifie Ligne 12
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <script type="javascript">
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <script type="text/javascript">
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
    } 
    }

  3. #3
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    <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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    <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.

    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    <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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onclick="javascript:..."

    Et si je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    var f=eval(other_func);

    Tu as regardé le message de Watilin ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut
    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...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut
    Merci Watilin.

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


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  8. #8
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    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.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/09/2009, 18h03
  2. Attendre qu'une fenetre soit fermée avant de continuer.
    Par parp1 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 29/05/2007, 17h43
  3. [FLASH MX2004] [AS2] Attendre la fin de chargement d'un fichier avant de continuer.
    Par Demco dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 01/03/2007, 15h13
  4. attendre la fin de chargement d'une page avant de continuer le script
    Par jibouze dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/06/2006, 09h50
  5. Réponses: 2
    Dernier message: 25/05/2006, 19h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo