2012-03-16 24 views
10

Ho avuto un comportamento strano quando ho provato a testare la mia pagina web "navigator.geolocation.getCurrentPosition" . Ecco il mio risultato della prova e il codice:navigator.geolocation.getCurrentPosition fallisce sempre in chrome e firefox

il mio codice:

function detectLocation() 
{ 
    if (navigator.geolocation) 
    { 
    navigator.geolocation.getCurrentPosition(geocodePosition, onError, { timeout: 30000 }); 
    navigator.geolocation.watchPosition(watchGeocodePosition); 
    } 
    else 
    { 
    onError(); 
    } 
} 

questa funzione è stata eseguita quando "corpo" evento onload è stato chiamato. Avevo provato a cambiare il timeout a 10000 e 20000, ma ho comunque ottenuto lo stesso risultato. Ho anche permesso a crome e firefox di ottenere la mia posizione.

risultato:

  1. Utilizzando cromo (v 17.0.963.79 m), risultato sempre andato a onError funzione quando navigator.geolocation.getCurrentPosition è stato chiamato.
  2. Utilizzando Firefox (v 10.0.2), il risultato è sempre andato alla funzione onError quando è stato chiamato navigator.geolocation.getCurrentPosition.
  3. Utilizzando IE (v 9), il risultato è stato fantastico, ho ottenuto la mia posizione corrente.

qualcuno può aiutarmi in questa strana situazione? Non avevo proprio alcuna idea di risolvere questo problema e avevo fretta per la scadenza del mio progetto. Grazie in anticipo.

EDIT: Per questo paio di giorni ho avuto qualche progresso, il codice di errore è 2 con un messaggio "del fornitore di rete a 'https://maps.googleapis.com/maps/api/browserlocation/ json? browser = chromium & sensor = true ': Response was malformed ". Ancora irrisolto, qualcuno sa come risolvere questo?

+0

sembra insolito per me che la vostra istruzione if non ha alcun vero banco di prova. Mi aspetterei di vedere qualcosa come se (navigator.geolocation! = Null) o alcuni di questi. – Terry

+0

@Terry Sembra che la dichiarazione "se" non sia stata un problema, questo strano risultato è rimasto lì anche se l'ho modificato in quello che hai suggerito. Sai perché solo IE può recuperare una posizione corretta? in realtà ero un indonesiano e la mia posizione attuale era in East Java. –

+0

potresti trovare differenze a seconda che tu sia in LAN o wifi, questo influisce sul tuo risultato? – ajayel

risposta

16

Ho simulato questo problema e ho scoperto che le funzioni di callback di successo venivano chiamate solo quando la pagina html era ospitata su un server Web e non quando veniva aperta da un filesystem.

Per test ho aperto il file direttamente dall'unità C: e il callback non ha funzionato e quindi ha ospitato il file su Internet Information Services (IIS) e le callback hanno funzionato.

<html> 
<body onload="detectLocation()"> 
<!-- This html must be hosted on a server for navigator.geolocation callbacks to work --> 

<div id="status"></div> 

<script type="text/javascript"> 
function detectLocation() 
{ 
    log("detectLocation() starting"); 
    if (navigator.geolocation) 
    { 
    log("navigator.geolocation is supported"); 
    navigator.geolocation.getCurrentPosition(geocodePosition, onError, { timeout: 30000 }); 
    navigator.geolocation.watchPosition(watchGeocodePosition); 
    } 
    else 
    { 
    log("navigator.geolocation not supported"); 
    } 
} 
function geocodePosition(){ 
    log("geocodePosition() starting"); 
} 

function watchGeocodePosition(){ 
    log("watchGeocodePosition() starting"); 
} 

function onError(error){ 
    log("error " + error.code); 
} 
function log(msg){ 
    document.getElementById("status").innerHTML = new Date() + " :: " + msg + "<br/>" + document.getElementById("status").innerHTML; 
} 
</script> 
</body> 
</html> 
+3

Devo aggiungere una cosa, anche localhost non ha funzionato. Solo un adeguato hosting pubblico può funzionare con "navigator.geolocation". Inoltre, se il tuo server di dominio dedicato non è impostato correttamente dal tuo ISP, navigator.geolocation non funzionerà. Sembra che questo sia lo script lato client, ma dipende molto dalle impostazioni del server o del dominio. –

+0

ora i principali browser richiedono che i siti utilizzino https: // altrimenti l'accesso a getCurrentPosition e watchPosition verrà negato – ajayel

11

Ho anche ricevuto questo messaggio:

messaggio: "Rete fornitore di posizione al 'https://www.googleapis.com/': restituito il codice di errore 404.", il codice: 2

potrei risolverlo accendendo la mia scheda di rete WiFi

+0

Bizarrely, questo ha funzionato per me ... – onions

+0

Confermato! Stavo lavorando su un laptop usando un modem cellulare e ho ottenuto lo stesso errore 404. Riaccendo la mia scheda WiFi ho risolto l'errore. Dispari. – Todd

+0

Strano, ha funzionato per me! –

5

ho avuto lo stesso problema. Il browser Chrome non ha restituito una posizione sul timeout di 30000 millisecondi. Anche Firefox non ha restituito una posizione. Ho aggiunto l'opzione enableHighAccuracy e l'ho impostato su false ma non è cambiato nulla (false è l'opzione predefinita). Quando lo cambio in vero, la geolocalizzazione ha iniziato a funzionare!
Questo è il mio codice finale,

if (navigator.geolocation) { 
    navigator.geolocation.getCurrentPosition(
      function(position) { 
       // Get current cordinates. 
       positionCords = {"lat": position.coords.latitude, "lng": position.coords.longitude}; 
      }, 
      function(error) { 
       // On error code.. 
      }, 
      {timeout: 30000, enableHighAccuracy: true, maximumAge: 75000} 
    ); 
} 
+0

TI AMO UOMO !!! – sean

-3

Questo stamperà la latitudine e la longitudine della posizione

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Insert title here</title> 
    <script> 
    function getLocation() { 
     if (navigator.geolocation) { 
      navigator.geolocation.getCurrentPosition(showPosition); 
     } else { 
      alert("Geolocation is not supported by this browser."); 
     } 

    } 
    function showPosition(position) { 
     document.getElementById('idLatitude').value = position.coords.latitude; 
     document.getElementById('idLongitude').value = position.coords.longitude; 

    } 
    </script> 

</head> 
<body onload="getLocation()"> 
<form action="HelloWorld" method="post"> 
    <input id="idLatitude" type="text" name="strLatitude"> 
    <input id="idLongitude" type="text" name="strLongitude"> 

</form> 
</body> 
</html> 

enter image description here

0

So che questo è argomento vecchio ma di recente ho avuto questo errore anche:

message: "Network location provider at 'https://www.googleapis.com/' : Returned error code 404.", code: 2

La correzione è quello di ottenere la chiave API per Google Maps e utilizzarlo nel codice

<script src='https://maps.googleapis.com/maps/api/jscallback=initMap &signed_in=true&key=YOUR-API-KEY' async defer></script>

Qui è possibile ottenere API KEY: https://developers.google.com/maps/documentation/javascript/get-api-key#key

+0

Questo non ha funzionato per me. Continuo a ricevere il messaggio di errore "Provider di posizione di rete su" https://www.googleapis.com/ ": codice di errore restituito 404." "in alcune situazioni. Immagino che tu sia stato fortunato e che sia stata una coincidenza. Alcune volte l'errore era '400' invece di' 404'. –

0

ho avuto lo stesso problema e la soluzione era di aumentare la durata del timeout come rete mobile è più lenta della rete cablata

{timeout: 30000, enableHighAccuracy: true, maximumAge: 75000} 

insieme all'abilitazione della posizione cellulare ing

Nelle Impostazioni dispositivo attivare l'opzione "Wifi e posizionamento cellulare".

0

Devi essere utilizzando https, non http

Problemi correlati