Как определить отрицательный ответ пользователя для геолокации

При использовании API геолокации navigator.geolocation.getCurrentPosition() как бороться с отрицательным ответом?

В нем говорится, что вторая функция обратного вызова вызывается при возникновении ошибки. Однако, когда пользователь не хочет раскрыть свое местоположение, отменив запрос о том, что функция никогда не запускается.

Кажется, что getCurrentPosition() ждет ответа бесконечно. (по крайней мере, в Firefox 4)

Как узнать, когда пользователь нажимает на отмену (или нет и т.д.)

Любые идеи?

Ответ 1

См. править ниже
Вы правы, обработчик ошибок должен срабатывать, когда пользователь отклоняет запрос местоположения. Объект ошибки, переданный в обработчик ошибок, должен содержать код ошибки и сообщение, сообщающее, что пользователь отклонил запрос. Однако я не вижу этого в FF4 при выборе опции Not Now в диалоговом окне запроса местоположения.

В Chrome API/обратные вызовы работают точно так, как ожидалось, но в Chrome нет третьего варианта.

РЕДАКТИРОВАТЬ
Ahhh хорошо, я нашел немного причуды в поведении этого в FF4. В обычном режиме (не для частного просмотра) пользователю будут представлены 3 варианта:

  • Всегда делиться
  • Никогда не сообщайте
  • Не сейчас

Never share корректно запускает обработчик ошибок, но Not Now нет.


Что это значит и как его обрабатывать?

Ну, похоже, если пользователь нажимает Not Now, вы не получите ответа. Поэтому я бы установил тайм-аут, который проверяет флаг, который будет установлен одним из обработчиков. Если этот флаг не установлен (что означает, что обработчики не срабатывали в течение отведенного времени), вы можете сделать одну из двух вещей:

  • Предположим, что пользователь отклонил запрос (хотя отказ был временным)
  • Вы можете снова запросить у пользователя разрешение (через тот же вызов), и пользователь снова будет представлен диалоговым окном.

Вариант 2, вероятно, является плохим юзабилити (и раздражает), поэтому, вероятно, лучше предположить, что они временно отказали и попросят их снова (вежливо!) в следующий раз, когда они посещают сайт.


Я создал JsFiddle, чтобы поиграть с этим API:

http://jsfiddle.net/7yYpn/11/