Изменить внутренний HTML на основе возврата PHP - PullRequest
0 голосов
/ 04 октября 2019

У меня есть простая веб-страница с формой, состоящей из поля ввода текста и кнопки. Событие onclick кнопки запускает скрипт в голове. Сценарий вызывает отдельную страницу PHP и проверяет отправленный текст. Если значение равно «foo», оно должно сказать «правильный», а если что-то еще - «1001»с идентификатором response_one. Я работаю над учебным пособием по W3Schools, найденным здесь , но просто не могу этого сделать. Я включил HTML / PHP ниже, любые указатели будут с благодарностью.

HTML:

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>See</title>
    <script>
    function show(str) {
      if (str.length == 0) {
        document.getElementById("response_one").innerHTML = "";
        return;
      } else {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() {
          if (this.readyState == 4 && this.status == 200) {
            document.getElementById("response_one").innerHTML = this.responseText;
          }
        };
        xmlhttp.open("GET", "check_one.php?q=" + str, true);
        xmlhttp.send();
      }
    }
    </script>
  </head>
  <body>
    <div id="mainbody">
  <form>
    Answer: <input type="text" name="answers">
    <input type="submit" onclick="show(this.value)">
  </form>
  <div id="response_one"></div>
</div>
  </body>
</html>

и check_one.php:

<?php
$q = $_REQUEST["q"];
$q = strtolower($q)

$result = ""

if ($q === "foo") {
  $result = "Correct";
} else {
  $result = "Incorrect";
}

echo $result
 ?>

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Проблемы

Множество проблем здесь:

  1. Ваша кнопка является входом для отправки. При нажатии ваш браузер отправит форму. Ни один из ваших AJAX не будет иметь значения, потому что страница обновится, прежде чем вы увидите какой-либо результат.
  2. Ваша кнопка не содержит значения. Поле ввода <input type="text" name="answers"> делает. Выполнение show(this.value) является ошибкой, потому что вы действительно не планируете проверять значение кнопки отправки.
  3. В вашем файле check_one.php имеется несколько синтаксических ошибок. Пожалуйста, запустите командную строку php -l check_one.php или используйте браузер для просмотра check_one.php?q=foo, чтобы проверить ее.

Быстрое исправление

Я оставлю вам ошибку синтаксиса php и сосредоточусь на вашемсформироваться. Вот как я собираюсь это исправить:

  1. Измените кнопку отправки с <input type="submit"> на <button type="button">. Это предотвратит отправку формы при нажатии.
  2. Измените функцию onClick, чтобы получить доступ к значению вашего ввода текста answers вместо this.value.

. Код

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>See</title>
    <script>
      function show(str) {
        if (str.length == 0) {
          document.getElementById("response_one").innerHTML = "";
          return;
        } else {
          var xmlhttp = new XMLHttpRequest();
          xmlhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
              document.getElementById("response_one").innerHTML = this.responseText;
            }
          };
          xmlhttp.open("GET", "check_one.php?q=" + str, true);
          xmlhttp.send();
        }
      }
    </script>
  </head>
  <body>
    <div id="mainbody">
      <form>
        Answer:
        <input type="text" name="answers">
        <button type="button" onClick="show(this.form['answers'].value)">Check</button><!-- only this line is changed -->
      </form>
      <div id="response_one"></div>
    </div>
  </body>
</html>

Как только вы исправите check_one.php, вы получите желаемый результат.

Комната для улучшений

Все еще могут быть проблемы сваша форма. Если пользователь нажмет «Enter» вместо нажатия кнопки, ваша форма будет отправлена. Поэтому вместо того, чтобы просто перехватывать событие click кнопки, вам лучше было бы захватить событие отправки формы .

Итак, вот улучшения:

  1. Добавьте атрибут id к вашей форме.
  2. Используйте document.getElementById , чтобы найти форму и перехватить событие отправки .
  3. Используйте event.preventDefault() для предотвращения отправки формы.
  4. Найдите значение answers и введите XMLHttpRequest.

Код

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>See</title>
  </head>
  <body>
    <div id="mainbody">
      <form id="check-form"><!-- added id="check-form" -->
        Answer: <input type="text" name="answers">
        <input type="submit"><!-- removed onClick attribute -->
      </form>
      <div id="response_one"></div>
    </div>
  </body>
  <script>
    // Moved script after body so the form element would exist before
    // this script is run.
    document.getElementById('check-form').addEventListener('submit', function (evt) {
      evt.preventDefault(); // prevent form submission
      var str = evt.target["answers"].value; // get the answers field value

      // The logics previously in your `show()` function
      if (str.length == 0) {
        document.getElementById("response_one").innerHTML = "";
        return;
      } else {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() {
          if (this.readyState == 4 && this.status == 200) {
            document.getElementById("response_one").innerHTML = this.responseText;
          }
        };
        xmlhttp.open("GET", "check_one.php?q=" + str, true);
        xmlhttp.send();
      }
    });
  </script>
</html>
1 голос
/ 04 октября 2019

Кажется, вы забыли некоторые из ";"в конце кода. Как насчет

<?php
$q = $_REQUEST["q"];
$q = strtolower($q)

$result = ""

if ($q === "foo") {
  $result = "Correct";
} else {
  $result = "Incorrect";
}

echo $result
 ?>

К

<?php
$q = $_REQUEST["q"];
$q = strtolower($q);

$result = "";

if ($q === "foo") {
  $result = "Correct";
} else {
  $result = "Incorrect";
}

echo $result;
 ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...