Основываясь на моем новом понимании того, что вы после этого, вы хотите что-то вроде этого. (Испытано: в Opera - работа, Firefox 3.6 & Chrome 8 - не так много (мне нужно больше времени для отладки))
Сценарий: страницы пытается получить расположение ... но пользователь игнорирует приглашение полностью таким образом, нет (принять или отклонить), и поскольку запрос на местоположение никогда не отправляется, также нет тайм-аута!
Исходя из этого, вы можете добавить свою собственную логику для обработки этого сценария. Ради этого примера я собираюсь прототипировать собственный метод «обертки». (Для придирчивы - я не попустительство с помощью глобалам и т.д. Я просто пытался получить что-то работать)
navigator.geolocation.requestCurrentPosition = function(successCB, errorCB, timeoutCB, timeoutThreshold, options){
var successHandler = successCB;
var errorHandler = errorCB;
window.geolocationTimeoutHandler = function(){
timeoutCB();
}
if(typeof(geolocationRequestTimeoutHandler) != 'undefined'){
clearTimeout(window['geolocationRequestTimeoutHandler']);//clear any previous timers
}
var timeout = timeoutThreshold || 30000;//30 seconds
window['geolocationRequestTimeoutHandler'] = setTimeout('geolocationTimeoutHandler()', timeout);//set timeout handler
navigator.geolocation.getCurrentPosition(
function(position){
clearTimeout(window['geolocationRequestTimeoutHandler']);
successHandler(position);
},
function(error){
clearTimeout(window['geolocationRequestTimeoutHandler']);
errorHandler(error);
},
options
);
};
function timeoutCallback(){
alert('Hi there! we are trying to locate you but you have not answered the security question yet.\n\nPlease choose "Share My Location" to enable us to find you.');
}
function successCallback(position){
var msg = '';
msg += 'Success! you are at: ';
msg += '\nLatitude: ' + position.coords.latitude;
msg += '\nLongitude: ' + position.coords.longitude;
msg += '\nAltitude: ' + position.coords.altitude;
msg += '\nAccuracy: ' + position.coords.accuracy;
msg += '\nHeading: ' + position.coords.heading;
msg += '\nSpeed: ' + position.coords.speed;
alert(msg);
}
function errorCallback(error){
if(error.PERMISSION_DENIED){
alert("User denied access!");
} else if(error.POSITION_UNAVAILABLE){
alert("You must be hiding in Area 51!");
} else if(error.TIMEOUT){
alert("hmmm we timed out trying to find where you are hiding!");
}
}
navigator.geolocation.requestCurrentPosition(successCallback, errorCallback, timeoutCallback, 7000, {maximumAge:10000, timeout:0});
Концепция является настройка таймера первого (по умолчанию 30 секунд, если не установлен). Если пользователь ничего не делает до истечения таймера, вызывается тайм-аут Callback.
Примечание:
- Some UI (например iPhone/IPad/IPod Safari) может сделать Разрешить/Запретить быструю модальность - таким образом, пользователь не может реально продолжать, пока они не выбрать что-то (я бы предлагайте оставить этих пользователей в покое и позволить стандартным пользовательским интерфейсам обрабатывать вещи
- Если пользователь разрешает запрос (позднее), тайм-аут может по-прежнему срабатывать до того, как ответ вернется - я не думаю, что вы можете что-то сделать с этим
- Код, приведенный выше, является примером только ... он нуждается в очистке.
отличное решение, я думаю, что он заполнит «недостающий» случай в этом API. Возможно, они также расширят его, его еще черновик и может быть важной обратной связью (чтобы не заставить пользователя принимать скорее управление вашим сайтом). Большое спасибо за то, что потратили на это время, старайтесь создать стабильное решение для кроссбраузеров;) – Maertz
+1, очень элегантное решение. – fmark
@tetra Пожалуйста, отправьте ссылку на свое стабильное решение для кроссбраузеров, когда это будет сделано. – fmark