Исходя из моего нового понимания того, что вы ищете, вы хотите что-то вроде этого.
(Проверено: в 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 секунд, если не установлен). Если пользователь ничего не делает до истечения таймера, вызывается timeoutCallback.
Примечания:
- Некоторые пользовательские интерфейсы (например, iPhone / iPad / iPod Safari) могут сделать приглашение «Разрешить / Запретить» модальным - таким образом, пользователь не сможет продолжить, пока не выберет что-то (я бы предложил оставить этих пользователей в покое и оставить пользовательский интерфейс по умолчанию). обращаться с вещами
- Если пользователь разрешает запрос (с опозданием), тайм-аут все еще может сработать до возвращения ответа - я не думаю, что с этим можно что-либо сделать
- Код выше приведен только в качестве примера ... он нуждается в очистке.