navigator.geolocation 和回调的回调

Posted

技术标签:

【中文标题】navigator.geolocation 和回调的回调【英文标题】:navigator.geolocation and callback of callback 【发布时间】:2015-05-17 08:27:49 【问题描述】:

最初,我有一个有效的代码:

function get_coords(callback) 

    //If html5 Geolocation Is Supported In This Browser
    if (navigator.geolocation)
    
         //Use HTML5 Geolocation API To Get Current Position
         navigator.geolocation.getCurrentPosition(function(position)
         
             //Get Latitude From Geolocation API
             var lat = position.coords.latitude;
             //Get Longitude From Geolocation API
             var lng = position.coords.longitude;
             callback(["coords", lat, lng]);
        ,
        function()
        
            callback(["geoloc_deactivated"]);
        );
    
    else
    
        callback(["geoloc_not_supported"]);
    


然后我想整合这个页面的解决方案: http://jsfiddle.net/CvSW4/

现在我的代码看起来像这样,它不再工作了(丢失在回调函数中):

function get_coords(callback)


    //If HTML5 Geolocation Is Supported In This Browser
    if (navigator.geolocation)
    
         //~ //Use HTML5 Geolocation API To Get Current Position
         navigator.geolocation.getCurrentPosition(
            successCallback,
            errorCallback_highAccuracy,
            maximumAge:600000, timeout:5000, enableHighAccuracy: true
        ); 
    
    else
    
        callback(["geoloc_not_supported"]);
    




function successCallback(position)

    var lat = position.coords.latitude;
    var lng = position.coords.longitude;
    position(["coords", lat, lng]);



function errorCallback_highAccuracy(callback_high_accuracy)

    if (error.code == error.TIMEOUT)
    
        // Attempt to get GPS loc timed out after 5 seconds, 
        // try low accuracy location
        navigator.geolocation.getCurrentPosition(
            successCallback, 
            errorCallback_lowAccuracy,
            maximumAge:600000, timeout:10000, enableHighAccuracy: false);
        return;
    

    if (error.code == 1)
        callback_high_accuracy(["perm_denied"])
    else if (error.code == 2)
        callback_high_accuracy(["pos_unavailable"])



function errorCallback_lowAccuracy(callback_low_accuracy)

    if (error.code == 1)
        callback_low_accuracy(["perm_denied"])
    else if (error.code == 2)
        callback_low_accuracy(["pos_unavailable"])
    else if (error.code == 3)
        callback_low_accuracy(["timeout"])

我得到错误:

Uncaught TypeError: object is not a functioncampaigns.min.js:37 successCallback

该行是:

position(["coords", lat, lng]);

如何使回调起作用?

【问题讨论】:

因为position 不是一个函数,而是传递给您的回调的位置对象...您没有阅读navigator.geolocation.getCurrentPosition 的文档吗? 我投票决定将此问题作为题外话结束,因为阅读友好手册可以轻松解决它。 我知道我得到了一个位置对象。但我不明白如何在回调中返回它! :( 你不退货。 API 是异步的。你不能向调用者返回任何东西;这就是使用回调的原因。 【参考方案1】:

我刚刚发现了如何让它发挥作用。

下面的代码使用他/她的 IP 地址(html5 功能)跟踪用户的位置。先用高精度5秒,万一出错,再用低精度10秒。

如果有错误,回调给出错误。如果地理位置有效,它会给出坐标。

function get_coords(callback) 

    //If HTML5 Geolocation Is Supported In This Browser
    if (navigator.geolocation)
    
         //Use HTML5 Geolocation API To Get Current Position
         // try high accuracy location for 5 seconds
         navigator.geolocation.getCurrentPosition(function(position)
         
             //Get Latitude From Geolocation API
             var lat = position.coords.latitude;
             //Get Longitude From Geolocation API
             var lng = position.coords.longitude;
             window.console&&console.log('coords : latitude=' + lat + ", longitude=" + lng);
             callback(["coords", lat, lng]);
        ,
        function(error)
        
            if (error.code == error.TIMEOUT)
            
                // Attempt to get GPS loc timed out after 5 seconds, 
                // try low accuracy location for 10 seconds
                navigator.geolocation.getCurrentPosition(function(position)
                
                    //Get Latitude From Geolocation API
                    var lat = position.coords.latitude;
                    //Get Longitude From Geolocation API
                    var lng = position.coords.longitude;
                    window.console&&console.log('coords : latitude=' + lat + ", longitude=" + lng);
                    callback(["coords", lat, lng]);
                ,
                function(error)
                
                    if (error.code == 1)
                    
                        window.console&&console.log('low accuracy geoloc_deactivated');
                        callback(["geoloc_deactivated"]);
                    
                    else if (error.code == 2)
                    
                        window.console&&console.log('low accuracy position_unavailable');
                        callback(["position_unavailable"]);
                    
                    else  if (error.code == 3)
                    
                        window.console&&console.log("low accuracy timeout");
                        callback(["timeout"]);
                    
                ,
                
                    maximumAge:600000,
                    timeout:10000,
                    enableHighAccuracy: false
                );
            
            if (error.code == 1)
            
                window.console&&console.log('high accuracy geoloc_deactivated');
                callback(["geoloc_deactivated"]);
            
            else if (error.code == 2)
            
                window.console&&console.log('high accuracy position_unavailable');
                callback(["position_unavailable"]);
            

        ,
        
            maximumAge:600000,
            timeout:5000,
            enableHighAccuracy: true
        );
    
    else
    
        window.console&&console.log("geoloc_not_supported");
        callback(["geoloc_not_supported"]);
    

代码使用方法:在你要跟踪用户的页面上,使用这个javascript调用:

get_coords(function(callback)

    if (callback[0]=="coords")
    
        user_coords=[callback[1],callback[2]];
        //do stuff
    
    else if(callback[0]=="position_unavailable")
    
        //do stuff
    
     else if(callback[0]=="timeout")
    
        //do stuff
    
    else if(callback[0]=="geoloc_deactivated")
    
        //do stuff
    
    else if(callback[0]=="geoloc_not_supported")
    
       //do stuff
    
);

【讨论】:

以上是关于navigator.geolocation 和回调的回调的主要内容,如果未能解决你的问题,请参考以下文章

html5-geolocation : navigator.geolocation.watchPosition 连续回调

navigator.geolocation.getCurrentPosition 的“无操作”回调在哪里?

navigator.geolocation.getCurrentPosition的回调没有在firefox中触发

如果未授予/拒绝访问,则 navigator.geolocation.getCurrentPosition 超时

Firefox 11 和 GeoLocation 拒绝回调

navigator.geolocation.getCurrentPosition 函数在本地范围外调用时导致未定义