HTML-форма не отправляется после функции onSubmit

Функция geocodeAddress() использует выборку для отправки HTTP-запроса. До того, как я добавил «event.preventDefault()» в качестве параметра функции, она не работала должным образом (TypeError: Network Error), поскольку запрос прерывался перезагрузкой страницы, вызванной отправкой формы. Однако, как только я добавил его, форма больше не отправляется. Я не думаю, что проблема связана с php-кодом, поскольку я его вообще не менял. Что может быть причиной этого?

У меня была такая же ошибка в этом посте раньше «TypeError: NetworkError при попытке получить ресурс» при отправке формы ReactJS

    <form action = "private/database.php" method = "POST" onsubmit = "geocodeAddress(event.preventDefault())"> 
      <input type = "text" name = "surname" placeholder = "性氏" required><br>
      <input type = "text" name = "given_name" placeholder = "名字" required><br>
      <label for = "male">
        <input type = "radio" id = "male" name = "gender" required>
        男性
      </label>
      <label for = "female">
        <input type = "radio" id = "female" name = "gender">
        女性
      </label><br>
      <input type = "text" name = "email" placeholder = "電子信箱" required><br>
      <input type = "text" name = "phone_number" placeholder = "電話" required><br>
      <input type = "text" id = "address" name = "address" placeholder = "地址" required><br>
      <input type = "hidden" id = "lat" name = "lat">
      <input type = "hidden" id = "lng" name = "lng">
      <input type = "date" name = "cleaning_date" required><br>
      <input type = "submit" name = "form_submit">
    </form>
    <script>
        function handleErrors(res) {
          if (!res.ok) {
            throw Error(res.statusText);
          }
          return res;
        }

        function geocodeAddress() {
          const address = document.getElementById('address').value;
          fetch(`https://maps.googleapis.com/maps/api/geocode/json?address=${address}&key=AIzaSyDxsdfWYv25UrruPXLqeXKVYUnD-VyReA`)
            .then(handleErrors)
            .then(res => res.json())
            .then(data => {
              console.info(data);
              document.getElementById('lat').value = data.results[0].geometry.location.lat.toString();
              document.getElementById('lng').value = data.results[0].geometry.location.lng.toString();
            })
            .catch(error => console.info(error));
        }
    </script>
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Разница между тегами Br и Wbr в HTML 5
Разница между тегами Br и Wbr в HTML 5
В целом, оба тега <br> и <wbr> имеют свои уникальные цели и функциональные возможности, и их использование зависит от конкретных требований к дизайну...
HTML И VS CODE Для Веб-разработки
HTML И VS CODE Для Веб-разработки
Прежде чем начать кодировать html в "VS CODE", мы должны сначала создать папку и назвать ее x.html, здесь я принимаю x как имя файла, который мы...
Как использовать WAI-ARIA
Как использовать WAI-ARIA
В моем текущем новом проекте почти все компоненты не учитывают веб-доступность. Моя нынешняя компания - это стартап, поэтому они не заботились о...
Статическая веб-страница, созданная с помощью CSS и HTML - до и не до.
Статическая веб-страница, созданная с помощью CSS и HTML - до и не до.
Я потратил некоторое время на создание своего сайта-портфолио. Затем, гордясь собой, я разместил свой код на серверах amazon. Мне потребовалось время,...
1
0
170
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это довольно простая проблема. event.preventDefault() останавливает действие по умолчанию, которое будет выполнять событие, в данном случае это отправка формы. Это означает, что fetch не прерывается, но, конечно, форма не отправляется.

Чтобы исправить это, вы должны вручную отправить форму после успешного получения. Это можно легко сделать, выполнив event.target.submit(). (event.target ссылается на форму, поэтому мы просто вызываем функцию отправки формы) Вот модифицированная функция geocodeAddress, которая должна делать именно это:

function geocodeAddress(event) {
  event.preventDefault() // prevent the submit from happening immediately
  const address = document.getElementById('address').value;
  fetch(`https://maps.googleapis.com/maps/api/geocode/json?address=${address}&key=AIzaSyDxsdfWYv25UrruPXLqeXKVYUnD-VyReA`)
    .then(handleErrors)
    .then(res => res.json())
    .then(data => {
      console.info(data);
      document.getElementById('lat').value = data.results[0].geometry.location.lat.toString();
      document.getElementById('lng').value = data.results[0].geometry.location.lng.toString();
      event.target.submit() // trigger the submit again once the fetch has finished
    })
    .catch(error => console.info(error));
}

Да, и еще, в форме onsubmit у вас должна быть просто "geocodeAddress()".

<form action = "private/database.php" method = "POST" onsubmit = "geocodeAddress()"> 

Спасибо! я больше не получаю ошибку, но если я не включу () после geocodeAddress в onsubmit, функция не запустится. Является ли назначение события вручную через «event = window.event» обходным путем? Я попробовал это, и форма отправляется в мой файл database.php, но не обрабатывается должным образом.

pp182 22.12.2020 05:39

чтобы уточнить последнюю часть, я провел некоторую отладку, и "var_dump($_POST['form_submit'])" в файле базы данных вернул NULL. Я предполагаю, что форма не отправляется так, как обычно, если используется «event.target.submit ()»? Теперь код работает, спасибо за помощь!

pp182 22.12.2020 06:05

Извините за путаницу с onsubmit. Я не использовал обычный HTML и JavaScript в течение нескольких лет, поэтому я совершенно забыл, что () являются обязательными. Что касается проблем с тем, что база данных не получает данные, я рекомендую использовать меню браузера F12 (которое называется инструментами разработки), чтобы увидеть все запросы, которые делает ваш браузер. Вот учебник для Chrome

Adam Jeliński 22.12.2020 09:51

Другие вопросы по теме