【问题标题】:Passing HTML5 geolocation data to a variable将 HTML5 地理位置数据传递给变量
【发布时间】:2013-05-05 05:31:30
【问题描述】:

我真的是 Javascript 的新手,我正在尝试进入它。

我想让脚本获取地理位置数据并将其传递给变量,然后将信息显示在警报中。

我这里有一个 jsFiddle:http://jsfiddle.net/yJrtR/

当我运行它时,我在警告框中得到一个“未定义”。有人可以帮我解决这个问题吗?

这是我的代码:

    function lat() {

navigator.geolocation.getCurrentPosition(function (position) {
    var lat = position.coords.latitude;
    var lon = position.coords.longitude;
}, function (error) {
    console.log("Something went wrong: ", error);
});
    }

    function alert() {
var lat="";
var lon="";
lat();
alert("lat + lon");
    }

【问题讨论】:

    标签: javascript html variables geolocation parameter-passing


    【解决方案1】:

    您的代码中有几个奇怪的东西。您的小提琴设置为运行 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/

    更新:

    根据您的评论,如果您希望它“实时”显示,您可以使用以下内容:

    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();
    };
    

    使用以下 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>
    

    演示: http://jsfiddle.net/yJrtR/12/

    所以这段代码的作用是从window 具有loaded 的时间开始,它不断地重新获取地理位置。您可以将一些特殊选项传递给getCurrentPosition,我在getPositionOptions 中声明了这些选项。

    正如我之前所说,getCurrentPosition 是异步的,因此在调用getCurrentPosition 后随时可以检索位置……这就是回调的用途。在选项对象中,我设置了一个超时 - 10000 - 表示“检索位置的时间不会超过 10 秒”,如果是,它将调用错误回调。 maximumAge 选项确保它始终尝试在特定时间段内获取当前位置(而不是使用缓存版本。

    所以当任何一个回调被调用时(可能是 1 秒后,也可能是 20 秒后......虽然我们设置了 10 秒的超时),它会用细节更新 HTML,然后再做一遍 5几秒钟后 - 这就是 setTimeout 的用途。这是因为如果我们不断尝试获取位置(没有任何延迟),页面将非常忙于获取位置。 5 秒的延迟,甚至最多 15 秒应该没问题。

    参考:


    更新:

    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);
    };
    

    演示: http://jsfiddle.net/yJrtR/14/

    参考:

    【讨论】:

    • 好的,谢谢。我将如何使它不断“监视”设备的位置,不断更新变量并在屏幕上的对话框中更新(不显示警告框)?
    • @goldage5 我更新了我的答案,我将如何处理你现在所问的问题。如果您需要知道如何进行对话,您需要在此处提出一个新问题。我提供的演示只是假装像一个对话。重要的部分是让地理位置的东西工作,这似乎在小提琴中正常工作。确保您观看浏览器的控制台以查看正在发生的事件(因为我记录了它们)
    • 好的,谢谢。这真的对我有帮助。出于好奇,它得到的坐标的准确性是多少?
    • @goldage5 如果您查看我答案末尾的链接,它会提供有关此功能的很多信息,包括准确性。例如,您可以查看position.coords.accuracy 以了解坐标的准确度(以米为单位)。如果您查看我在第二个示例中使用的 getPositionOptions 对象,您会看到 enableHighAccuracy 属性 - 可以将其设置为 true 以尝试使其更准确(但会消耗更多的计算机功率)。
    • @goldage5 我真的不知道它是如何为非 GPS 设备获取位置的,所以就这一点而言,我不知道 :)
    猜你喜欢
    • 2015-03-09
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多