Gibt es eine Möglichkeit zu überprüfen, ob die Geolokalisierung mit Javascript abgelehnt wurde?


71

Ich benötige JavaScript, um einen manuellen Eintrag anzuzeigen, wenn die Geolokalisierung abgelehnt wird.

Was ich versucht habe:

Modernizr.geolocation
navigator.geolocation

Beides beschreibt nicht, ob der Benutzer zuvor den Zugriff auf die Geolokalisierung abgelehnt hat.


Akzeptierte Antwort geändert zu @endless
craigmoliver

Antworten:



132

watchPositionund getCurrentPositionbeide akzeptieren einen zweiten Rückruf, der aufgerufen wird, wenn ein Fehler auftritt. Der Fehlerrückruf liefert ein Argument für ein Fehlerobjekt. Für die verweigerte Erlaubnis error.codewäre error.PERMISSION_DENIED(numerischer Wert 1).

Lesen Sie hier mehr: https://developer.mozilla.org/en/Using_geolocation

Beispiel:

navigator.geolocation.watchPosition(function(position) {
    console.log("i'm tracking you!");
  },
  function(error) {
    if (error.code == error.PERMISSION_DENIED)
      console.log("you denied me :-(");
  });

EDIT: Wie @Ian Devlin betonte, scheint Firefox (4.0.1 zum Zeitpunkt dieses Beitrags) dieses Verhalten nicht zu unterstützen. Es funktioniert wie erwartet in Chrome und wahrscheinlich in Safari usw.


Der Fehler "Berechtigung verweigert" hängt nicht damit zusammen, dass die Person es abgelehnt hat, dem Browser das Sammeln ihrer Informationen zu erlauben.
Ian Devlin

1
@ Ian Devlin: Bist du sicher? Der W3C-Entwurf besagt, dass der Fehler PERMISSION_DENIED angezeigt wird, wenn "der Standorterfassungsprozess fehlgeschlagen ist, weil das Dokument nicht über die Berechtigung zur Verwendung der Geolocation-API verfügt." Ich konnte dieses Verhalten jedoch nicht in Firefox zum Laufen bringen - es funktioniert jedoch wie in Chrome erwartet (ich).
Cristian Sanchez

4
Nein, ich bin mir jetzt nicht sicher! :-) Ich habe irgendwo gelesen, dass Firefox dieses spezielle Bit nicht richtig implementiert.
Ian Devlin

2
Ab August 2013 unterstützt Firefox (23.0) dies immer noch nicht. Ich habe ewig gebraucht, um das herauszufinden.
Niro

6
Hallo ab 2018! Firefox 61 gibt den richtigen Fehlercode aus, wenn der Benutzer jetzt die Berechtigung verweigert, unabhängig von der Methode (nie gegen nicht jetzt).
Thunderblaster

15

Gemäß der W3C- Geolokalisierungsspezifikation kann Ihr getCurrentPositionAnruf einen Rückruf für den Erfolg und einen Rückruf für den Fehler zurückgeben. Ihr Fehlerrückruf wird jedoch für jeden aufgetretenen Fehler aufgerufen , der einer der folgenden ist: (0) unbekannt; (1) Erlaubnis verweigert; (2) Position nicht verfügbar; oder (3) Zeitüberschreitung. [ Quelle: Mozilla ]

In Ihrem Fall möchten Sie etwas Bestimmtes tun, wenn der Benutzer den Zugriff explizit verweigert hat. Sie können den error.codeWert in Ihrem Fehlerrückruf wie folgt überprüfen :

navigator.geolocation.getCurrentPosition(successCallback,
    errorCallback,
    {
        maximumAge: Infinity,
        timeout:0
    }
);

function errorCallback(error) {
    if (error.code == error.PERMISSION_DENIED) {
        // pop up dialog asking for location
    }
}

1
Hallo ab 2018! Firefox 61 gibt den richtigen Fehlercode aus, wenn der Benutzer jetzt die Berechtigung verweigert.
Thunderblaster

3

Das Firefox-Problem zu beheben ist wirklich einfach. In meinem Fall speichere ich die Geolokalisierung in einer globalen Variablen in Javascript, die als Geolokalisierung bezeichnet wird. Bevor ich diese Variable verwende, überprüfe ich nur, ob sie nicht undefiniert ist. Wenn ja, erhalte ich nur die Geolokalisierung von der IP.

Auf meiner Website habe ich kein Problem damit, den Standort beim ersten Mal zu ermitteln, aber ich habe in meinem kurzen Beispiel gesehen, dass es beim ersten Mal keine Zeit gibt, den Standort zu ermitteln, da dies zu schnell ist.

Auf jeden Fall ist dies nur ein Beispiel, Sie sollten es in jedem Fall anpassen.

var geolocation = {};
getLocation();

$(document).ready(function(){
    printLocation(); // First time, hasn't time to get the location
});

function printLocation(){
    if(typeof geolocation.lat === "undefined" || typeof geolocation.long === "undefined"){
        console.log("We cannot get the geolocation (too fast? user/browser blocked it?)");
        // Get location by IP or simply do nothing
    }
    else{
        console.log("LATITUDE => "+geolocation.lat);
        console.log("LONGITUDE => "+geolocation.long);
    }
}

function getLocation() {
    // If the user allow us to get the location from the browser
    if(window.location.protocol == "https:" && navigator.geolocation)
        navigator.geolocation.getCurrentPosition(function(position){
            geolocation["lat"] = position.coords.latitude;
            geolocation["long"] = position.coords.longitude;
            printLocation(); // Second time, will be return the location correctly
        });
    else{
        // We cannot access to the geolocation
    }
}

PS: Ich habe nicht genug Ruf, um die obigen Antworten zu kommentieren, also musste ich eine neue Antwort erstellen. Das tut mir leid.


Hallo ab 2018! Firefox 61 gibt den richtigen Fehlercode aus, wenn der Benutzer jetzt die Berechtigung verweigert.
mraaroncruz

2

Inline-Berechtigungsprüfung

Mögliche Werte sind prompt, grantedunddenied

const permissionStatus = await navigator?.permissions?.query({name: 'geolocation'})
const hasPermission = permissionStatus?.state // Dynamic value

HINWEIS: Dies erfordert eine asyncFunktion

Standardwert:

Wenn Sie fehlgeschlagene Fälle behandeln möchten, fügen Sie eine Option hinzu ?? myDefaultValue der zweiten Zeile hinzu.

Links:


Ein bisschen Duplikat meiner eigenen Antwort von allen?
Endless

Gut, um die Verwendung von Inline Null CheckTipp zu zeigen: @ babel / Plugin-Vorschlag-optional-Verkettung
Igor Parra
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.