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 :

Question de débutant en Javascript


Sujet :

JavaScript

  1. #1
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut Question de débutant en Javascript
    Bonjour !

    Je cherche à faire en sorte qu'il y ai le moins possible de Javascript dans ma page HTML.
    C'est pourquoi j'ai attribué un événement à un select (qui sert pour une ComboBox) dans le fichier Javascript, et non dans le code HTML.

    Sauf que après pas mal de petits tests, j'arrive à faire fonctionner mon code mais d'une manière que je ne comprend pas.

    Voici mon fichier HTML :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- La ComboBox -->
    <select id="ComboBox">
     
    <!-- Quelques éléments de test mis dans la liste déroulante -->
    	<option>Tagada</option>
    	<option>Tsoin Tsoin</option>
    </select>
     
    <!-- Pour relier à mon fichier Javascript -->
    <script type="text/javascript" src="script.js"></script>

    Ensuite, mon fichier Javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //La fonction en elle-même
    function Bidon(){
    	alert('La fonction Bidon fonctionne !');
    };
     
    //Affectation de la focntion à l'évenement onChange du select de mon HTML
    document.getElementById("ComboBox").onChange=Bidon();
    Voilà, lorsque j'affecte la fonction à mon événement, ça ne fonctionne pas.
    Pour cela, il faut que j'affecte la fonction ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById("ComboBox").onChange=Bidon;
    Sans les parenthèses !
    Alors que partout ailleurs, même sur un topic de ce même forum, (Developpez.net), les affectations sont mise avec les parenthèses...

    Du coup, jeune padawan que je suis, je m'y perd un peu.

    Une raison pour ne pas mettre les parenthèses ? Ou justement, ai-je fait une erreur ailleurs ?

    Merci d'avance de votre aide, et bon courage !

    P.S: Je pense que le titre n'est pas assez explicite... Mais j'arrive pas à le modifier. (un truc comme "[Débutant]Affectation fonction sur événement, avec ou sans parenthèse" aurai été mieux)

  2. #2
    Membre émérite
    Inscrit en
    Septembre 2002
    Messages
    2 307
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 307
    Points : 2 814
    Points
    2 814
    Par défaut
    avec parenthèses tu affecte une valeur à une propriété!

  3. #3
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    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é : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Attention à la casse ! Il n'y a pas de majuscule à onChange !

    Dans la discussion que tu mentionnes, il n'y a pas de parenthèse pour la solution. Les parenthèses servent à exécuter la fonction, il ne faut donc pas les mettre.

    Si tu les mets, cela se traduit en :
    "Lors du déclenchement de l'événement onchange sur mon select, je veux exécuter le résultat retourné par la fonction"

    Or, toi tu veux :
    "Lors du déclenchement de l'événement onchange sur mon select, je veux exécuter la fonction"

    Attention à ne pas confondre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     // ici tu affectes une fonction anonyme (sans nom) lors de l'événement onchange.
    document.getElementById("mon_select").onchange = function() {
      alert('ok'); 
    };
     
    // Equivaut à cela. 
    // Déclaration d'une fonction nommée 'test'
    function test() {
      alert('ok'); 
    }
    // Que tu affectes lors de l'événement onchange
    document.getElementById("mon_select").onchange = test;
    Faire ceci document.getElementById("mon_select").onchange = test(); aura pour conséquence d'exécuter directement la fonction test (à cause des () ) et d'affecter le résultat retourné à l'événement onchange. En l'occurrence, cela va afficher "ok" au moment de l'affectation (donc une seule fois) et exécuter undefined (autrement dit, rien faire) à chaque fois que onchange sera déclenché

  4. #4
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut
    Ho !
    Merci beaucoup ! (rapide et simple)

    En effet je ne connaissait pas cette nuance, entre affectation de la fonction, et l'affectation de la valeur que la fonction retourne ! (son exécution)

    Merci beaucoup d'avoir pris le temps de m'expliquer !

    Par ailleurs, la casse des IDE mettent des majuscules et ça fonctionne un peu partout (IE, FF, Chrome).

    Y a-t-il des problèmes que pourrais causer ce non-respect de la casse ? (Savoir si je change d'IDE ou pas !)

    Je chipote, mais merci en tout cas pour votre aide !

  5. #5
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    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é : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    La confusion vient du fait que lors tu définis l'événement dans le html <select name="toto" onchange="mafonction()">, il faut mettre les parenthèses.
    Il faut le voir ainsi : "Lors du déclenchement de onchange, exécute la fonction mafonction !" (et non le résultat cette fois)

    Aussi, lorsque tu définis dans le HTML, tu peux ou non mettre la majuscule à onChange en fonction du Doctype utilisé. Tu auras "simplement" un problème de syntaxe mais la fonction sera bel et bien exécutée lors de l'événement.
    Par contre, Javascript étant sensible à la casse, il ne faut pas mettre de majuscule.

    Faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    document.getElementById('un_id_dans_ma_page').onChange = function() {
      alert('Je suis une méthode');
    }
    ne lèvera aucune erreur. Cela va ajouter une méthode à cet élément du document. Si tu l'exécutes document.getElementById('un_id_dans_ma_page').onChange() cela va fonctionner, mais simplement si tu l'exécutes ainsi, explicitement. Le fait de déclencher l'événement change (en sélectionnant une autre valeur de ton select) ne l'exécuteras pas.

    EDIT : Pour éviter les erreurs, je te conseille d'utiliser gestionnaire d'événement (minimaliste) compatible multi navigateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var bindEvent = function( element, type, eventHandler ) {
      if ( element.addEventListener ) {
        element.addEventListener( type, eventHandler, false );
      } else if ( elemement.attachEvent ) {
        element.attachEvent( "on" + type, eventHandler );    
      }
    };
     
    // Exemple d'utilisation pour créer un événement sur un élément de la page :
    // L'élément, le type événement, la portion de code à exécuter
    bindEvent(document.getElementById('mon_select'), 'change', function () {
      alert('je change !');
    });

  6. #6
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    En même temps, c'est pas comme si personne n'avait prit sur son temps pour fournir les explications...
    Les fonctions de rappel (callback).

  7. #7
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    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é : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Haaaa je n'avais pas retrouvé la discussion

  8. #8
    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
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par Kaamo
    La confusion vient du fait que lors tu définis l'événement dans le html <select name="toto" onchange="mafonction()">, il faut mettre les parenthèses.
    Il faut le voir ainsi : "Lors du déclenchement de onchange, exécute la fonction mafonction !" (et non le résultat cette fois)
    C'est pas tout à fait ça.
    En fait, l'attribut onchange va générer une fonction anonyme dont le code sera le contenu de l'attribut.
    Ainsi, en interne, la synatxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onchange="maFonction()"
    va se transformer en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Element.onchange = function(){
        maFonction();
    };
    et donc c'est bien une référence à une fonction (en fait, la définition de la fonction elle-même) qui sera affectée à la propriété onchange.
    C'est d'ailleurs pour cette raison que si l'on veut inhiber le comportement par défaut (typiquement, empêcher de suivre la cible d'un lien sur un attribut onclick), il ne faut pas faire de return false dans la fonction appelée (parce que la valeur serait ainsi retournée à la fonction anonyme qui n'en ferait rien) mais bien dans la valeur de l'attribut (ainsi, c'est bien la fonction anonyme qui renvoie false et qui inhibe la comportement par défaut).

  9. #9
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    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é : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    En effet, j'étais allé vite en besogne. Merci de la précision

  10. #10
    Membre régulier
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Points : 73
    Points
    73
    Par défaut
    Messieurs, un énorme merci !

    J'ai eu un cours, et plein d'explications sur des sujets touchant à ma question ! ( de quoi partir me cultiver quelques heures de plus !)

    Vous avez fait un heureux moins bête !

    Sujet largement résolu !

    Bonne continuation à tous !

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

Discussions similaires

  1. question sur les attributs javascript
    Par PAYASS59 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/04/2005, 13h34
  2. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51
  3. [MFC] Quelques questions de débutant...
    Par Sephi dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 17h25
  4. Questions de débutant
    Par J-P-B dans le forum XMLRAD
    Réponses: 12
    Dernier message: 24/07/2003, 15h19
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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