4

我有以下 JS 来显示当前用户的邮政编码#zip

(function ($, geolocation) {
    if (geolocation) {
        geolocation.getCurrentPosition(function (position) {
            $.getJSON(
                "http://ws.geonames.org/findNearestAddressJSON?callback=?",
                {
                    lat : position.coords.latitude,
                    lng : position.coords.longitude
                },
                function (data) {
                    $(function () {
                        $('#zip').text(data.address.postalcode);
                    });
                }
            );
        });
    }
}(jQuery, navigator.geolocation));

我还有一个 JS 函数来重新加载页面:

$('.reload').click(function(){
    window.location.reload(true);
});

在 Mobile Safari 中,这两个功能可以很好地协同工作。如果用户打开网页,它将加载用户当前的邮政编码。然后,如果用户更改位置,用户可以通过点击按钮重新加载页面。这工作正常,除非<meta name="apple-mobile-web-app-capable" content="yes">存在。

当它存在时,会发生以下情况:

  1. 用户点击主屏幕上的图标
  2. 网页打开,地址栏隐藏,<meta name="apple-mobile-web-app-capable" content="yes">这样
  3. 邮政编码按应有的方式加载
  4. 用户移动位置,点击重新加载按钮
  5. 页面无法显示邮政编码,没有错误记录到控制台

我真的很想解决这个问题,但如果这有帮助,这里有一个工作示例:

http://www.codekraken.com/testing/zipper/zip.html

4

3 回答 3

4

全屏网络应用程序没有重新加载(使用 apple-mobile-web-app-capable)。但是,当用户更改位置,然后再次运行应用程序时,它总是会加载页面。它不会触发 reload 事件,但会触发 onload 事件——每次运行时。

如果用户让应用程序运行并更改位置,您将需要一个简单的“再次找到我”功能,该功能只需重新运行您的代码以查找当前位置和邮政编码。

现在 - 这里有一个问题!我发现在 iOS 上,位置经常被缓存,即使你告诉它只使用一个新的位置,所以有时,你会得到旧的位置。我为此创建了一个名为 getAccurateCurrentLocation() 的解决方法,它使用非常相似的接口。您可以在https://github.com/gwilson/getAccurateCurrentPosition找到代码- 作为 getCurrentPosition() 的替代品非常简单。

那应该这样做。

于 2012-08-16T21:04:38.487 回答
0

万一其他人有困惑(就像我一样),这里涉及的方法是地理定位对象的本机“watchPosition”方法。

WatchPosition MDN 规范

当用户移动位置时将调用 watchPosition 方法,您可以指定您的 lat/long 到 zip 生成器作为回调。

从规格:

    var watchID = navigator.geolocation.watchPosition(function(position) {
        do_something(position.coords.latitude, position.coords.longitude);
    });

所以看起来你可以这样做:

    var watchID = navigator.geolocation.watchPosition(function(position) {
        $.getJSON(
            "http://ws.geonames.org/findNearestAddressJSON?callback=?",
            {
                lat : position.coords.latitude,
                lng : position.coords.longitude
            },
            function (data) {
                $(function () {
                    $('#zip').text(data.address.postalcode);
                });
            }
        );
    });

这将实现更加简单 - 用户不必点击位置按钮,它应该已经在他们移动时更新。

需要明确的是,Greg 的函数使用了这种 watchPosition 方法,但是如果你想了解什么在工作,或者使用更精简的原生代码并自己自定义,watchPosition 是你的工具。

于 2013-02-06T20:26:39.237 回答
-2

全屏模式在 WebSheet 中启动浏览器,该 WebSheet 可能具有一组单独的地理位置权限。也许以前您拒绝在 WebSheet 中共享地理位置信息,但允许在 Safari 浏览器中共享。

如果我没记错的话,众所周知,WebSheets 会不时重置其权限并再次提示用户允许每隔几个小时读取一次地理位置。

于 2012-08-08T00:34:03.660 回答