XMLHttpRequest 和 Fetch 无法正常工作
XMLHttpRequest and Fetch not functioning
所以我正在开发我的第一个项目,它使用 JavaScript 和 HTML,它是一个基本的天气网页。用户输入他们的位置并显示当前天气。让 HTML 工作顺利,但 JavaScript 一直在堵塞。奇怪的是控制台中没有错误,所以它应该工作得很好。
这是HTML的部分:
<section id="weather">
<div id="nav">
<div id="locate">
<div id="container">
<form id="location-form">
<label for="location">Location (eg. London,uk):</label>
<input type="text" id="location" name="location" required>
<button type="submit" form="location-form" formnovalidate>Let's Go!</button>
</form>
</div>
</div>
<div id="weather-output">
<!-- Output of API goes here -->
</div>
</div>
</section>
这是我的JavaScript。我使用脚本标签嵌入了它,因为它没有检测到按钮按下。
<script type="text/JavaScript">
function fetchAPIData() {
const locationInput = document.getElementById("location");
const locationValue = locationInput.value;
const url = `http://api.openweathermap.org/data/2.5/weather?q=${locationValue}&APPID=API_URL`;
// do the URL Request
async function xmlrequest() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// Typical action to be performed when the document is ready:
document.getElementById("weather-output").innerHTML = xhttp.responseText;
}
};
xhttp.open("GET", url, true);
xhttp.send();
}
xmlrequest();
}
//listens for button on html side and runs fetchAPIData()
document.addEventListener("DOMContentLoaded", () => {
document.querySelector("button[type=submit]").addEventListener("click", fetchAPIData);
}
);
</script>
我已经尝试过使用 XMLHttpRequest(如上所示)和 Fetch。既不工作,也不工作,也不显示错误。我正在使用 OpenWeatherMap 我有一个 API 键,它可以作为一个普通的 url 使用,但是当它是脚本时它却没有。任何帮助都会很棒!
捷运
编辑:Firebase 分析正在运行,其状态代码为“200”。
但是 API 没有任何状态代码或错误消息。更新了代码,现在有一个错误“400”,所以它仍然不起作用,但我现在可以解决它。谢谢大家的帮助!
解决方案 1
问题是您将按钮类型写为“提交”:
<button type="submit" form="location-form" formnovalidate>Let's Go!</button>
试试 type="button":
<button type="button" form="location-form" formnovalidate>Let's Go!</button>
并修改js:
document.querySelector("button[type=button]").addEventListener("click", fetchAPIData);
解决方案 2
使用 e.preventDefault() 函数:
function fetchAPIData(e) {
e.preventDefault();
const locationInput = document.getElementById("location");
const locationValue = locationInput.value;
.....
除了James写的fetch
with async/await
应该还是这里的前进方向吧
一个基本的(人为的)例子:
// Make this function async
async function fetchAPIData() {
// Get the value from your input
const { value } = locationInput;
const endpoint = `http://api.openweathermap.org/data/2.5/weather?q=${value}&APPID=API_URL`;
// Await the response
const response = await fetch(endpoint);
// If it's ok parse the data and update the DOM
// otherwise throw an error
if (response.ok) {
const data = await response.json();
output.innerHTML = data;
} else {
throw new Error('Bad response');
}
}
所以我正在开发我的第一个项目,它使用 JavaScript 和 HTML,它是一个基本的天气网页。用户输入他们的位置并显示当前天气。让 HTML 工作顺利,但 JavaScript 一直在堵塞。奇怪的是控制台中没有错误,所以它应该工作得很好。
这是HTML的部分:
<section id="weather">
<div id="nav">
<div id="locate">
<div id="container">
<form id="location-form">
<label for="location">Location (eg. London,uk):</label>
<input type="text" id="location" name="location" required>
<button type="submit" form="location-form" formnovalidate>Let's Go!</button>
</form>
</div>
</div>
<div id="weather-output">
<!-- Output of API goes here -->
</div>
</div>
</section>
这是我的JavaScript。我使用脚本标签嵌入了它,因为它没有检测到按钮按下。
<script type="text/JavaScript">
function fetchAPIData() {
const locationInput = document.getElementById("location");
const locationValue = locationInput.value;
const url = `http://api.openweathermap.org/data/2.5/weather?q=${locationValue}&APPID=API_URL`;
// do the URL Request
async function xmlrequest() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// Typical action to be performed when the document is ready:
document.getElementById("weather-output").innerHTML = xhttp.responseText;
}
};
xhttp.open("GET", url, true);
xhttp.send();
}
xmlrequest();
}
//listens for button on html side and runs fetchAPIData()
document.addEventListener("DOMContentLoaded", () => {
document.querySelector("button[type=submit]").addEventListener("click", fetchAPIData);
}
);
</script>
我已经尝试过使用 XMLHttpRequest(如上所示)和 Fetch。既不工作,也不工作,也不显示错误。我正在使用 OpenWeatherMap 我有一个 API 键,它可以作为一个普通的 url 使用,但是当它是脚本时它却没有。任何帮助都会很棒!
捷运
编辑:Firebase 分析正在运行,其状态代码为“200”。 但是 API 没有任何状态代码或错误消息。更新了代码,现在有一个错误“400”,所以它仍然不起作用,但我现在可以解决它。谢谢大家的帮助!
解决方案 1
问题是您将按钮类型写为“提交”:
<button type="submit" form="location-form" formnovalidate>Let's Go!</button>
试试 type="button":
<button type="button" form="location-form" formnovalidate>Let's Go!</button>
并修改js:
document.querySelector("button[type=button]").addEventListener("click", fetchAPIData);
解决方案 2
使用 e.preventDefault() 函数:
function fetchAPIData(e) {
e.preventDefault();
const locationInput = document.getElementById("location");
const locationValue = locationInput.value;
.....
除了James写的fetch
with async/await
应该还是这里的前进方向吧
一个基本的(人为的)例子:
// Make this function async
async function fetchAPIData() {
// Get the value from your input
const { value } = locationInput;
const endpoint = `http://api.openweathermap.org/data/2.5/weather?q=${value}&APPID=API_URL`;
// Await the response
const response = await fetch(endpoint);
// If it's ok parse the data and update the DOM
// otherwise throw an error
if (response.ok) {
const data = await response.json();
output.innerHTML = data;
} else {
throw new Error('Bad response');
}
}