Функция 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>
Это довольно простая проблема. 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()">
чтобы уточнить последнюю часть, я провел некоторую отладку, и "var_dump($_POST['form_submit'])" в файле базы данных вернул NULL. Я предполагаю, что форма не отправляется так, как обычно, если используется «event.target.submit ()»? Теперь код работает, спасибо за помощь!
Извините за путаницу с onsubmit
. Я не использовал обычный HTML и JavaScript в течение нескольких лет, поэтому я совершенно забыл, что () являются обязательными. Что касается проблем с тем, что база данных не получает данные, я рекомендую использовать меню браузера F12 (которое называется инструментами разработки), чтобы увидеть все запросы, которые делает ваш браузер. Вот учебник для Chrome
Спасибо! я больше не получаю ошибку, но если я не включу () после geocodeAddress в onsubmit, функция не запустится. Является ли назначение события вручную через «event = window.event» обходным путем? Я попробовал это, и форма отправляется в мой файл database.php, но не обрабатывается должным образом.