80

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

私が試したこと:

Modernizr.geolocation
navigator.geolocation

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

4

6 に答える 6

140

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などで期待どおりに動作します

于 2011-05-23T02:57:41.857 に答える
53

ユーザーにプロンプ​​トを表示せずに、新しいパーミッションAPIを使用できます。これは次のように利用できます。

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

(BlinkとFirefoxでのみ機能します)

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

于 2016-06-10T13:58:40.313 に答える
18

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
    }
}
于 2011-05-23T03:07:55.833 に答える
6

インラインパーミッションチェック

可能な値はprompt、、、grantedおよびdenied

const permissionStatus = await navigator?.permissions?.query({name: 'geolocation'})
const hasPermission = permissionStatus?.state // Dynamic value

注:これには、async関数内にある必要があります

デフォルト値:

失敗したケースを処理する場合は?? myDefaultValue、2行目にオプションを追加します。

リンク:

于 2020-08-23T19:31:06.823 に答える
3

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:上記の回答にコメントするのに十分な評判がないので、新しい回答を作成する必要がありました。申し訳ありません。

于 2016-06-10T12:20:39.280 に答える
0

navigator.geolocation.watchPosition(function(position) {
    console.log("i'm tracking you!");
  },
  function(error) {
    if (error.code == error.PERMISSION_DENIED)
      console.log("you denied me :-(");
  });

于 2021-12-23T12:11:24.693 に答える