11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour ! J'ai un projet où une de mes pages me pose problème... Je dois faire apparaître des menus en fonction du choix effectué dans le menu d'avant , j'ai donc utilisé la fonction onchange()... Les 3ers menus s'affichent correctement , il n'y a que le 4e ou ça pose problème... Il doit apparaître quand on choisit une option autre que "generic" dans le 3e menu. Or la fonction associé à son apparition s'exécute avant même qu'on ne fasse un choix dans le menu d'avant. Voici le code :

page.html :

<!DOCTYPE html>
<html lang="en">

    <head>

        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta name="description" content="">
        <meta name="author" content="">

        <title>Accueil - Affectation Interface</title>

        <!-- Bootstrap core CSS -->
        <link href="vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">

        <!-- Custom styles for this template -->
        <link href="css/simple-sidebar.css" rel="stylesheet">

        <link href="css/styleLD.css" rel="stylesheet" type="text/css"/>

    </head>

    <body>

        <div id="wrapper">

            <!-- Sidebar -->
            <div id="sidebar-wrapper">
                <ul class="sidebar-nav">
                    <li class="sidebar-brand">
                        <a href="#">
                            Menu
                        </a>
                    </li>
                    <li>
                        <a href="user.html">user formulaire</a>
                    </li>
                    <li>
                        <a href="groupe.html">groupe formulaire</a>
                    </li>
                    <li>
                        <a href="map.html">map formulaire</a>
                    </li>
                </ul>
            </div>
            <!-- /#sidebar-wrapper -->

            <!-- Contenu de la page -->
            <div id="page-content-wrapper">
                <div class="container-fluid">
                    <h1 id='grandtitre'>Bienvenue dans l'interface d'affectation</h1>
                    <a href="#menu-toggle" class="btn btn-secondary" id="menu-toggle">Menu</a>
                    <div id='divSituation'>
                        <p>Sélectionner un scope :</p>
                        <select name="selectScope" id='selectScope' onchange="selectScopeChooseConsequences()">
                            <option>global</option>
                            <option>specific</option>
                        </select>
                        
                        

                    </div>
                </div>
            </div>
            <!-- /#page-content-wrapper -->

        </div>
        <!-- /#wrapper -->

        <!-- Bootstrap core JavaScript -->
        <script src="jquerryLD/pageAccueilscript.js" type="text/javascript"></script>
        <script src="vendor/jquery/jquery.min.js"></script>
        <script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>


        <!-- Menu Toggle Script -->
        <script>
            $("#menu-toggle").click(function (e) {
                e.preventDefault();
                $("#wrapper").toggleClass("toggled");
            });

        </script>

    </body>

</html>


script javascript de cette page :
/* Script pour gérer l'apparaition des menus déroulants en fonction
 * des choix faits dans les menus */

//Variables globales
//code html du menu de séléction de l'environnement
var menuSelectEnvt = "<p>Selectionner un environnement</p> <select  id='selectEnvt'> <option>Envt1</option> <option>Envt2</option></select>";
//code html du menu de séléction de hiera
var menuSelectHiera = "<p>Selectionner une hiérarchie</p> <select  id='selectHiera'> <option>generic</option> <option>optionB</option></select>";
//code html du menu de sélection de host groupe
var menuSelectHostGroup = "<p>Selectionner un host group</p> <select  id='selectHostGroup'> <option>hostA</option><option>hostB</option></select>";




//Déclaration des fonctions

//fonction selectScopeChooseConsequences = gestion des evènements en fonction
// du choix dans selectScope :
//  *si choix = "global" , seul selectScope est visible
//  *si choix = "specific", apparition du 2e menu (selectEnvt) + 3e menu (selectHiera)
function selectScopeChooseConsequences() {
    var choixSelectScope = document.getElementById('selectScope').value;
    //si on choisit "specific"
    if (choixSelectScope != "global") {
        apparitionMenuChooseEnvt(); //apparition du menu selectEnvt
        apparitionMenuChooseHiera(); //apparition du menu selectHiera
    }
}
;

//fonction selectHieraChooseConsequences() = gestion des evènements en fonction
// du choix dans selectHiera :
//  *si choix = "generic" , seul les menus selectScope, selectEnvt , selectHiera sont visibles
//  *si choix != "generic", le 4e menu (selectHostGroup) apparait
function selectHieraChooseConsequences() {

        var choixSelectHiera = document.getElementById('selectHiera').value;
        alert(choixSelectHiera);
        if (choixSelectHiera != "generic") {

            apparitionMenuChooseHostGroup();
        }
}
;

/*fonction apparitionMenuChooseEnvt() = ajoute le second menu si il n'existe pas déjà
 au clic sur une option autre que "global" du menu selectScope*/
function apparitionMenuChooseEnvt() {
    if (!document.getElementById('selectEnvt')) {
        $('#divSituation').append(menuSelectEnvt);
    }
}
;

/*fonction apparitionMenuChooseHiera() = ajout le 3e menu si il n'existe pas déjà*/
function apparitionMenuChooseHiera() {
    if (!document.getElementById('selectHiera')) {
        $('#divSituation').append(menuSelectHiera);
        document.getElementById('selectHiera').onchange = selectHieraChooseConsequences() ;
    }

}
;

/*fonction apparitionMenuChooseHostGroup() = ajoute le 4e menu si il n'existe pas déjà
 au clic sur une option autre que "global" du menu selectHiera*/
function apparitionMenuChooseHostGroup() {
    if (!document.getElementById('selectHostGroupe')) {
        $('#divSituation').append(menuSelectHostGroup);
    }
}
;


Merci beaucoup d'avance pour votre aide.
Salut

Pas compris cette ligne :
document.getElementById('selectHiera').onchange = selectHieraChooseConsequences() ;
Salut

C'est pour que la fonction selectHieraChooseConsequences() s'exécute à la sélection d'un choix dans le menu selectHiera.
Ok personnellement je l'écris soit comme ça
<element onchange="myScript">
soit comme ça
object.onchange = function(){myScript};
soit comme ça
object.addEventListener("change", myScript);

Est-il possible de tester ton problème en ligne ? si non sur Codepen, ou JsFiddle ?
JENCAL a écrit :
Salut

Pas compris cette ligne :
document.getElementById('selectHiera').onchange = selectHieraChooseConsequences() ;


Les parenthèses sont en trop. il faut donner le nom de la fonction au lieu de l'executer
document.getElementById('selectHiera').onchange = selectHieraChooseConsequences;

Et puis, c'est tout
Mais c'est une mauvaise pratique. On ne peut utiliser qu'une fonction. Il est recommandé d'utiliser un addEventlistener qui permet plusieurs fonctions pour un élément :
const selectHiera = document.getElementById('selectHiera');
if(selectHiera != null) {
     selectHiera('change', selectHieraChooseConsequences);
      selectHiera('change', function(event) {
           alert("Tu sais, j'ai beaucoup changé");
           // pour éviter que  l'évenement soit traité plus loin
          // event.preventDefault();
     }
}

Modifié par bazooka07 (06 Jun 2018 - 11:07)
Meilleure solution
Alors JENCAL dans les deux testeurs en ligne de code , mon script fonctionnait encore moins bien...

Salut bazooka07 !
Eh bien je viens de modifier cette ligne comme tu me l'a indiqué et ça marche ! quand je pense que ça ne tenait qu'à des parenthèses... Je retiendrai que les parenthèses sont inutiles dans le onchange pour ne plus faire ce genre d'erreur..

Merci beaucoup pour votre aide !
Aaah je n'avais pas lu la 3e partie excuses moi... mais on met quoi comme code du coup dans la partie :
selectHiera('change', function(event) {
           alert("Tu sais, j'ai beaucoup changé");
           // pour éviter que  l'évenement soit traité plus loin
          // event.preventDefault();
     }


Je mettrai le code de ma fonction ici ?
Modifié par Cherrygolo (06 Jun 2018 - 11:43)
Oups ! mes petits doigts ont parfois du mal à suivre mes grandes pensées :
const selectHiera = document.getElementById('selectHiera');
if(selectHiera != null) {
      selectHiera.addEventListener('change', function(event) {
          const choixSelectHiera = document.getElementById('selectHiera').value;
          alert(choixSelectHiera);
          if (choixSelectHiera != "generic") {
            apparitionMenuChooseHostGroup();
        }
        event.preventDefault();
     }
}

Modifié par bazooka07 (06 Jun 2018 - 11:51)
Aaaah oui ça m'évite de coder une fonction selectHieraChooseConsequences... C'est vrai que c'est plus propre ainsi ! Merki !
Modifié par Cherrygolo (06 Jun 2018 - 13:23)