Как поступить, когда пользователь закрывает приглашение «Физическое местоположение» в Firefox и Chrome? - PullRequest
8 голосов
/ 10 февраля 2012

Я использую объект Geolocation и getCurrentPosition ().

Видели ли вы, что каждый раз, когда вы используете getCurrentPosition, Firefox и Chrome выводят эти сообщения?

Chrome:

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

Firefox:

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.');
            }

У меня есть некоторые проблемы с этим, любая помощь, пожалуйста?

Этот вопрос связан с этим постом: Как вызвать функцию, когда пользователь разрешает или запрещает доступ к «Физическому расположению»?

1 Ответ

15 голосов
/ 10 февраля 2012

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.

    // ...
}
...