Partage
  • Partager sur Facebook
  • Partager sur Twitter

EventListener en dehors d'une div

Sujet résolu
    1 juillet 2022 à 13:47:22

    Bonjoir,

    Je suis entrain de travailler sur un petit code et j'ai un problème avec les eventListener. Dans mon code (ci-dessous), il y a des div générées en PHP / SQL et quad on click sur l'une d'entre elles, sa couleur de bordure devient bleu et les autres restent blanches. Problème c'est que je souhaite que quand l'on appuie sur le parent (article) les divs se remettent en blanc donc que toutes perdent la classe "resaSelected"...

    Auriez-vous une solution ?

    Voici mon code :

    # Du code avant
    <div class="flexCol-around"> # Un peu de PHP qui affiche toutes mes données <script> function UnSelectResa() { try { for (var i = 0; i <= document.getElementsByClassName("resaLine").length; i++) { document.getElementsByClassName("resaLine")[i].classList.remove("resaSelected"); } } catch {} } function SelectResa(_ID) { UnSelectResa(); document.getElementsByClassName(_ID)[0].classList.add("resaSelected"); } </script> </div>


    PS : Pour les modérateurs du forum, la coloration syntaxique n'accepte pas l'élément <blockquote>...

    Maxence ABRILE

    -
    Edité par Maxence ABRILE 1 juillet 2022 à 19:26:29

    • Partager sur Facebook
    • Partager sur Twitter
      1 juillet 2022 à 15:05:16

      Bonjour,

      je suis désolée de te demander de refaire, mais il nous faut le html généré, et non le php, qui "pollue" au final le rendu.

      Pour le blockquote, de quoi parles-tu ? Tu avais des <blockquote> dans ton code et tu n'as pas pu publier tant que tu ne les enlevais pas ?

      • Partager sur Facebook
      • Partager sur Twitter

      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        1 juillet 2022 à 19:27:28

        Voila, j'ai supprimé le PHP présent, et pour ce qui est du <blockquote>, en effet, je ne peux le publier en tant que code (en jscript)... 

        Et je ne suis toujours pas contre un petit coup de main sur mon code :D.

        -
        Edité par Maxence ABRILE 1 juillet 2022 à 19:28:14

        • Partager sur Facebook
        • Partager sur Twitter
          1 juillet 2022 à 21:03:04

          … Oui mais du coup on n'a plus de HTML. Le JS c'est bien, c'est une fourchette, mais on n'a plus de plat où piquer :p

          Si on veut pouvoir reproduire le problème et donc t'aider, il nous faut de quoi.

          • Partager sur Facebook
          • Partager sur Twitter

          Pas d'aide concernant le code par MP, le forum est là pour ça :)

            1 juillet 2022 à 23:48:15

            Bon, j'envoie sans php l'html que la page me rend dans la console :

            <article>
            			<div class="flexCol-around">
            						<h2>Yesterday</h2>
            											<div class="resaLine flexRow-around resa0" onclick="SelectResa('resa0')">
            			<div style="width: calc(100% / 10);">
            				<div class="resaLine_ID"> 118 </div>
            			</div>
            			<div class="resaLine_Name">  ABRILE Maxence </div>
            			<div class="resaLine_Lieu"> Salammbô </div>
            			<div class="resaLine_Date"> 30/06/2022 20:08 </div>
            			<div class="resaLine_Couverts"> 3 </div>
            			<div class="resaLine_IntExt"> ext </div>
            			<div class="resaLine_Contacte">  06... </div>
            			<div class="resaLine_Notes">
            				---			</div>
            		</div>
            									<h2>Today</h2>
            									<div class="resaLine flexRow-around resa1" onclick="SelectResa('resa1')">
            			<div style="width: calc(100% / 10);">
            				<div class="resaLine_ID"> 113 </div>
            			</div>
            			<div class="resaLine_Name">  TEST  Test </div>
            			<div class="resaLine_Lieu"> Salammbô </div>
            			<div class="resaLine_Date"> 01/07/2022 20:33 </div>
            			<div class="resaLine_Couverts"> 1 </div>
            			<div class="resaLine_IntExt"> ext </div>
            			<div class="resaLine_Contacte">  Test </div>
            			<div class="resaLine_Notes">
            				---			</div>
            		</div>
            </article>

            Il faut comprendre ici que c'est du php qui a affiché le code d'où sa "mocheté" de plus ce n'est qu'une partie car le reste se repète avec des infos différentes / le nom, L'ID...

            • Partager sur Facebook
            • Partager sur Twitter
              2 juillet 2022 à 7:12:35

              Merci, j'ai pu reproduire chez moi et tester.

              Alors : ce que tu veux, c'est cibler un <article>, et quand on clique dessus mais pas dans son enfant de classe resaLine, on désactive tout, c'est bien ça ?

              • Il faut que tu cibles tous les <article> et que tu boucles dessus : tu sais faire ça ?
              • Dans la boucle, tu accroches un événement "click" avec addEventListener.
              • Et il faut appeler la méthode UnselectResa uniquement si on a cliqué autre part que dans la ligne.

              Ce dernier point, tu peux l'avoir avec ce code :

              if (!event.target.closest('.resaLine')) {
                  UnSelectResa();
              }

              Si la cible du clic (event.target) n'a pas de parent de classe "resaLine" (.closest), alors désélectionner. "event" c'est l'argument de addEventListener, ça peut être tartempion ou toto, il faut juste que ça soit le même dans la définition d'addEventListener (tout est expliqué dans le lien plus haut).

              Pour closest, lire la documentation sur MDN. Attention, ce n'est pas compris du tout par Internet Explorer, toutes versions confondues ! Donc si c'est un besoin pour toi, il faudra trouver des adaptations (la doc en propose).

              Normalement avec ça, tu peux avancer. N'hésite pas à revenir si tu bloques.

              • Partager sur Facebook
              • Partager sur Twitter

              Pas d'aide concernant le code par MP, le forum est là pour ça :)

                2 juillet 2022 à 13:55:26

                Alors, je n'ai qu'un seul article, donc je ne pense pas qu'il soit intéressant de reboucler dessus et je voulais par la même occasion savoir s'il était possible de sélectionner cette balise sans avoir à lui mettre des ID ou Classe (Je n'ai jamais trouvé sur internet) et bien sur sans jQuery.

                Merci beaucoup de ton aide, je vais tester ce de suite et passerait la discussion en "Sujet résolu" si c'est le cas !

                EDIT : C'est excellent, c'est exactement ce que je recherchais, merci énormément, voici mon code pour ceux qui souhaite :

                <script>
                		const table = document.getElementById("table"); // <article> dont il était question
                
                		table.addEventListener("click", () => {			// EventListener de article qui cherche un .resaLine
                			if (!event.target.closest('.resaLine')) {
                				UnSelectResa(); 
                			}
                		});
                
                		function UnSelectResa() { // Fonction qui déselectionne mes réservations (.resaLine)
                			try
                			{
                				for (var i = 0; i <= document.getElementsByClassName("resaLine").length; i++) {
                					document.getElementsByClassName("resaLine")[i].classList.remove("resaSelected");
                				}
                			} catch {}
                		}
                
                		function SelectResa(_ID) { // Fonction qui sélectionne mes réservations (.resaLine)
                			UnSelectResa();
                			document.getElementsByClassName(_ID)[0].classList.add("resaSelected");
                		}
                	</script>

                Merci.

                -
                Edité par Maxence ABRILE 2 juillet 2022 à 14:05:35

                • Partager sur Facebook
                • Partager sur Twitter
                  2 juillet 2022 à 14:49:27

                  Nickel, bonne continuation !
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Pas d'aide concernant le code par MP, le forum est là pour ça :)

                    2 juillet 2022 à 16:38:43

                    Je reviens rapidement sur le sujet pour presque la même raison, sauriez vous le faire pour un enfant d'une div, c'est à dire que dans ma div.resaLine j'ai maintenant un form avec 3 submit et quand je les... submit, l'animation se lance alors que je ne le souhaite pas, j'ai essayer avec la méthode du closest mais je n'ai rien trouvé, j'ai aussi fait vérifier que l'élément n'avait pas la même classe (resaState) mais rien n'y fait...

                    Pourriez vous, encore une fois, m'aider ?

                    Maxence

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 juillet 2022 à 16:49:36

                      De quelle animation s'agit-il ? Quel est le nouveau code, et le comportement attendu ?
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Pas d'aide concernant le code par MP, le forum est là pour ça :)

                        2 juillet 2022 à 16:53:39

                        C'est exactement le même code et l'animation c'est le changement de couleur de la bordure mais j'aimerai appliqué l'exception qu'on a fait pour le parent de .resaLine à l'un de ses enfants, voici tout de même le code (sans php ;)) :

                        <div class="resaLine flexRow-around resa2" onclick="SelectResa('resa2')">
                        	<div style="width: calc(100% / 10);">
                        		<div class="resaLine_ID"> 121 </div>
                        	</div>
                        	<div class="resaLine_Name">  ABRILE  Test </div>
                        	<div class="resaLine_Lieu"> Salon Jaune </div>
                        	<div class="resaLine_Date"> 03/07/2022 11:33 </div>
                        	<div class="resaLine_Couverts"> 3 </div>
                        	<div class="resaLine_IntExt"> int </div>
                        	<div class="resaLine_Contacte">  3 </div>
                        	<div class="resaLine_Notes">---</div>
                        	<form action="" method="post" style="width: 300px; display: flex;">
                        		<input class="resaState" type="submit" value="Arrived" style="width: 75px; border-color: #00B000; color: #00B000; background-color: rgba(0, 176, 0, .2);">
                        		<input class="resaState" type="submit" value="Late" style="width: 75px; border-color: darkorange; color: darkorange;">
                        	<input class="resaState" type="submit" value="Never come" style="width: 90px; border-color: red; color: red; ">
                        </form> 
                        </div>



                        • Partager sur Facebook
                        • Partager sur Twitter

                        EventListener en dehors d'une div

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown