var x = document.getElementById("demo");
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
x.innerHTML = "Geolocation is not supported by this browser.";
}
}
function showPosition(position) {
lat = position.coords.latitude;
lon = position.coords.longitude;
$(".demo").append("Latitude: " + position.coords.latitude +
"<br>Longitude: " + position.coords.longitude);
}
var gettingJSON = function() {
$.getJSON("http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "APPID=4a74787aeb02dcb53dcc8c15e29bdfa1", function(json) {
$(".para").append(JSON.stringify(json));
});
}
$(document).ready(function() {
getLocation();
gettingJSON();
});
以上是我的代码我收到以下错误
jQuery.Deferred exception: lat is not defined ReferenceError: lat is not defined
at gettingJSON (file:///G:/WebDev/WeatherAPI/js/main.js:19:73)
at HTMLDocument.<anonymous> (file:///G:/WebDev/WeatherAPI/js/main.js:26:1)
at j (file:///G:/WebDev/WeatherAPI/js/jquery.min.js:2:29948)
at k (file:///G:/WebDev/WeatherAPI/js/jquery.min.js:2:30262) undefined
r.Deferred.exceptionHook @ jquery.min.js:2
k @ jquery.min.js:2
jquery.min.js:2 Uncaught ReferenceError: lat is not defined
at gettingJSON (main.js:19)
at HTMLDocument.<anonymous> (main.js:26)
at j (jquery.min.js:2)
at k (jquery.min.js:2)
gettingJSON @ main.js:19
(anonymous) @ main.js:26
j @ jquery.min.js:2
k @ jquery.min.js:2
守则不起作用。我试图从showPosition Fucntion中使用lat和lon,但它说lat和lon没有定义。 我没有使用var关键字来制作lat和lon全局变量。 但他们没有工作。请任何人帮助我。
答案 0 :(得分:0)
如果你想访问这些变量,我建议你从函数中返回它们。或者你可以使用类对象做同样的事情。
答案 1 :(得分:0)
我想我已经找到了问题 -
你的getLocation()函数没有足够快地填充lat和lon, 所以当getJSON()被称为lat时,lon还不存在。
我在这里等了5秒钟进行了测试 -
$(document).ready(function(){
getLocation();
gettingJSON();
//checking lon and lat immediatelly
console.log("lon:"+lon+ "lat:"+ lat);
//setting a 5 sec timeout, and checking the lon and lat value again
setTimeout(function(){
console.log('waiting');
console.log("lon:"+lon+ "lat:"+ lat);
}, 5000);
});
控制台日志:
lon: undefined lat: undefined
after wait:
lon: 34.99041030000001 lat: 32.7888574
这可能是因为用户不允许足够快地进行位置检查。
也许尝试更改这样的代码:
function showPosition(position) {
lat=position.coords.latitude;
lon=position.coords.longitude;
$(".demo").append("Latitude: " + position.coords.latitude +
"<br>Longitude: " + position.coords.longitude);
gettingJSON(); //calling gettingJSON here assures that you already have the coordinates
}
答案 2 :(得分:0)
通常,要访问所有函数中的变量,它们应具有全局范围。这意味着它们在函数之外声明。
您的lat
和lon
函数在showPosition(position)
内部声明。这意味着它们只能由showPosition(position)
函数访问,而不能由gettingJSON()
函数访问。
如果您在var lat=position.coords.latitude;
函数之外和之前声明lon=position.coords.longitude;
和showPosition(position)
,它应该有效。
如果您正在使用freecodecamp,这里是一个解释全局和局部变量范围的链接。 FreeCodeCamp: Global Scope,FreeCodeCamp: Local Scope,FreeCodeCamp: Global vs Local Scope
此外,您没有调用showPosition(position)
函数,请记住在调整变量声明后执行此操作,如其中一条注释所示
我希望这会有所帮助。
答案 3 :(得分:0)
将所有内容放入自执行函数中,然后在开头声明变量。这样,他们就不是GLOBAL(您通常不想让变量GLOBAL),但他们可以使用代码中的所有内容:
(function($){
var lat, lon, x;
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
x.innerHTML = "Geolocation is not supported by this browser.";
}
}
function showPosition(position) {
lat = position.coords.latitude;
lon = position.coords.longitude;
$(".demo").append("Latitude: " + position.coords.latitude +
"<br>Longitude: " + position.coords.longitude);
}
var gettingJSON = function() {
$.getJSON("http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "APPID=4a74787aeb02dcb53dcc8c15e29bdfa1", function(json) {
$(".para").append(JSON.stringify(json));
});
}
$(document).ready(function() {
x = document.getElementById("demo");
getLocation();
gettingJSON();
});
})(jQuery);
答案 4 :(得分:0)
为了确保获得lat的值,您可以考虑更改程序的结构,并在内部调用gettingJSON showPosition:
var x = document.getElementById("demo");
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
x.innerHTML = "Geolocation is not supported by this browser.";
}
}
function showPosition(position) {
lat = position.coords.latitude;
lon = position.coords.longitude;
$(".demo").append("Latitude: " + position.coords.latitude +
"<br>Longitude: " + position.coords.longitude);
//call gettingJson here, pass it lat, lon values...sure to work if lat,lon is in fact gettting populated.
gettingJSON(lat, lon);
}
var gettingJSON = function(lat, lon) {
$.getJSON("http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "APPID=4a74787aeb02dcb53dcc8c15e29bdfa1", function(json) {
$(".para").append(JSON.stringify(json));
});
}
$(document).ready(function() {
getLocation();
});