Dựa trên sự hiểu biết mới của tôi về những gì bạn đang sau, bạn muốn một cái gì đó như thế này. (Tested: trong Opera - công trình, Firefox 3.6 & Chrome 8 - không quá nhiều (tôi cần thêm thời gian để debug))
Kịch bản: Trang cố gắng để có được vị trí ... nhưng người dùng bỏ qua dấu nhắc hoàn toàn do đó không có (chấp nhận hoặc từ chối) và vì yêu cầu vị trí không bao giờ được gửi đi, cũng không có thời gian chờ!
Dựa trên điều này, bạn có thể muốn thêm logic của riêng mình để xử lý trường hợp này. Vì mục đích của ví dụ này, tôi sẽ thử nghiệm phương thức "wrapper" của riêng mình. (Đối với kén cá chọn canh - Tôi không túng sử dụng globals vv Tôi chỉ cố gắng để có được một cái gì đó để làm việc)
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});
Khái niệm này là để thiết lập một bộ đếm thời gian đầu tiên (mặc định là 30 giây nếu không được thiết lập). Nếu người dùng không làm bất cứ điều gì trước khi bộ đếm thời gian hết hạn, một timeoutCallback được gọi.
Ghi chú:
- Một số giao diện người dùng (ví dụ như iPhone/iPad/iPod Safari) có thể làm cho Allow/Deny phương thức nhanh chóng - do đó người dùng có thể không thực sự tiếp tục cho đến khi họ chọn một cái gì đó (tôi muốn đề xuất chỉ để những người dùng này một mình và để giao diện người dùng mặc định xử lý mọi thứ
- Nếu người dùng Cho phép yêu cầu (muộn), thời gian chờ vẫn có thể kích hoạt trước khi phản hồi trở lại - Tôi không nghĩ bạn có thể làm gì
- Mã trên chỉ là một ví dụ ... nó cần làm sạch.
giải pháp tuyệt vời, tôi đoán rằng sẽ điền vào trường hợp "thiếu" trong API đó. Có lẽ họ cũng sẽ mở rộng nó, nó vẫn là một dự thảo và có thể là một phản hồi quan trọng (không buộc người dùng chấp nhận thay vì quản lý trang web của bạn). Cảm ơn rất nhiều vì đã dành thời gian cho nó, bệnh cố gắng tạo ra một giải pháp crossbrowser ổn định;) – Maertz
1, giải pháp rất thanh lịch. – fmark
@tetra Vui lòng đăng lại liên kết đến giải pháp crossbrowser ổn định của bạn khi hoàn thành. – fmark