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.

craigmoliver
quelle
Akzeptierte Antwort geändert zu @endless
craigmoliver

Antworten:

39

Ohne Aufforderung an den Benutzer können Sie die neue Berechtigungs-API verwenden, die als solche verfügbar ist:

navigator.permissions.query({ name: 'geolocation' })
.then(console.log)

(funktioniert nur für Blink & Firefox)

http://caniuse.com/#feat=permissions-api

Endlos
quelle
7
@ trev9065 Blink ist die von Chrome verwendete Browser-Engine.
Felix Wienberg
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.

Cristian Sanchez
quelle
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
    }
}
Josh Leitzel
quelle
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.

Kamae
quelle
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:

Gibolt
quelle
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