0
votes

Condition de clic satisfaisante pour afficher un message en javascript

Désolé d'avance si mon code est vraiment mauvais mais je ne suis qu'un débutant. Je voudrais créer un puzzle de recherche de mots à l'aide de boutons. Lorsque la personne a fini de trouver en cliquant sur tous les mots que je vais créer à partir des boutons, je veux qu'un message apparaisse indiquant qu'elle a terminé le puzzle. J'ai donc créé un exemple ici avec 4 boutons mais je n'arrive pas à faire fonctionner mon code. Je veux que le message apparaisse dans le conteneur div une fois que tous les boutons ont été cliqués. Suis-je sur la bonne voie ici ou loin? Toute idée serait tellement appréciée!

<html>

      <p onclick="myFunction()" id="1" value=false >Button1</p>
      <p onclick="myFunction()" id="2" value=false >Button2</p>
      <p onclick="myFunction()" id="3" value=false >Button3</p>
      <p onclick="myFunction()" id="4" value=false >Button4</p>

      <div id="demo">Message displays here if all 4 buttons are clicked</div>

<script>
function myFunction(){
  value = true;}

    if(p 1){
        value = true;}

    if(p 2){
        value = true;}

    if(p 3){
        value = true;}

    if(p 4){
        value = true;}
else{
  document.getElementById("demo").innerHTML = "Congratulations you clicked on all of the buttons";}

}
</script>
</html>


2 commentaires

Votre fonction se termine immédiatement après votre première value = true; lorsque vous fermez les accolades. Vos instructions if ne sont même pas dans la fonction. Je pense que vous voulez ajouter la déclaration de vos accolades entre les parenthèses myFunction(value=true) {...} . Ensuite, vous devrez définir p . Et probablement utiliser == pour vérifier sa valeur: if (p == 1){...} Mais vous ne comparez pas non plus la value à quoi que ce soit, alors quel est son but?


ouais j'ai beaucoup à apprendre. Merci d'avoir expliqué. Appréciez-le!


4 Réponses :


1
votes

Un moyen plus simple de le faire est d'utiliser un écouteur d'événement qui écoute chaque clic sur un bouton, puis rend la valeur de ce bouton vraie, puis vérifie tous les boutons pour voir s'ils ont tous été cliqués et si c'est le cas, affiche le message de félicitations.

HTML

ajout de classes à chaque bouton et suppression de la fonction onclick

window.addEventListener('click', (e)=>{
  var bool = true
  if (e.target.classList.contains('button')) {
    e.target.setAttribute('value', "true")
  }
  buttons = document.querySelectorAll('.button')
  for (let i = 0; i < buttons.length; i++) {
    console.log(buttons[i].getAttribute('value'))
    if (buttons[i].getAttribute('value') == "false") {
      bool = false
    }
  }
  if (bool == true) {
    document.getElementById("demo").innerHTML = "Congratulations you clicked on all of the buttons";
  }
})

JS

<html>
      <p class='button' id="1" value=false >Button1</p>
      <p class='button' id="2" value=false >Button2</p>
      <p class='button' id="3" value=false >Button3</p>
      <p class='button' id="4" value=false>Button4</p>

      <div id="demo">Message displays here if all 4 buttons are clicked</div>
</html>


1 commentaires

J'aime ça. Je devrai implémenter le code dans le programme d'animation que j'utilise pour créer le puzzle. Je pense donc que la façon dont vous avez mis cela en place fonctionnera pour moi, mais il faudra un peu de temps pour l'essayer. Merci beaucoup!



1
votes

Je suggérerais ceci comme une réponse facile pour comprendre un peu mieux javascript et html:

HTML

    var foundButtons = {
      button1: false,
      button2: false,
      button3: false,
      button4: false,
    };

    function myFunction(event) {
      foundButtons[event.target.name] = true;
      for (var button in foundButtons) {
        if (foundButtons.hasOwnProperty(button)) {
          if (!foundButtons[button]) {
            return
          }
        }
      }
      document.getElementById("demo").innerHTML = "Congratulations you clicked on all of the buttons";
    }

JS

<html>
  <body>
    <button onclick="myFunction(event)" name="button1">Button1</button>
    <button onclick="myFunction(event)" name="button2">Button2</button>
    <button onclick="myFunction(event)" name="button3">Button3</button>
    <button onclick="myFunction(event)" name="button4">Button4</button>
    <div id="demo">Message displays here if all 4 buttons are clicked</div>
  </body>
</html>

Cela fait que vous avez un objet des boutons ou plutôt les mots sur lesquels il faut cliquer pour afficher le message. Désormais, lorsqu'un des boutons est cliqué, sa propriété est définie sur true. Ensuite, il itère sur les propriétés et termine la fonction avec une instruction de retour, s'il trouve une valeur fausse, ce qui signifie qu'il y a un bouton qui n'a pas été cliqué. Lorsque la fonction ne s'arrête pas, elle affiche le message de réussite.


0 commentaires

1
votes

Voici ma solution.

<p onclick="myFunction(0)">Button0</p>
<p onclick="myFunction(1)">Button1</p>
<p onclick="myFunction(2)">Button2</p>
<p onclick="myFunction(3)">Button3</p>
<div id="demo">Message displays here if all 4 buttons are clicked</div>
var set = []; //decalre an empty array

function myFunction(Id) {
  console.log(Id); //the Id will be the vlaue from the button. For example button 1 has an Id of one as passed into by 'myFunction(1)
  if (set.indexOf(Id) == -1) { //here we check to see if the Id number is in the array
    set.push(Id); //if it's not in the array, we add it in
    console.log(set);
    console.log("length: " + set.length);
    if (set.length > 3) { //if the lengthof the array is greater than three, all 4 buttons have been clicked.
      document.getElementById("demo").innerHTML = "Congratulations you clicked on all of the buttons";
    }
  } 
}


2 commentaires

Une si belle option. Merci!


pas de problème :) Je ne pense pas que vous obtiendrez plus de réponses que 4, donc vous devriez en marquer une comme correcte (il n'est pas nécessaire que ce soit moi, au fait, je pense que toutes ces réponses sont de bonnes options).



2
votes

Vous pouvez utiliser les attributs de données des boutons pour conserver leur état . (Remarque: pour un projet plus complexe, vous ne voulez probablement pas faire cela)

De plus, mettre JS en ligne comme onclick="myfunction()" est quelque peu mauvais pour votre code - cela encourage les globaux et rend la logique JS plus difficile à suivre. Donc, j'ai montré une alternative en utilisant un IIFE , .querySelectorAll() et .addEventListener() :

<button class="js-button">Button1</button>
<button class="js-button">Button2</button>
<button class="js-button">Button3</button>
<button class="js-button">Button4</button>

<p class="js-message">Message displays here if all 4 buttons are clicked</p>
// IIFE to keep variables out of the global scope
;(function () {
  // NOTE: These are more flexible when they are arrays (thus, Array.from())
  var btnEls = Array.from(document.querySelectorAll('.js-button'))
  var msgEls = Array.from(document.querySelectorAll('.js-message'))

  function handleButtonClick(event) {
    var btnEl = event.target
    btnEl.disabled = true // optional
    btnEl.dataset.toggled = 'true' // using the DOM to hold data

    if (btnEls.some(function (el) {
      return el.dataset.toggled !== 'true'
    })) return

    msgEls.forEach(function (el) {
      el.textContent = 'Congratulations you clicked on all of the buttons'
    })
  }

  // Our "onclick" equivalent
  btnEls.forEach(function (el) {
    el.addEventListener('click', handleButtonClick)
  })
})()

... Il y a probablement beaucoup de syntaxe que vous ne connaissez pas, mais cet exemple devrait être utile pour ceux qui apprennent à partir d'une source plus moderne. Puisque vous apprenez de quelque chose qui utilise une syntaxe JS plus ancienne, voici un code JS plus ancien qui fonctionne à peu près de la même manière (mais qui n'est pas aussi facile à maintenir):

<button class="js-button">Button1</button>
<button class="js-button">Button2</button>
<button class="js-button">Button3</button>
<button class="js-button">Button4</button>

<p class="js-message">Message displays here if all 4 buttons are clicked</p>
// IIFE to keep variables out of the global scope
;(() => {
  // NOTE: These are more flexible when they are arrays (thus, Array.from())
  const btnEls = Array.from(document.querySelectorAll('.js-button'))
  const msgEls = Array.from(document.querySelectorAll('.js-message'))

  const handleButtonClick = ({ target: btnEl }) => {
    btnEl.disabled = true // optional
    btnEl.dataset.toggled = 'true' // using the DOM to hold data

    if (btnEls.some(el => el.dataset.toggled !== 'true')) return

    msgEls.forEach(el => {
      el.textContent = 'Congratulations you clicked on all of the buttons'
    })
  }

  // Our "onclick" equivalent
  btnEls.forEach(el => el.addEventListener('click', handleButtonClick))
})()


0 commentaires