web-dev-qa-db-ja.com

Javascriptでジオロケーションが拒否されているかどうかを確認する方法はありますか?

ジオロケーションが拒否された場合、手動エントリを表示するにはJavaScriptが必要です。

私が試したもの:

Modernizr.geolocation
navigator.geolocation

ユーザーが以前にジオロケーションへのアクセスを拒否したかどうかについても説明しません。

54
craigmoliver

watchPositiongetCurrentPositionは両方とも、エラーが発生したときに呼び出される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など)で期待どおりに動作します。

111

新しいアクセス許可APIを使用すると、次のように利用できます。

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

(BlinkおよびFirefoxでのみ機能します)

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

23
Endless

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
    }
}
13
Josh Leitzel

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:上記の答えにコメントするほどの評判がないので、新しい答えを作成する必要がありました。ごめんなさい.

2
Kamae