Nach meinem neuen Verständnis dessen, was Sie wollen, wollen Sie so etwas wie das hier. (Getestet: in Opera - funktioniert, Firefox 3.6 & Chrome 8 - nicht so sehr (ich brauche mehr Zeit zum Debuggen))
Szenario: Die Seite versucht, den Standort abzufragen... aber der Benutzer ignoriert die Eingabeaufforderung vollständig, so dass es kein (Annehmen oder Ablehnen) gibt, und da die Anfrage nach dem Standort nie gesendet wird, gibt es auch kein Timeout!
Auf dieser Grundlage können Sie Ihre eigene Logik hinzufügen, um dieses Szenario zu behandeln. Für dieses Beispiel werde ich meine eigene "Wrapper"-Methode prototypisieren. (für die pingelig - ich bin nicht duldet mit Globals etc. Ich habe nur versucht, etwas zum Laufen zu bringen)
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});
Das Konzept besteht darin, zunächst einen Timer einzurichten (standardmäßig 30 Sekunden, falls nicht eingestellt). Wenn der Benutzer nichts unternimmt, bevor der Timer abläuft, wird ein TimeoutCallback aufgerufen.
Anmerkungen:
- Einige Benutzeroberflächen (z.B. iPhone/iPad/iPod Safari) können die Eingabeaufforderung zum Zulassen/Ablehnen modal machen - so kann der Benutzer nicht wirklich fortfahren, bis er etwas ausgewählt hat (ich würde vorschlagen, diese Benutzer in Ruhe zu lassen und die Standard-Benutzeroberfläche die Dinge erledigen zu lassen
- Wenn der Benutzer die Anfrage (spät) zulässt, kann die Zeitüberschreitung immer noch ausgelöst werden, bevor die Antwort zurückkommt - ich glaube nicht, dass Sie etwas dagegen tun können
- Der obige Code ist nur ein Beispiel... er muss bereinigt werden.