Con base en mi nueva comprensión de lo que está después, usted quiere algo como esto. (probado en Opera: - obras, Firefox 3.6 & Chrome 8 - no tanto (me necesitan más tiempo para depuración))
Escenario: página intenta obtener la ubicación ... pero el usuario ignora por completo el símbolo por lo tanto, no hay (aceptar o denegar) y dado que la solicitud de la ubicación nunca se envía, ¡tampoco hay tiempo de espera!
En función de esto, es posible que desee agregar su propia lógica para manejar este escenario. Por el bien de este ejemplo, voy a crear un prototipo de mi propio método de "envoltura". (Para el exigente - No estoy tolerar el uso de variables globales, etc. Yo sólo estaba tratando de conseguir algo de trabajo)
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});
El concepto es la creación de un temporizador primero (por defecto es de 30 segundos si no se establece). Si el usuario no hace nada antes de que el temporizador caduque, se invoca un timeoutCallback.
Notas:
- de algunos interfaz de usuario (por ejemplo, iPhone/iPad/iPod Safari) pueden hacer que el Permitir/Denegar modal pronta - por lo tanto el usuario no puede continuar hasta que realmente recoger algo (que había sugiero dejar estos usuarios solos y dejar que la UI predeterminada maneje las cosas
- Si el usuario permite la solicitud (tarde), el tiempo de espera puede dispararse antes de que la respuesta regrese - No creo que haya nada que puedas hacer al respecto
- El código anterior es solo un ejemplo ... necesita limpieza.
gran solución, supongo que llenará el caso "faltante" en esa API. Tal vez lo extiendan también, todavía es un borrador y podría ser una retroalimentación importante (no para obligar al usuario a aceptar en lugar de administrar su sitio web). Muchas gracias por dedicarle tiempo, intentaré crear una solución estable de navegador;) – Maertz
+1, solución muy elegante. – fmark
@tetra Por favor, publique de nuevo un enlace a su solución crossbrowser estable cuando esté listo. – fmark