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 :

boucle + function


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut boucle + function
    Bonjour,

    Si vous pouviez m'expliquer pourquoi je n'arrive pas à boucler sur mes règles ?
    Vraisemblablement, je m'y prends mal mais pourquoi et comment faire pour y remédier ?
    Voir les commentaires lignes 3 et 4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function controls (idField, action, rules) {
     for (rule of rules){
      console.log(rule); // ok je retrouve bien mes 2 règles (isAlpha, isRequired)
      idField.addEventListener(action, function(){alert(rule)}); // alert() me renvoie 2 fois la dernière règle (isRequired) => j'espérai récupérer mes 2 règles
     }
    }
    controls(nom, 'focusout', ['isAlpha','isRequired']);
    merci pour vos explications et conseils

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Bonjour,

    Tu ajoutes deux fois le même gestionnaire à idField, ce qui explique les 2 alert successives;
    Au moment où tu déclenches l'événement en perdant le focus du champ, rule vaut isRequired;

  3. #3
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonjour,
    Pour préciser :
    La valeur de rule affichée par une fonction est la valeur actuelle au moment de l'appel de la fonction et non la valeur au moment de la création de la fonction.
    Illustration de ce principe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    i=0;
    function f0(){alert(i);}
    i=1;
    function f1(){alert(i);}
    i=2;
    f0(); //2
    f1(); //2
    Il est par conséquent nécessaire de créer autant de variables/constantes que nécessaire :
    Solution 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (var rule of rules) {
    	(function(rule) {
    		idField.addEventListener(action, function(){alert(rule);});
    	})(rule);
    }
    Solution 2 :
    Utiliser let ou const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (const rule of rules) {
    	idField.addEventListener(action, function(){alert(rule);});
    }

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Par défaut
    Merci pour vos explications et conseils
    Je vais essayer
    Je vous tiens au courant
    👍

  5. #5
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Dans ton cas, ce code suffit
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function controls (idField, action, rules) {
       idField.addEventListener(action, function(){alert(rules)});
    }

    En tout cas, tu ne doit pas ajouter un listener sur le même objet dans une boucle;
    Dans la logique, c'est à l'intérieur de la fonction que tu peux boucler:

    Code javascript (alternative) : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function controls (idField, action, rules) {
       idField.addEventListener(action, function(){for (var rule of rules){alert(rule)}});
    }
    Et dans ce cas, tu auras 2 alertes successives;

  6. #6
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Citation Envoyé par javatwister Voir le message
    En tout cas, tu ne doit pas ajouter un listener sur le même objet dans une boucle;
    A la limite, ce peut être maladroit conceptuellement selon les situations, mais techniquement on peut quand même indiquer que la chose est possible.

    On peut ainsi détacher à tout moment l'une des fonctions liées à l'événement avec removeEventListener, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let ob_rules={
    	isAlpha:function(){alert("fonction isAlpha");},
    	isRequired:function(){alert("fonction isRequired");}};
     
    function controls (idField, action, rules) {
    for (const rule of rules) {
    	idField.addEventListener(action, ob_rules[rule]);
    }
    }
    controls(nom, 'focusout', ['isAlpha','isRequired']);
     
    setTimeout(function(){nom.removeEventListener('focusout', ob_rules.isAlpha)},1000);
    Bien sûr, on peut s'en sortir pareillement avec le tableau.

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

Discussions similaires

  1. sub ou function non définie avec une boucle
    Par PPN83 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/10/2010, 16h07
  2. function sur un movieclip dans une boucle for
    Par totof49 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 22/08/2009, 16h28
  3. declarer des functions de boutons dans une boucle for
    Par superleon dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 06/06/2009, 12h24
  4. Bug, Boucle, S-function, RTW, C
    Par Dezailes dans le forum MATLAB
    Réponses: 16
    Dernier message: 28/05/2008, 16h31
  5. [Embedded Function] Problème dans une boucle FOR-END
    Par roilait dans le forum Simulink
    Réponses: 6
    Dernier message: 19/04/2008, 14h55

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