跨浏览器获取 Geolocation

标签: geolocation HTML5 | 发表时间:2012-01-01 22:51 | 作者:sofish
出处:http://sofish.de

年末,这一年的工作都差不多搞完了。因为下一年的目标是 HTML5 应用,所以在做一些小尝试。距离 第一次在支付宝分享 HTML5,已经有一年半了,时间好快,就这么过去了。而我似乎还是那个我。话多了。前几天和同事聊到可能可以做个基于 LBS 的服务,回到家里就尝试了一下 HTML5 的 Geolocation API。翻开一年前写的文档,很快就熟悉起来。主要有两个函数,下面是对比:

用于  方法 参数描述
单次 getCurrentPosition( successCallback [, errorCallBack, [, positionOptions])
  1. successCallback: 成功请求时调用的 callback;
  2. errorCallBack: 请求出现异常时调用的 callback, 可选;
  3. positionOptions: 对得于的位置进得微调。
重复 var watchPositionHandler = watchPosition( successCallback [, errorCallBack, [, positionOptions])
clearWatch(watchPositionHandler)

理论上来说,watchPosition 对于需要重复执行的操作是非常有用的,比如不断在地图上显示目标的位置。但事情上 W3C 并没有规定获取的频率是多少(难道是我找不到?),所以导致了浏览器处理的结果非我们想要,下面这个截图分别是 Chrome 和 Firefox 的获取频率,Chrome 显示频率非常混乱,而 Firefox 则是每分钟/一次:

geolocation

因此,如果想执行重复操作,最好还是利用定时器来重用执行 getCurrentLocation 以使你的程序能够显示正确的数据。当然,这是一方面的问题,只要浏览器支持 HTML5 的 Geolocation API,那么什么事都好商量,而我们问题就在于,像 IE 或者一下其他的,更老的浏览器,是不支持的。我们是不是有办法可以解决。

其实网站有很多提供免费 IP 获取的工具,比如 google Gears(停止开发了)、hostIP.info 等。所以利用这些工具,我们还是可以在其他只支持 javascript 的浏览器上获取地理位置信息的。下面是我写一个纯 JS 解决方案:

// Github 地址:  geolocation.js
// 结合这个 js 和 QQ 地图做的一个简单 Web APP:  Between US

/*
 * @Name: Geolocation
 * @Overview: the javascript way to fetch the geolocation
 * @Author: sofish Lin <http://sofish.de>
 */

// TODO: error handler for ie

function Geo(successCallback, errorCallback) {

    var that = this,

        // native geolocation API
        _w3cAPI = navigator.geolocation;

    // get ip-base geolocation
    // fallback for the w3c way
    function _ipBaseWay(){
        var that = this;

        var doc = document,
            script = doc.createElement('script');

        script.setAttribute('src','http://j.maxmind.com/app/geoip.js');
        doc.body.appendChild(script);

        script.attachEvent('onreadystatechange', function(){
            var target = window.event.srcElement;
            if(/loaded|complete/.test(target.readyState)){
                var coords = {
                    latitude: geoip_latitude(),
                    longitude: geoip_longitude()
                };
                return successCallback.call(that, coords);
            }
        });
    };

    // fetch coords using w3c Geoloactions API
    function _w3cWay (){
        var that = this;

        _w3cAPI.getCurrentPosition(function(position){
            successCallback.call(that, position.coords);
        },function(error){
            var err;
            switch (error.code) {
                case error.PERMISSION_DENIED:
                	err = 'You did not share geolocation data!'; break;
                case error.POSITION_UNAVAILABLE:
                	err = 'Could not detect current position!'; break;
                case error.TIMEOUT:
                	err = 'Retrieving position timedout!'; break;
                default:
                	err = 'Unknown error';
            };
            errorCallback.call(that, err);
        });

    };

    // create the position
    !!(_w3cAPI) ? _w3cWay() : _ipBaseWay();
};


© 2012 幸福收藏夹。 版权所有,转载务必注明。域名已经更新为: sofish.de
注意:当你觉得某篇文章有用,请直接看原文,因为通常我都会在写了文章后更新、去错别字、升级观点之类的。

相关 [浏览器 geolocation] 推荐:

跨浏览器获取 Geolocation

- - 幸福收藏夹
年末,这一年的工作都差不多搞完了. 因为下一年的目标是 HTML5 应用,所以在做一些小尝试. 距离 第一次在支付宝分享 HTML5,已经有一年半了,时间好快,就这么过去了. 前几天和同事聊到可能可以做个基于 LBS 的服务,回到家里就尝试了一下 HTML5 的 Geolocation API. 翻开一年前写的文档,很快就熟悉起来.

html5 Geolocation 地理定位

- - On The Way
一、Geolocation 概述. Geolocation API 在网页中使用 geolocation 对象向javaScript 提供经度和纬度. 利用 geolocation 对象,可以获取用户位置和跟踪用户位置的变化. 1.1 Geolocation API 获取地理位置的方式. IP地址 - 任何地方可用,不精确.

Geolocation和Web Sockets基于NodeJs的实战(2)

- - ria之家--RIA三部曲:jquery、ext、flex
上一篇教程明河讲解了一些NodeJs的知识点,这一篇教程将给大家讲解前端方面的知识点. Geolocation是html5中的主要内容,用于处理客户端的地理信息,特别在手持设备上有广泛的使用场景. Geolocation的简单的demo. (PS:demo中虽然实现了位置定位,但不能随着你的移动,坐标也发生变化,借助NodeJs的socket.io模块即可实现.

Silk 浏览器:Google? No!

- 橙子 - 爱范儿 · Beats of Bits
前苹果员工, Blogger Chris Espinosa 指出, Amazon 的 Silk 浏览器技术,让 Amazon 不能把自己置于 Google 的控制之下. Silk 在云端为用户组织和优化网页,之后再下载到本地. 这样做的结果是, Amazon 能掌握用户在网络上的一举一动. 不仅仅包括在 Amazon.com 下的订单.

浏览器检测

- - JavaScript - Web前端 - ITeye博客
1.navigator 对象. 由于每个浏览器都具有自己独到的扩展, 所以在开发阶段来判断浏览器是一个非常重要的步骤. 虽然浏览器开发商在公共接口方面投入了很多精力, 努力的去支持最常用的公共功能;但在现实中,浏览器之间的差异,以及不同浏览器的“怪癖”却是非常多的,因此客户端检测除了是一种补救措施,更是一种行之有效的开发策略.

浏览器缓存机制

- Leo Pay - Learning Correcting Improving
Cache-Control 是最重要的规则. 这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令. 这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为. 缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令. cache-control 定义是:Cache-Control = "Cache-Control" ":" cache-directive.

浏览器进化史

- Hao Zeng - 爱范儿 · Beats of Bits
这张图非常直观,纵轴是浏览器存在的时间线,横轴代表使用此浏览器的用户数量. 出现在图片中的浏览器包括:Netscape、Opera、IE、Firefox、Safari 和 Chrome. Netscape:1994 年诞生,1995 年用户基数达到最大(2.x 版本). 1998 年 Netscape 被创业杀手 AOL 收购,再加上微软的冲击,逐渐走向衰败,2008 年彻底终结.

百度浏览器评测

- 溪梦 - 月光博客
  百度今年在客户端方面的动作不断,目前已经推出了百度输入法、百度电脑管家、百度安全卫士、百度影音,百度压缩软件,而现在,百度客户端领域的重要产品百度浏览器已经进入了测试阶段,不久后将正式对外发布.   百度在其公关稿里称:“百度浏览器具备以下几点特性:第一,整合百度平台的热门应用,使用户一键触达;第二,采用沙箱安全技术将用户电脑与病毒木马隔离;第三,融合百度搜索技术的智能地址栏;第四,界面设计简洁易操作……百度希望通过浏览器的改进,推动互联网的良性发展,吸引更多的用户来使用互联网,增进使用的频度与时长,最终推动搜索这个媒体平台的发展和巩固.

最新浏览器评测

- John - Solidot
Tom's Hardware发布了最新的浏览器评测,在Windows 7 和Mac OS X Lion系统上分别对Chrome 13、Firefox 6、IE9、Opera 11.50和Safari 5.1执行了近40项测试. 测试结果是:Windows 7上的排名依次是Chrome 13、Firefox 6、IE9、Opera 11.50,Safari 5.1;Mac OS X上是Safari,Chrome,Opera,Firefox.

appcache的浏览器限制

- - 前端观察
appcache(之前的manifest)是html5的一个特性,用来实现浏览器端的资源缓存,是webapp的一个重要工具. 虽然大部分浏览器的最新版都它提供了支持,但是各浏览器的实现却有些差异,我们来看一下~~. 数据来源: browserscope. 可以看出,桌面端的浏览器除了IE10都没有限制,移动端的基本都有各种限制.