ジオロケーションが拒否された場合に手動エントリを表示するには、JavaScriptが必要です。
私が試したこと:
Modernizr.geolocation
navigator.geolocation
また、ユーザーが以前にジオロケーションへのアクセスを拒否したかどうかについても説明していません。
ジオロケーションが拒否された場合に手動エントリを表示するには、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ジオロケーション仕様によれば、getCurrentPosition
呼び出しは成功の場合はコールバックを、失敗の場合はコールバックを返すことができます。ただし、発生したエラーに対して失敗コールバックが呼び出されます。これは次のいずれかです。(0)不明。(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
}
}
可能な値はprompt
、、、granted
およびdenied
const permissionStatus = await navigator?.permissions?.query({name: 'geolocation'})
const hasPermission = permissionStatus?.state // Dynamic value
注:これには、
async
関数内にある必要があります
失敗したケースを処理する場合は?? myDefaultValue
、2行目にオプションを追加します。
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:上記の回答にコメントするのに十分な評判がないので、新しい回答を作成する必要がありました。申し訳ありません。
navigator.geolocation.watchPosition(function(position) {
console.log("i'm tracking you!");
},
function(error) {
if (error.code == error.PERMISSION_DENIED)
console.log("you denied me :-(");
});