有你的代码的几个奇怪的事情。您的小提琴设置为运行onLoad
,这意味着您在JavaScript中定义的功能将不会在全球范围内提供 - 它们将在window.onload
处理程序中定义,该处理程序不会在外部编码以访问它们(特别是内联事件处理程序)。这是为什么不是使用内联事件处理程序(即使问题实际上是由于jsFiddle设置)的一个完美例子。
这就是说,当您在按钮的内联click
处理程序中调用alert();
时,它会调用本机window.alert()
函数,该函数将打开一个对话窗口。既然你没有通过它,它显示undefined
。它实际上不是调用您创建的alert
函数。
此外,由于getCurrentPosition
方法似乎是异步的,因此您应该将回调函数传递给lat
,以便您可以在获取位置时调用它。
试试这个:
function lat(callback) {
navigator.geolocation.getCurrentPosition(function (position) {
var lat = position.coords.latitude;
var lon = position.coords.longitude;
callback.call(null, lat, lon);
}, function (error) {
console.log("Something went wrong: ", error);
});
}
function getPosition() {
lat(function (latitude, longitude) {
alert("lat: " + latitude + ", lon: " + longitude);
});
}
http://jsfiddle.net/yJrtR/1/
UPDATE:
根据您的评论,如果你想它显示 “活”,你可以使用这样的事情:
window.onload = function() {
var latElement = document.getElementById("lat"),
lonElement = document.getElementById("lon"),
lastUpdatedElement = document.getElementById("last_updated"),
getPositionOptions = {
enableHighAccuracy: false,
timeout: 10000,
maximumAge: 0
},
getPos = function() {
console.log("getPos function called");
navigator.geolocation.getCurrentPosition(function (position) {
console.log("Successfully retrieved position: ", position);
var coords = position.coords;
latElement.innerHTML = coords.latitude;
lonElement.innerHTML = coords.longitude;
lastUpdatedElement.innerHTML = new Date(position.timestamp);
setTimeout(getPos, 5000);
}, function (error) {
console.log("Something went wrong retrieving position: ", error);
setTimeout(getPos, 5000);
}, getPositionOptions);
};
getPos();
};
随行NG HTML(只是 “模拟” 你讲的对话):
<div id="dialog">
<div>Your latitude is: <span id="lat"></span></div>
<div>Your longitude is: <span id="lon"></span></div>
<div>Last Updated: <small id="last_updated"></small></div>
</div>
DEMO:http://jsfiddle.net/yJrtR/12/
那么这段代码是从时间window
有load
版,它不断地重新获得地理位置。您可以将特殊选项传递给getCurrentPosition
,我在getPositionOptions
中声明。
正如我之前所说的,getCurrentPosition
是异步的,所以在调用getCurrentPosition
被调用后,任何时候都可以检索到位置......这就是回调的用途。在选项对象中,我设置了一个超时 - 10000
- 表示“不超过10秒来检索位置”,如果是,它将调用错误回调。 maximumAge
选项确保它始终尝试获取当前位置(而不是在某段时间内使用缓存版本。
所以,当任何回调被调用(可能是1秒后,可能是20秒后...虽然我们设置超时10秒),它会更新HTML的细节,然后再做一遍5秒后 - 这就是setTimeout
的用途。这是因为如果我们连续试图获得该位置(没有任何延迟),该页面将非常忙于获得该位置。 5秒延迟,甚至15秒,应该没问题。
参考:
UPDATE:
没有为geolocation
功能,让您在观看位置的具体方法,称为watchPosition
,做正是我想模仿的,但是莫尔高效。你可以试试这个:
window.onload = function() {
var latElement = document.getElementById("lat"),
lonElement = document.getElementById("lon"),
lastUpdatedElement = document.getElementById("last_updated"),
watchPositionOptions = {
enableHighAccuracy: false,
timeout: 10000,
maximumAge: 0
};
navigator.geolocation.watchPosition(function (position) {
console.log("Successfully retrieved position: ", position);
var coords = position.coords;
latElement.innerHTML = coords.latitude;
lonElement.innerHTML = coords.longitude;
lastUpdatedElement.innerHTML = new Date(position.timestamp);
}, function (error) {
console.log("Something went wrong retrieving position: ", error);
}, watchPositionOptions);
};
DEMO:http://jsfiddle.net/yJrtR/14/
参考:
OK,感谢。我该如何做到这一点,以便它不断“观察”设备的位置,不断更新变量并在屏幕上的对话框中进行更新(不用提示框)? – adeora 2013-05-10 19:23:34
@ goldage5我更新了我的答案,我将如何处理你现在要问的问题。如果你需要知道如何进行对话,你需要在这里提出一个新的问题。我提供的演示只是假装像一个对话框。重要的部分是让地理位置的东西工作,这似乎是在小提琴中正常工作。确保你看你的浏览器的控制台看到发生的事件(因为我登录) – Ian 2013-05-10 20:06:36
好的,谢谢。这真的帮助我。出于好奇,它获得的坐标的准确度是多少? – adeora 2013-05-11 14:21:49