функция запускается только при первом нажатии?

#javascript #html #css #firebase #animate.css

#javascript #HTML #css #firebase #animate.css

Вопрос:

Я работаю над таблицей лидеров для игрового веб-сайта ctf, который я разработал для университета. Я начал немного играть с некоторыми простыми анимациями и обнаружил некоторые ошибки, которые я не могу понять: 1. Вы должны дважды нажать на кнопку входа или добавить кнопку, чтобы это действительно сработало с первого раза. 2. Когда отправляется неправильный ответ, анимация срабатывает только один раз, а затем для любых последующих неправильных ответов ничего не происходит.

Это ссылка на страницу:https://nerdts-4ed61.firebaseapp.com/leaderboards.html

 <footer>
    <h6 class="right-ans">
      Correct! Your progress will be added to your account.
    </h6>
  </br>
    <div id="addFlagInput" class="input-group">
      <div class="input-group-prepend">
        <span
          class="input-group-text"
          style="background: transparent; color: white; border-top: none; border-left: none; border-bottom: none; border-width: 2px; border-color: rgba(0,0,0,0.09);"
          id=""
          >Name and flag</span
        >
      </div>
      <input
        id="inputbox1"
        type="text"
        class="form-control transparent-input"
      />
      <input
        id="inputbox2"
        type="text"
        class="form-control transparent-input"
      />
      <div class="input-group-append">
        <button
          id="submitBtn"
          onclick="submit()"
          class="btn btn-light"
          style="background: transparent; color: white; border-color: rgba(0,0,0,0.09);"
          type="button"
        >
          Submit
        </button>
      </div>
    </div>
  </footer>
</div>    
 <!--ANIMATION LOGIN BTN-->
<script>
  function addFlag() {
    const element = document.querySelector("#addFlagBtn");
    element.classList.add("animated", "fadeInDown");
    const display = element.style.display;
    if (display == "none") {
      element.style.display = "block";
    } else {
      element.style.display = "none";
    }
  }
</script>
<!--check user state for flag add-->
<script>
  function isUser() {
    firebase.auth().onAuthStateChanged(function(user) {
      if (user) {
        //show input form
        const inElement = document.querySelector("#addFlagInput");
        inElement.classList.add("animated", "fadeInUp");
        const visibility = inElement.style.visibility;
        if (visibility == "hidden") {
          inElement.style.visibility = "visible";
        } else {
          inElement.style.visibility = "hidden";
        }
      } else {
        //tooltip: you must register to add a flag
        const element = document.querySelector("#addFlagBtn");
        element.setAttribute("title", "You must register to add a flag.");
      }
    });
  }
</script>
<!--Submit button functionality-->
<script>
  function hideText() {
    document.querySelector(".right-ans").style.display = "none";
  }
  function submit() {
    const submitElement = document.querySelector("#inputbox2");
    const answer = submitElement.value;
    console.log("Your answer is: ", answer);
    var database = firebase.database();
    var dbRef = database.ref("flags/");
    dbRef.orderByKey().on("value", snapshot => {
      if (snapshot.exists()) {
        snapshot.forEach(function(data) {
          var val = data.val();
          if (val.id == answer) {
            document
              .querySelector(".right-ans")
              .classList.add("animated", "heartBeat");
            document.querySelector(".right-ans").style.display = "inline";
            console.log("correct!");
            setTimeout(hideText, 5000);
          }
          else {
            const inputdiv = document.querySelector("#addFlagInput");
            inputdiv.classList.remove("fadeInUp");
            inputdiv.classList.add("animated","swing");
          }
        });
      }
    });
  }
</script>
  

Комментарии:

1. Мое первое предположение заключается в том, что у вас есть функция, которая добавляет и удаляет анимации в неправильном месте.

Ответ №1:

Что делает

 dbRef.orderByKey().on("value", snapshot => {
  if (snapshot.exists()) {
    snapshot.forEach(function(data) {
  

делать? Похоже, у вас есть код, который фактически добавляет или удаляет класс внутри прослушивателя событий firebase. Каждый раз, когда вы запускаете функцию, переменные или функции внутри создаются заново, и всякий раз, когда вы доходите до конца этой функции или за пределами области видимости, если переменная была создана внутри этой области и не назначена какой-либо другой переменной снаружи, она уничтожается.

Таким образом, каждый раз, когда ваша функция отправки запускается, это событие, похожее на firebase, создается снова.

Событие запускается только при втором нажатии кнопки, потому что событие еще не существует, при первом нажатии кнопки, потому что оно существует только после выполнения первого submit() .

Комментарии:

1. В этом есть большой смысл! Но я не уверен, что мне следует делать сейчас… Как я могу проверить ответ безопасно, но без firebase? или есть другая функция, которую мне нужно использовать?

2. Итак, что вы делаете, это отправляете AJAX-запрос в firebase, чтобы проверить, действителен ли ответ?