API 中未反映分配给按钮点击功能的变量
Variable assigned to button click function not reflected in API
我有两个按钮可以在城市之间切换天气 API。
当我分配要通过按钮点击确定的变量时:
TButton.addEventListener("click", TWeather);
function TWeather(){
outputDiv.style.display = "block";
const buttonCity = "Toronto";
};
API 的 URL 无法识别它。
const url = "https://api.openweathermap.org/data/2.5/weather?q=" + buttonCity + "&appid=" + myAPIkey + "&units=metric";
如果我在按钮函数之外设置变量,它会起作用。
我认为 const 是局部变量而不是全局变量。
在函数外的 addEventListener 之后定义你的变量并试一试。
问题是您在 TWeather 函数中定义了 buttonCity 变量,因此该变量仅在该函数的范围内可用。请阅读以下内容:https://www.w3schools.com/js/js_scope.asp
您必须将此变量分配给其他函数也可以访问的地方。
示例:
let currentCity = '';
TButton.addEventListener("click", TWeather);
function TWeather(){
outputDiv.style.display = "block";
currentCity = "Toronto";
};
然后API呼叫:
const url = "https://api.openweathermap.org/data/2.5/weather?q=" + currentCity + "&appid=" + myAPIkey + "&units=metric";
您没有指定要用 URL 做什么,所以我只是做了一个 console.log
。
在这里,我创建了一个对象并添加了一些属性,包括一些用于添加事件处理程序的函数。我还将目标城市作为数据属性添加到每个按钮,然后在事件处理程序中将其拉出。
这可能有点矫枉过正,但确实说明了一些避免全局变量的方法,并使它可以在不更改任何代码的情况下向 HTML 添加更多按钮。
var myapp = {
url: {
base: "https://api.openweathermap.org/data/2.5/weather?q=",
api: "&appid=",
unit: "&units=metric"
},
apiKey = "key",
baseSelector:".weather-toggle",
buttons: {},
init: function() {
const app = this;
this.buttons = document.querySelectorAll(this.baseSelector);
this.buttons.forEach(function(button, index, buttons) {
button.addEventListener("click", this.toggleWeather, false);
},this);
},
toggleWeather: function(event) {
const targetCity = event.target.dataset.targetCity;
const url = myapp.url.base + targetCity + myapp.url.api + myapp.apiKey + myapp.url.unit;
console.log(url);
}
};
myapp.init.apply(myapp);
<button class="weather-toggle" type="button" data-target-city="Toronto">Toronto</button>
<button class="weather-toggle" type="button" data-target-city="NewYork">New York City</button>
<button class="weather-toggle" type="button" data-target-city="Boston">Boston</button>
你可以尝试把你的 xhr.open 和 send 放在你的两个按钮函数中。记住 url 为 xhr.open 应该分配位置。希望这有效。干杯!
我有两个按钮可以在城市之间切换天气 API。
当我分配要通过按钮点击确定的变量时:
TButton.addEventListener("click", TWeather);
function TWeather(){
outputDiv.style.display = "block";
const buttonCity = "Toronto";
};
API 的 URL 无法识别它。
const url = "https://api.openweathermap.org/data/2.5/weather?q=" + buttonCity + "&appid=" + myAPIkey + "&units=metric";
如果我在按钮函数之外设置变量,它会起作用。
我认为 const 是局部变量而不是全局变量。 在函数外的 addEventListener 之后定义你的变量并试一试。
问题是您在 TWeather 函数中定义了 buttonCity 变量,因此该变量仅在该函数的范围内可用。请阅读以下内容:https://www.w3schools.com/js/js_scope.asp
您必须将此变量分配给其他函数也可以访问的地方。
示例:
let currentCity = '';
TButton.addEventListener("click", TWeather);
function TWeather(){
outputDiv.style.display = "block";
currentCity = "Toronto";
};
然后API呼叫:
const url = "https://api.openweathermap.org/data/2.5/weather?q=" + currentCity + "&appid=" + myAPIkey + "&units=metric";
您没有指定要用 URL 做什么,所以我只是做了一个 console.log
。
在这里,我创建了一个对象并添加了一些属性,包括一些用于添加事件处理程序的函数。我还将目标城市作为数据属性添加到每个按钮,然后在事件处理程序中将其拉出。
这可能有点矫枉过正,但确实说明了一些避免全局变量的方法,并使它可以在不更改任何代码的情况下向 HTML 添加更多按钮。
var myapp = {
url: {
base: "https://api.openweathermap.org/data/2.5/weather?q=",
api: "&appid=",
unit: "&units=metric"
},
apiKey = "key",
baseSelector:".weather-toggle",
buttons: {},
init: function() {
const app = this;
this.buttons = document.querySelectorAll(this.baseSelector);
this.buttons.forEach(function(button, index, buttons) {
button.addEventListener("click", this.toggleWeather, false);
},this);
},
toggleWeather: function(event) {
const targetCity = event.target.dataset.targetCity;
const url = myapp.url.base + targetCity + myapp.url.api + myapp.apiKey + myapp.url.unit;
console.log(url);
}
};
myapp.init.apply(myapp);
<button class="weather-toggle" type="button" data-target-city="Toronto">Toronto</button>
<button class="weather-toggle" type="button" data-target-city="NewYork">New York City</button>
<button class="weather-toggle" type="button" data-target-city="Boston">Boston</button>
你可以尝试把你的 xhr.open 和 send 放在你的两个按钮函数中。记住 url 为 xhr.open 应该分配位置。希望这有效。干杯!