[JAVA] Comment éviter le traitement en double par addEventListener

Environnement d'exploitation Ruby 2.6.5 Rails 6.0.3.2

Auparavant, le même processus était généré plusieurs fois par addEventListener, ce qui provoquait une erreur et parfois je ne pouvais pas faire ce que je voulais, alors je l'ai publié.

Un exemple où le traitement en double se produit en raison de addEventListener

Ruby:index.html.erb


<% @hugas.each do |huga| %>
  <div class="huga" >    
    <%= huga.content %>
  </div>
<% end %>

Le code ci-dessus montre que la colonne de contenu de huga est affichée à plusieurs reprises et que la classe du contenu affiché est huga.

huga.js


function hoge() {
  const hugas = document.querySelectorAll(".huga");
  hugas.forEach(function (huga) {
    huga.addEventListener("click", () => {
    //Traitement qui se produit en cliquant sur
    });
  });
};
setInterval(hoge, 1000);

Avec la fonction hoge () comme première ligne, nous expliquerons ce code à partir de la deuxième ligne. Dans la deuxième ligne, tous les éléments dont la classe est huga sont affectés à hugas. Dans la troisième ligne, les hugas sont divisés en un par un, et leurs noms sont huga. Si vous cliquez sur huga sur la 4ème ligne, le traitement sur la 5ème ligne se produira. La dernière ligne provoque l'opération ci-dessus toutes les secondes.

En d'autres termes, les deux codes ci-dessus montrent que lorsque vous cliquez sur le contenu, le processus écrit dans la 5ème ligne de huga.js se produit.

Cependant, si rien n'est fait, une erreur se produira. C'est parce que la dernière ligne de huga.js provoque le comportement des 2e et 3e lignes toutes les secondes. Ce qui se passe, c'est que, par exemple, si vous cliquez sur le contenu 10 secondes après la transition vers cette page, le traitement de la 5ème ligne se produira 10 fois en même temps.

Pour résoudre ce problème, vous avez besoin du titre de cet article, "Comment empêcher le traitement en double avec addEventListener".

Comment éviter le traitement en double par addEventListener

huga.js


function hoge() {
  const hugas = document.querySelectorAll(".huga");
  hugas.forEach(function (huga) {
    if (huga.getAttribute("baz") != null) {
      return null;
    }
    huga.setAttribute("baz", "true");
    huga.addEventListener("click", () => {
    //Traitement qui se produit en cliquant sur
    });
  });
};
setInterval(hoge, 1000);

Le traitement en double peut être évité en ajoutant les 4e à 7e lignes du code ci-dessus. En effet, cet ajout signifie que peu importe le nombre de secondes qui se sont écoulées avant de cliquer sur le contenu, un huga ne sera traité qu'une seule fois.

Je vais expliquer la partie ajoutée en détail. Tout d'abord, lorsqu'une seconde s'écoule, le premier processus est exécuté et une branche conditionnelle se produit en raison de l'instruction if. Puisque huga n'a pas d'attribut appelé baz, il devient nul et l'expression conditionnelle est fausse, mais puisque le traitement dans le cas de faux n'est pas décrit, il passe au traitement suivant tel quel. La ligne 7 donne à huga l'attribut baz, ce qui est vrai. En d'autres termes, ** Le premier processus est le même qu'avant sa description. ** **

Regardons le cas lorsque 2 secondes se sont écoulées. Au bout de 2 secondes, le deuxième processus est exécuté et l'instruction if provoque à nouveau une branche conditionnelle. Contrairement à la première fois, huga a un attribut appelé baz, il n'est donc pas nul. Par conséquent, l'expression conditionnelle devient true, le traitement si true est effectué et return null est exécuté. Étant donné que renvoyer null signifie quitter le processus, le processus après cette description ne sera pas exécuté. En d'autres termes, même si vous cliquez sur le contenu après 2 secondes, ** le traitement ne sera effectué qu'une seule fois. ** ** Bien sûr, il en va de même après 3 secondes, vous pouvez donc éviter le traitement en double.

Recommended Posts

Comment éviter le traitement en double par addEventListener
[Rails] Comment empêcher la transition d'écran
[Traitement × Java] Comment utiliser les variables
[Traitement × Java] Comment utiliser les tableaux
[Traitement × Java] Comment utiliser la boucle
[Traitement × Java] Comment utiliser la classe
[Traitement × Java] Comment utiliser la fonction
Comment implémenter le traitement asynchrone dans Outsystems
[Rails] Comment décider de la destination par "voies ferrées"
Comment sortir le CSV créé par Rails vers S3
Comment rendre la logique de vérification en double plus lisible
Comment séparer .scss par contrôleur dans Rails
Comment utiliser la portée et le traitement des passes (servist)
Comment utiliser les connaissances pour réduire le travail d'assistance de 10 à 20%
[Java] Comment obtenir la clé et la valeur stockées dans Map par traitement itératif
Comment revenir à l'écran précédent par opération Swipe
Comment passer à l'écran des détails en cliquant sur l'image
[Java] Comment obtenir une requête par communication HTTP
Comment vérifier une seule vérification RadioButton par défaut (Remarque)
Comment démarrer TOMCAT en spécifiant JAVA_HOME sous Windows
[Java] Comment découper une chaîne de caractères caractère par caractère
[swift5] Comment exécuter le traitement lorsque tabBar est appuyé
Comment empêcher editTextPreference de Android PreferenceFragmentCompat de se rompre
Comment démarrer par environnement avec Spring Boot de Maven
[RSpec] Comment tester les messages d'erreur définis indépendamment par Shoulda-Matchers
Comment développer OpenSPIFe
Comment appeler AmazonSQSAsync
Comment utiliser Map
Comment écrire des rails
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser fields_for
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment installer Docker
Comment utiliser MapStruct
Comment utiliser TreeSet
Comment désinstaller Rails
Comment installer docker-machine
[Comment utiliser l'étiquette]
Comment faire un pot ombré
Comment écrire docker-compose
Comment utiliser l'identité
Comment utiliser le hachage
Comment écrire Mockito
Comment créer docker-compose