2015-05-17 2 views
-1

Изначально у меня был код, который работал:navigator.geolocation и обратный вызов обратного вызова

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

Как сделать работу обратного вызова?

+0

, потому что 'position' не является функцией, но это положение объекта, передаваемая на ваш обратный вызов ... разве вы не читали документацию «navigator.geolocation.getCurrentPosition»? –

+0

Я голосую, чтобы закрыть этот вопрос как вне темы, потому что это было бы тривиально зафиксировано в «Рединг дружественное руководство». –

+0

Я знаю, что получаю объект позиции. Но я не понимаю, как вернуть его в обратном вызове! :( – rom

ответ

0

Я только что узнал, как заставить его работать.

Код ниже отслеживает местоположение пользователя с его/ее 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 
    } 
});