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 :

Gestion d'événements sur bouton


Sujet :

JavaScript

  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Gestion d'événements sur bouton
    Bonjour à tous,

    Je me demande si j'arriverai un jour à gérer correctement les événements. Parfois je désespère.
    Voici un extrait de mon code html:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <form method="post" action="" class="L editGroups">
    	<label for="id"><?= EDIT_GRP_LBL_GROUPS; ?></label><?= $lstGroups; ?>
    	<?php if ( isset($visible) ): ?>
    		<input type="hidden" name="id_user" value="<?= $idUser; ?>" />
    		<p><label for="text"><?= EDIT_GRP_LBL_GROUP; ?></label><input type="text" name="text" id="text" value="<?= $toSave['text']; ?>" /></p>
    		<p>
    			<input type="submit" name="save" value="<?= BTN_SAVE; ?>" />
    			<input type="submit" name="erase" value ="<?= BTN_ERASE ?>" />
    			<input type="submit" value="<?= BTN_BACK_PAGE; ?>" formaction="<?= CARD_PAGE; ?>" />
    		</p>
    	<?php endif; ?>
    </form>
     
    <script>const fromPHPtoJS = <?= json_encode(['eraseConfirm'=>EDIT_GRP_CONFIRM]); ?></script>
    <script src='editGroups.js'></script>

    et du javascript:
    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
    "use strict";
     
    const
    	mainForm	= document.querySelector('.editGroups')
    	, group		= document.querySelector("[name='id']")
    	, erase		= document.querySelector("[name='erase']")
    	;
     
    function handleSelectOnChange() {
    	this.formaction = "parentPage.php?group="+this.value;
    	mainForm.submit();
    }
     
    function handleEraseOnClick(e) {
    	if ( confirm(fromPHPtoJS.eraseConfirm) ) {
    		mainForm.submit();
    	}
    	else { e.preventDefault(); }
    }
     
    console.log(mainForm);
    console.log(group);
    console.log(erase);
    group.onchange	= handleSelectOnChange;
    if ( erase ) {
    	erase.onclick	= handleEraseOnClick;
    }
    Mon problème est que je n'arrive pas à gérer le bouton erase puisqu'il n'est pas encore défini (erase = null).

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- ce que tu n'as pas encore compris, c'est que, à part dans le forum PHP, on N'a PAS besoin du script PHP, mais du code HTML généré ("Ctrl"+"U").

    2- Explique plus précisément.

    Notamment : le code JavaScript est-il AVANT ou APRES le code HTML ?

    3- D'autre part, je ne vois pas :
    • de window.onload ?
      Il faut généralement attendre le chargement complet de la page (window.onload) AVANT d'activer les actions/évènements JavaScript.
    • ni .addEventListener()
      qui permet d'"affecter" un évènement à un élément.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    1- ce que tu n'as pas encore compris, c'est que, à part dans le forum PHP, on N'a PAS besoin du script PHP, mais du code HTML généré ("Ctrl"+"U").
    Ce n'est sûrement pas la seule mais voici le code simplifié avant sélection d'une option:
    Code html : 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
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8" />
     
    	<base href="http://omnes.proginet.local/" />
     
    	<link rel="stylesheet" media="all" type="text/css" href="css/structure.css" /> <!-- Dimensions et positions -->
    	<link rel="stylesheet" media="screen" type="text/css" href="css/style0.css" /> <!-- Apparence -->
    	<link rel="stylesheet" type="text/css" href="css/default_blue.css" /> <!-- Calendrier -->
    </head>
     
    <body>
     
    	<section id="main">
    		<div id="left">
    			<!-- menu -->
    		</div>
    		<article id="right">
     
    			<h2>Gestion des groupes</h2>
     
    			<form method="post" action="" class="L editGroups">
    				<label for="id">Groupe à éditer</label><select name="id" id="id"><option value=""></option><option value="">&lt;nouveau&gt;</option><option value="1">Famille</option><option value="2">Amis</option><option value="3">a</option><option value="4">v</option></select>
    			</form>
     
    			<script>const fromPHPtoJS = {"eraseConfirm":"Attention: En cliquant sur OK vous allez supprimer d\u00e9finitivement ce groupe."}</script>
    			<script src='editGroups.js'></script>
     
     
    		</article>
    	</section>
     
    </body>
    </html>
    Et le formulaire complet après clic sur une option de la liste:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <form method="post" action="" class="L editGroups">
    	<label for="id">Groupe à éditer</label><select name="id" id="id"><option value=""></option><option value="">&lt;nouveau&gt;</option><option value="1" selected="selected">Famille</option><option value="2">Amis</option><option value="3">a</option><option value="4">v</option></select>			<input type="hidden" name="id_user" value="1" />
    		<p><label for="text">Libellé du groupe</label><input type="text" name="text" id="text" value="Famille" /></p>
    		<p>
    			<input type="submit" name="save" value="Enregistrer" />
    			<input type="submit" name="erase" value ="Supprimer" />
    			<input type="submit" value="Retour" formaction="http://omnes.proginet.local/parentPage.php?childPageKey=3" />
    		</p>
    </form>
    2- Explique plus précisément.
    Notamment : le code JavaScript est-il AVANT ou APRES le code HTML ?
    Voir code ci-dessus

    3- D'autre part, je ne vois pas :
    [LIST][*]de window.onload ?
    Il faut généralement attendre le chargement complet de la page (window.onload) AVANT d'activer les actions/évènements JavaScript.
    Je n'en ai pas mis parce que je ne voyais rien à gérer dans cet événement.

    3- D'autre part, je ne vois pas :
    Parce que j'ai utilisé l'ancienne méthode comme ceci m'a été préconisé dans une autre discussion.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par moimp Voir le message
    ...Et le formulaire complet après clic sur une option de la liste...
    Ah ! Mais tu n'avais PAS précisé que ces boutons étaient générés dynamiquement !

    Par conséquent, ils N'EXISTENT PAS dans le DOM au chargement de la page.


    Dans ce cas, il faut "ruser", et utiliser une astuce : il faut toujours mettre le déclenchement de l'évènement sur un élément DEJA PRESENT dans le DOM.
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    "use strict";
     
    const mainForm = document.querySelector(".editGroups"); // mainForm EST PRESENT dans le DOM
     
    mainForm.addEventListener("click", function(e) {
      let elt = e.target;
      // ---------
      // BTN ERASE
      if (elt.name == "erase") {
        e.preventDefault(); // important (on n'envoie pas le formulaire)
        alert("BTN ERASE");
      }
      // autres boutons
      // ...
    });

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Merci pour l'astuce. J'ai modifié mon code en conséquence. Il me reste cependant deux problèmes:
    1-Pourquoi dans le code qui suit, le code en commentaire n'est pas équivalent au code qui le suit?
    2-Pourquoi, après exécution de la ligne 11, je ne retrouve pas en PHP la variable $_POST['erase'] ?
    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
    "use strict";
     
    const
    	mainForm	= document.querySelector('.editGroups')
    	, groupId	= document.querySelector("[name='id']")
    	;
     
    mainForm.addEventListener('click', function(e) {
    	if ( e.target.name == 'erase' ) {
    		if ( confirm(fromPHPtoJS.eraseConfirm) ) {
    			mainForm.submit();
    		}
    		else {
    			e.preventDefault();
    		}
    	}
    });
    /*
    groupId.addEventListener('change', function(e) {
    	groupId.formaction = "parentPage.php?group="+groupId.value;
    	mainForm.submit();
    }
    */
    function handleGroupIdOnChange() {
    	this.formaction = "parentPage.php?group="+this.value;
    	mainForm.submit();
    }
     
    groupId.onchange	= handleGroupIdOnChange;

  6. #6
    Invité
    Invité(e)
    Par défaut
    Tu as oublié de fermer addEventListener( :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    groupId.addEventListener('change', function(e) {
    	groupId.formaction = "parentPage.php?group="+groupId.value;
    	mainForm.submit();
    });
    Tu devrais regarder plus souvent dans la console (où s'affichent aussi les erreurs).

    Et à priori, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	mainForm.action = "parentPage.php?group="+this.value;
    	mainForm.submit();

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Tu as oublié de fermer addEventListener( :
    ...
    Tu devrais regarder plus souvent dans la console (où s'affichent aussi les erreurs).
    ça c'est sûr. Ce serait mieux que de vous déranger tous inutilement!

    Et à priori, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	mainForm.action = "parentPage.php?group="+this.value;
    	mainForm.submit();
    D'accord pour le this mais j'ai (ou j'aurai) d'autres actions pour d'autres boutons, d'où le formaction.
    Par contre je ne comprends toujours pas pour mon point 2 (variable $_POST).

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par moimp Voir le message
    ...Par contre je ne comprends toujours pas pour mon point 2 (variable $_POST).
    Bon.
    En effet, j'ai testé, et je n'ai pas d'explication...

    Par contre, j'ai la SOLUTION !

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mainForm.addEventListener('click', function(e) {
    	if ( e.target.name == 'erase' ) {
    		if ( !confirm(fromPHPtoJS.eraseConfirm) ) {
    			e.preventDefault();
    		}
    	}
    });

  9. #9
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Bizarre!
    Mais en plus ta solution est plus logique: On n'interdit que ce qu'on souhaite interdire et on ne fait rien dans le cas inverse.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/06/2010, 18h25
  2. gestion des évènements sur objets dynamiques
    Par boss_gama dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/03/2009, 11h50
  3. Gestion de session sur bouton précédent
    Par Ishizaki dans le forum ASP.NET
    Réponses: 4
    Dernier message: 06/02/2008, 09h29
  4. Gestion d'évènements sur un form
    Par Miss Ti dans le forum VBA Access
    Réponses: 9
    Dernier message: 24/01/2008, 16h10
  5. évènement sur bouton
    Par zyongh dans le forum ActionScript 1 & ActionScript 2
    Réponses: 8
    Dernier message: 19/12/2007, 07h15

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