[javascript] navigator.geolocation.getCurrentPosition이 때때로 작동하지 않는 경우가 있습니다

그래서 navigator.geolocation.getCurrentPosition jammy를 사용하는 아주 간단한 JS가 있습니다.

$(document).ready(function(){
  $("#business-locate, #people-locate").click(function() {
    navigator.geolocation.getCurrentPosition(foundLocation, noLocation);
  });

  navigator.geolocation.getCurrentPosition(foundLocation, noLocation);

  function foundLocation(position) {
    var lat = position.coords.latitude;
    var lon = position.coords.longitude;
    var userLocation = lat + ', ' + lon;
    $("#business-current-location, #people-current-location").remove();
    $("#Near-Me")
      .watermark("Current Location")
      .after("<input type='hidden' name='business-current-location' id='business-current-location' value='"+userLocation+"' />");
    $("#people-Near-Me")
      .watermark("Current Location")
      .after("<input type='hidden' name='people-current-location' id='people-current-location' value='"+userLocation+"' />");
  }
  function noLocation() {
    $("#Near-Me").watermark("Could not find location");
    $("#people-Near-Me").watermark("Could not find location");
  }
})//end DocReady

기본적으로 여기서 발생하는 것은 현재 위치를 얻는 것입니다. 획득 한 경우 두 개의 “워터 마크”가 “현재 위치”라는 두 필드에 배치되고 두 개의 숨겨진 필드가 위도의 데이터로 값으로 생성됩니다 (제거됨). 처음에는 중복되지 않습니다.) 같은 기능을하는 클릭 기능이있는 두 개의 버튼도 있습니다. 불행히도, 세 번째 정도마다 작동합니다. 여기에 무슨 문제가 있습니까 ???



답변

나는 가지고있다 정확히 같은 문제를, 그리고 그것에 대해 온라인으로 거의 정보를 찾을 수 없습니다. 이 책에는 아무것도 없습니다. 마지막으로 stackoverflow 에서이 냉정한 쿼리를 발견했으며 여기에서 계정을 설정하는 데 필요한 마지막 자극이었습니다.

그리고 나는 부분적인 대답을 가지고 있지만, 완전히 완전한 것은 아닙니다.

우선, getCurrentPosition 의 기본 시간 제한무한대 (!)입니다. 즉 , getCurrentPosition이 백엔드 어딘가에 중단되면 오류 처리기가 호출되지 않습니다 .

시간 초과가 발생하지 않도록하려면 getCurrentPosition 호출에 선택적 세 번째 매개 변수를 추가하십시오. 예를 들어, 사용자가 10 초 이상 기다리지 않고 발생하는 상황을 파악하려면 다음을 사용하십시오.

navigator.geolocation.getCurrentPosition(successCallback,errorCallback,{timeout:10000});

둘째, 상황에 따라 상당히 다른 신뢰성을 경험했습니다. 여기서는 정확도가 좋지 않지만 1 ~ 2 초 내에 콜백을받습니다.

그러나 직장에서 나는 행동에있어 매우 기이 한 변화를 경험합니다 : 지리적 위치는 일부 컴퓨터에서는 항상 작동하지만 (IE는 물론 예외), 다른 컴퓨터는 크롬과 사파리에서만 작동하지만 파이어 폭스 (gecko 문제)에서는 작동하지 않습니다. 실패-패턴이 시간마다 시간마다 바뀝니다. 때로는 ‘운이 좋은’컴퓨터가 있고 때로는 그렇지 않습니다. 아마도 보름달에 염소를 도살하는 것이 도움이 될 것입니까?

나는 이것을 추측 할 수 없었지만, 백엔드 인프라 가이 기능을 추진하는 다양한 궁호 서적과 웹 사이트에 광고것보다 더 고르지 않다고 생각 합니다. 오류 처리기가 제대로 작동하려면 이 기능의 결함과 시간 초과 설정의 중요성 에 대해 조금 더 직설적이기를 바랍니다 .

나는 오늘날 학생들 에게이 물건을 가르치려고 노력했으며 내 컴퓨터 (프로젝터 및 여러 개의 대형 화면)가 조용히 실패한 당황스러운 상황을 보였지만 약 80 %의 학생들이 거의 즉시 결과를 얻었습니다 ( 정확히 동일한 무선 네트워크). 학생들이 오타 및 기타 기포를 만들거나 내 PC가 고장 일 때 이러한 문제를 해결하는 것은 매우 어렵습니다.

어쨌든, 이것이 여러분 중 일부를 돕기를 바랍니다. 위생 검사 감사합니다!


답변

이것은 내가이 문제를 해결하는 해키 방법입니다. 적어도 현재 모든 브라우저에서 작동합니다 (Windows에서는 Mac이 없습니다).

if (navigator.geolocation) {
    var location_timeout = setTimeout("geolocFail()", 10000);

    navigator.geolocation.getCurrentPosition(function(position) {
        clearTimeout(location_timeout);

        var lat = position.coords.latitude;
        var lng = position.coords.longitude;

        geocodeLatLng(lat, lng);
    }, function(error) {
        clearTimeout(location_timeout);
        geolocFail();
    });
} else {
    // Fallback for no geolocation
    geolocFail();
}

Firefox에서 닫기를 클릭하거나 아니오를 선택하거나 공유 안함 옵션을 선택한 경우에도 작동합니다.

어색하지만 작동합니다.


답변

이것은 매번 나를 위해 작동합니다.

navigator.geolocation.getCurrentPosition(getCoor, errorCoor, {maximumAge:60000, timeout:5000, enableHighAccuracy:true});

매우 정확하지는 않지만. 재미있는 것은 동일한 장치에서이를 실행하면 약 100 미터 (매번) 떨어져 나옵니다. 그러나 Google지도로 가면 내 위치를 정확하게 찾습니다. 따라서 enableHighAccuracy : true가 일관되게 작동하는 데 도움이되지만 더 정확하게 만드는 것은 아닙니다 …


답변

이것은 이미 오래된 질문이지만 모든 답변으로 문제가 해결되지 않았으므로 마지막으로 찾은 질문을 추가하십시오. 그것은 해킹 냄새가 나고 (하나입니다) 항상 내 상황에서 작동합니다. 당신의 상황에서도 희망하십시오.

//Dummy one, which will result in a working next statement.
navigator.geolocation.getCurrentPosition(function () {}, function () {}, {});
//The working next statement.
navigator.geolocation.getCurrentPosition(function (position) {
    //Your code here
}, function (e) {
    //Your error handling here
}, {
    enableHighAccuracy: true
});


답변

여기 사람들과 마찬가지로, 이것은 FF와 Safari가 아닌 Chrome (안정적, 개발 및 카나리아)에서 완벽하게 작동합니다. 내 iPhone 및 iPad에서도 완벽하게 작동합니다 (Safari!). 이것은이 기능의 새로운 기능 때문일 수 있습니다 (즉, 버그). 나는 지금 이것에 거의 일주일을 보내고 그 브라우저에서 작동하도록 할 수 없습니다.

내가 찾은 것은 다음과 같습니다.

getCurrentPosition을 처음 호출하면 완벽하게 작동합니다. 후속 호출은 절대 반환되지 않습니다. 즉, successCallback 또는 errorCallback 함수를 실행하지 않습니다. 내 요점을 증명하기 위해 전화에 몇 가지 직위 옵션을 추가했습니다.

 navigator.geolocation.getCurrentPosition(successCallback, errorCallback,  {timeout: 10000});

그리고 매번 (첫 번째 성공적인 호출 후) 시간 초과됩니다. 나는 maximumAge로 그것을 고칠 수 있다고 생각했지만 그것이 작동한다고 가정하기 때문에 작동하지 않는 것 같습니다.

navigator.geolocation.getCurrentPosition(successCallback, errorCallback,  {maximumAge:60000, timeout: 2000});

이렇게하면 60 초 이내에 getCurrentPosition 함수를 호출하면 실제로 호출 할 수 없지만이를 무시합니다 (그러나 실제로는 페이지를 새로 고침하여 두 번째 호출을 트리거하기 때문에 발생할 수 있습니다. 이는 지속적인 총 호출인지 확실하지 않습니다)

btw, 구글의 예제 조차도이 브라우저에서 실패하여 이것이 실제로 브라우저 버그라고 생각하고, 시도하고, Safari에서 두 번로드하면 두 번째로 작동하지 않습니다.

아무도 이것에 대한 해결책을 찾으면 알려주십시오 🙂

건배.


답변

기본적으로 시간 초과가 없기 때문에 오류 메시지가 표시되지 않습니다 (적어도 생각합니다). 나에게만 firefox와 같은 문제가 있었지만 firefox는 항상 시간 초과를 제공합니다. 이와 같이 시간 초과를 직접 설정할 수 있습니다.

내 기능은 크롬에서 훌륭하게 작동하지만 파이어 폭스에서 매번 시간 초과가 발생합니다.

    navigator.geolocation.getCurrentPosition(
        function(position) {
            //do succes handling
        },
        function errorCallback(error) {
            //do error handling
        },
        {
            timeout:5000
        }
    );

오류를주의 깊게 관찰하는 것이 좋습니다. 모든 것을 기대하십시오. 모든 것을위한 백업 계획을 세우십시오. Google 지리적 위치와 네비게이터 위치 정보가 모두 실패하는 경우 데이터베이스의 일부 기본값 또는 값을 직접 사용합니다.


답변

2017 년에도 여전히 주목할만한 결과가 나오고 있으며 이론에 따르면 API 설명서에 따르면 “보안 컨텍스트에서”즉, HTTPS를 통해서만 호출을 사용할 수 있다고합니다. 개발 환경 (localhost http)에서 결과를 얻는 데 문제가 있으며 이것이 바로 그 이유라고 생각합니다.