9

Geolocation オブジェクトと getCurrentPosition() を使用しています。

getCurrentPosition Firefox と Chrome を使用するたびに、これらのメッセージが表示されるのを見たことがありますか?

クロム:

Example.com wants to track your physical location [allow] [deny] [ X close ]

ファイアフォックス:

Example.com wants to know your location [Share Location] [Don't Share] [Close]

私の質問は次のとおりです。ユーザーが場所のオプションを「許可」または「拒否」せず、代わりにプロンプ​​トを閉じた場合の処理​​方法は?

この JAVASCRIPT コードがありますが、ユーザーがプロンプトを閉じると機能しません。

            if (navigator.geolocation) {
                navigator.geolocation.getCurrentPosition(
                    onSuccess,
                    onError,
                    {
                        //enableHighAccuracy: true,
                        timeout: 5000
                        //maximumAge: 120000
                    }
                );
                    alert("holaaaa");
            } else {
                alert('Geolocation not supported.');
            }

私はそれでいくつかの問題を抱えています。何か助けてください。

この質問は、この投稿に関連しています: ユーザーが「物理的な場所」へのアクセスを許可または拒否するときに関数を呼び出す方法は?

4

1 に答える 1

16

仕様では、ユーザーが ([拒否] ボタンをクリックするのではなく) 単に許可の要求を却下した場合にコールバックを実行する必要があるかどうかについて、実際にはかなり静かです。

getCurrentPositionとの両方について、位置情報を共有する許可をユーザーから最初に取得することなくwatchPosition、実装で を呼び出してはなりません。さらに、実装では、上記の または のいずれかの手順successCallbackを実行する前に、場所を共有するためのユーザーの許可を常に取得する必要があります。ユーザーが許可を与える場合、上記のように適切なコールバックを呼び出す必要があります。ユーザーが許可を拒否した場合、上記の手順で他のエラーが発生したかどうかに関係なく、 (存在する場合) を code で呼び出す必要があります。ユーザー許可の取得に費やされる時間は、パラメーターの属性によってカバーされる期間に含まれてはなりません。のgetCurrentPositionwatchPositionerrorCallbackPERMISSION_DENIEDtimeoutPositionOptionstimeout属性は、位置取得操作にのみ適用する必要があります。

パーミッションリクエストを却下することは、の観点からリクエストを拒否することと同じだと思いますgetCurrentPosition。拒否をクリックすることは明示的ですが、却下 (X をクリックすること) は暗黙的です。

機能上の違いは、[拒否] ボタンをクリックすると、(1) 現在の要求が拒否され、(2) サイトがブラックリストに登録され、ユーザーがサイトの場所を再度共有するように求められることはありません。単純にリクエストを却下しても、現在のリクエストが拒否されたことを意味するだけです。将来のリクエスト (将来のBROWSINGCONTEXT では、ページがリロードされた後) は再びプロンプトを表示します。

errorCallback私の意見では、Chrome、Firefox、および IE の現在の動作はバグです。ユーザーが X をクリックして許可要求を無視getCurrentLocationすると、3 つすべてが何もしません。現在の BROWSINGCONTEXT は警告なしで失敗します。(Opera 11.52 は「正しく」動作します。これは、許可要求 UI に許可/拒否ボタンしかなく、X がないためです。)

Mozilla には、現在の動作が正しいと彼らが言うバグと、関連する新しいバグオープン バグがあります。Chromuim はまた、現在の動作は正しいと述べています。IE にはバグがあります (登録が必要です)が、奇妙なことに、Microsoft はそれを再現不可能としてクローズしました。

これは、W3C ワーキング グループが取り組む必要のある問題です。このページは、ユーザーが場所の許可リクエストを拒否したことに対応できる必要があります。これは、完全に拒否されたか、このセッションで [X] をクリックして単に拒否されたかにかかわらずです。


この状況に対処するために今すぐ実際にできる唯一のことは、独自のタイムアウトを設定することです。ジオロケーション リクエストでタイムアウトを設定し、エラー タイムアウトをそれよりも長く設定します (ユーザーがリクエストに反応する時間を確保するため)。

if (navigator.geolocation) {
    var etimeout = setTimout(onError, 10000);
    navigator.geolocation.getCurrentPosition(onSuccess, onError, {timeout:5000});
}
function onSuccess(pos) {
    clearTimeout(etimeout);
    // ...
}
function onError(err) {
    clearTimeout(etimeout);
    // Note `err` will actually be undefined if this is the result of our timeout
    // and anything you do here should be undone by `onSuccess` (in case the user
    // took longer than 5 seconds to approve the request; for that reason, you
    // shouldn't display any modal UI from here.

    // ...
}
于 2012-02-10T00:25:50.877 に答える