Javascriptでジオロケーションが拒否されているかどうかを確認する方法はありますか?
ジオロケーションが拒否された場合、手動エントリを表示するにはJavaScriptが必要です。
私が試したもの:
Modernizr.geolocation
navigator.geolocation
ユーザーが以前にジオロケーションへのアクセスを拒否したかどうかについても説明しません。
watchPosition
とgetCurrentPosition
は両方とも、エラーが発生したときに呼び出される2番目のコールバックを受け入れます。エラーコールバックは、エラーオブジェクトの引数を提供します。許可が拒否された場合、error.code
だろう error.PERMISSION_DENIED
(数値1
)。
詳細はこちら: https://developer.mozilla.org/en/Using_geolocation
例:
navigator.geolocation.watchPosition(function(position) {
console.log("i'm tracking you!");
},
function(error) {
if (error.code == error.PERMISSION_DENIED)
console.log("you denied me :-(");
});
編集:@Ian Devlinが指摘したように、Firefox(この投稿の時点で4.0.1)はこの動作をサポートしていないようです。 ChromeおよびおそらくSafariなど)で期待どおりに動作します。
新しいアクセス許可APIを使用すると、次のように利用できます。
navigator.permissions.query({ name: 'geolocation' })
.then(console.log)
(BlinkおよびFirefoxでのみ機能します)
W3C geolocation specification によると、getCurrentPosition
呼び出しは成功の場合はコールバックを、失敗の場合はコールバックを返すことができます。ただし、失敗コールバックは、発生したanyエラーに対して呼び出されます。 (1)許可が拒否されました。 (2)ポジションは利用できません。または(3)タイムアウト。 [ ソース:Mozilla ]
あなたの場合、ユーザーが明示的にアクセスを拒否している場合、特定のことを行います。 error.code
失敗コールバックの値、次のように:
navigator.geolocation.getCurrentPosition(successCallback,
errorCallback,
{
maximumAge: Infinity,
timeout:0
}
);
function errorCallback(error) {
if (error.code == error.PERMISSION_DENIED) {
// pop up dialog asking for location
}
}
Firefoxの問題を修正するのは本当に簡単です。私の場合、ジオロケーションと呼ばれるJavascriptのグローバル変数にジオロケーションを保存します。この変数を使用する前に、が未定義でないかどうかを確認します。そうでない場合は、IPから位置情報を取得します。
私のウェブサイトでは、最初に位置を取得するのに問題はありませんが、短い例では、速すぎて初めてジオロケーションを取得する時間がありませんでした。
とにかくこれは単なる例であり、それぞれの場合に適合させる必要があります。
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:上記の答えにコメントするほどの評判がないので、新しい答えを作成する必要がありました。ごめんなさい.