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.
javascript
html
w3c-geolocation
craigmoliver
quelle
quelle
Antworten:
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
quelle
watchPosition
undgetCurrentPosition
beide 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 Erlaubniserror.code
wäreerror.PERMISSION_DENIED
(numerischer Wert1
).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.
quelle
Gemäß der W3C- Geolokalisierungsspezifikation kann Ihr
getCurrentPosition
Anruf 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.code
Wert 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 } }
quelle
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.
quelle
Inline-Berechtigungsprüfung
Mögliche Werte sind
prompt
,granted
unddenied
const permissionStatus = await navigator?.permissions?.query({name: 'geolocation'}) const hasPermission = permissionStatus?.state // Dynamic value
Standardwert:
Wenn Sie fehlgeschlagene Fälle behandeln möchten, fügen Sie eine Option hinzu
?? myDefaultValue
der zweiten Zeile hinzu.Links:
?.
Inline Null Check - Lesen Sie mehr??
Fallback-Wert - Lesen Sie mehrawait
- Lesen Sie mehrquelle
?
Inline Null Check
Tipp zu zeigen: @ babel / Plugin-Vorschlag-optional-Verkettung