spec на самом деле довольно тихо говорит о том, ДОЛЖЕН ли выполняться обратный вызов, если пользователь просто отклоняет запрос на разрешение (в отличие от нажатия кнопки Запретить):
И для getCurrentPosition
, и для watchPosition
реализация никогда не должна вызывать successCallback
без предварительного получения разрешения от пользователя на передачу местоположения. Кроме того, реализация всегда должна получать разрешение пользователя на совместное использование местоположения перед выполнением любого из шагов getCurrentPosition
или watchPosition
, описанных выше. Если пользователь предоставляет разрешение, соответствующий обратный вызов должен быть вызван, как описано выше. Если пользователь отказывает в разрешении, errorCallback
(если имеется) должен вызываться с кодом PERMISSION_DENIED
, независимо от любых других ошибок, обнаруженных на вышеуказанных этапах. Время, затраченное на получение разрешения пользователя, не должно включаться в период, охватываемый атрибутом timeout
параметра PositionOptions
. Атрибут timeout
должен применяться только к операции определения местоположения.
Я бы сказал, что отклонение запроса на разрешение равнозначно отклонению запроса с точки зрения getCurrentPosition
. Нажатие Deny является явным, в то время как увольнение (нажатие на X) неявно.
Функционально отличие состоит в том, что нажатие кнопки «Запретить» означает, что (1) текущий запрос отклонен, и (2) сайт занесен в черный список, и пользователю никогда не будет предложено снова указать местоположение для сайта; простое отклонение запроса означает только то, что текущий запрос отклонен & ndash; будущие запросы (в будущем BROWSINGCONTEXT s & mdash; после перезагрузки страницы) будут запрашиваться снова.
На мой взгляд, текущее поведение Chrome, Firefox и IE является ошибкой & ndash; все три ничего не делают, если пользователь отклоняет запрос на разрешение, нажимая X. errorCallback
следует вызывать, если запрос на разрешение геолокации отклонен, потому что любые дальнейшие вызовы getCurrentLocation
в текущем BROWSINGCONTEXT будут молча завершаться неудачей. (Opera 11.52 работает «правильно», потому что в пользовательском интерфейсе запроса на разрешение есть только кнопки «Разрешить / Запретить» - нет X.)
У Mozilla есть ошибка , где говорят, что текущее поведение корректно, и более новая ошибка открытая ошибка, которая актуальна; Chromuim также говорит текущее поведение правильное. В IE ошибка (требуется регистрация) , но, как ни странно, Microsoft закрыла ее как невоспроизводимую.
Это действительно то, что необходимо рассмотреть Рабочей группе W3C. Страница должна иметь возможность реагировать на отклонение пользователем запроса разрешения на местоположение & ndash; окончательно отказано или просто отклонено для этого сеанса, нажав 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.
// ...
}