navigator.geolocation.getCienPocation đôi khi không hoạt động


220

Vì vậy, tôi có một chút khá đơn giản về JS bằng cách sử dụng jammy navigator.geolocation.getCienPocation.

$(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

Về cơ bản những gì đang xảy ra ở đây là chúng ta có được vị trí hiện tại, nếu có được, hai "hình mờ" được đặt trong hai trường có tên "Vị trí hiện tại" và hai trường ẩn được tạo với dữ liệu dài hạn là giá trị của chúng (chúng đã bị xóa ban đầu để chúng không bị trùng lặp mỗi lần). Ngoài ra còn có hai nút có chức năng nhấp được gắn với chúng làm cùng một việc. Thật không may, cứ sau 3 lần, nó lại hoạt động. Có vấn đề gì ở đây ???


Có thể xác định các chức năng trước khi bạn sử dụng chúng.
tcooc

4
@digitalFresh, điều đó không quan trọng vì trình phân tích cú pháp JS tìm kiếm các khai báo đó trước khi mã bắt đầu thực thi
antimatter15

Có thể việc sử dụng jQuery trong đó đang gây ra vấn đề?
th associatedweb

1
Chính xác thì ý bạn là gì khi bạn nói nó không hoạt động đôi khi? Là noLocationchức năng đang được gọi? Nếu vậy, bạn có thể thêm một errortham số vào noLocation()và sau đó error.codeerror.messagecó thể giúp bạn gỡ lỗi. Nó cũng có thể giúp chúng tôi biết bạn đang sử dụng trình duyệt nào và nếu bạn thấy cùng một vấn đề trong các trình duyệt khác nhau.
npdoty

Tôi có nghĩa là đôi khi nó mang lại cho tôi lat-lon, và đôi khi nó không. khi nó không hoạt động, nó thậm chí không ném thông báo "không thể tìm thấy vị trí" để bit noLocation cũng không kích hoạt.
thociociweb

Câu trả lời:


342

Tôi đã có chính xác cùng một vấn đề, và hầu như không tìm thấy thông tin trực tuyến nào về nó. Không có gì trong tất cả các cuốn sách. Cuối cùng tôi đã tìm thấy truy vấn tỉnh táo này trên stackoverflow và (ha!) Đó là động lực cuối cùng tôi cần để thiết lập một tài khoản ở đây.

Và tôi có một câu trả lời một phần, nhưng than ôi không phải là một câu trả lời hoàn chỉnh.

Trước hết, nhận ra rằng thời gian chờ mặc định cho getCienPocation là vô hạn (!). Điều đó có nghĩa là trình xử lý lỗi của bạn sẽ không bao giờ được gọi nếu getCienPocation bị treo ở đâu đó ở mặt sau.

Để đảm bảo rằng bạn có thời gian chờ, hãy thêm tham số thứ ba tùy chọn vào cuộc gọi của bạn vào getCienPocation, ví dụ, nếu bạn muốn người dùng đợi không quá 10 giây trước khi đưa ra gợi ý cho họ về những gì đang xảy ra, hãy sử dụng:

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

Thứ hai, tôi đã trải nghiệm độ tin cậy khá khác nhau trong các bối cảnh khác nhau. Ở nhà này, tôi nhận được một cuộc gọi lại trong vòng một hoặc hai giây, mặc dù độ chính xác rất kém.

Tuy nhiên, tại nơi làm việc, tôi gặp phải các biến thể khá kỳ lạ trong hành vi: Định vị địa lý hoạt động trên một số máy tính mọi lúc (ngoại trừ IE), một số khác chỉ hoạt động trong chrome và safari chứ không phải firefox (vấn đề tắc kè?), Sau đó, các hoạt động khác thất bại - và mô hình thay đổi từ giờ này sang giờ khác, từ ngày này sang ngày khác. Đôi khi bạn có một máy tính 'may mắn', đôi khi không. Có lẽ giết mổ dê vào lúc trăng tròn sẽ giúp?

Tôi đã không thể hiểu được điều này, nhưng tôi nghi ngờ rằng cơ sở hạ tầng phía sau không đồng đều hơn so với quảng cáo trong các sách và trang web gung-ho khác nhau đang thúc đẩy tính năng này. Tôi thực sự mong muốn rằng họ sẽ thẳng thắn hơn một chút về tính năng hoàn hảo này và mức độ quan trọng của cài đặt thời gian chờ đó, nếu bạn muốn trình xử lý lỗi của bạn hoạt động đúng .

Tôi đã cố gắng dạy những thứ này cho các sinh viên ngày hôm nay, và đã gặp phải tình huống xấu hổ khi máy tính của tôi (trên máy chiếu và một số màn hình lớn) đã âm thầm thất bại, trong khi khoảng 80% sinh viên đã nhận được kết quả gần như ngay lập tức (sử dụng chính xác cùng một mạng không dây). Rất khó để giải quyết những vấn đề này khi học sinh của tôi cũng mắc lỗi chính tả và các lỗi khác, và khi máy tính của tôi cũng bị lỗi.

Dù sao, tôi hy vọng điều này sẽ giúp một số bạn. Cảm ơn đã kiểm tra sự tỉnh táo!


5
Thông tin chi tiết tốt, cảm ơn! Tôi đang gặp vấn đề tương tự, nhưng chỉ trên Firefox 3.6.13. Chrome dường như khá đáng tin cậy.
Felipe Lima

Tương tự ở đây, và tham số MaximumAge dường như cũng không đáng tin cậy. Cảm ơn vì bài đăng.
Richard

1
Rất vui, tôi đã gặp vấn đề tương tự (trên Samsung Galaxy Tab, 10.1, chạy Android 4.0.3 ), một khi tôi sử dụng thông số hết thời gian ở trên, tôi đã có thể xử lý vấn đề này.
mlo55

9
Điều quan trọng là phải hiểu những gì các timeouttùy chọn trong getCurrentPosition()thực sự là thời gian. Không đến lúc người dùng cho phép hoặc từ chối yêu cầu định vị địa lý, nhưng mạng được phép mất bao lâu để trả lại vị trí sau khi được phép. Nếu người dùng không trả lời yêu cầu định vị địa lý, trình xử lý lỗi sẽ không bao giờ được gọi. Vì vậy, bạn cần thời gian chờ thứ hai như trong câu trả lời @ xiaohouzi79.
François

2
giết mổ dê lúc trăng tròn sẽ giúp gì? LOL
Asim KT

66

Đây là cách hack mà tôi đang khắc phục điều này, ít nhất là nó hoạt động trong tất cả các trình duyệt hiện tại (trên Windows, tôi không sở hữu máy 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();
}

Điều này cũng sẽ hoạt động nếu ai đó nhấp vào đóng hoặc chọn không hoặc chọn tùy chọn Không chia sẻ trên Firefox.

Clunky, nhưng nó hoạt động.


1
+1 Nhưng bạn đang thiếu geolocFail();trình xử lý lỗi và bộ getcodeLatLng();mã hóa địa lý.
kaiser

Ngọt ngào - bộ hẹn giờ hoạt động rất đẹp nếu ai đó chọn không chia sẻ địa điểm. Một số trình duyệt không chơi tốt khi người dùng làm điều này. Giải pháp hẹn giờ này hoạt động rất tốt trên Plugin Store Locator Plus WP của tôi!
Lance Cleveland

2
@sajith - Không chắc chắn nếu giải pháp này hiện đã lỗi thời với các trình duyệt FF gần đây. Nó hoạt động vào thời điểm tôi cung cấp giải pháp vì tôi cần nó cho một trang web tôi đang làm việc. Bạn đã thử chưa?
đi vào

xin lỗi, nó đã hoạt động. Nhưng tôi không thể tìm thấy cái gì làm cho nó hoạt động. Sau khi đóng và mở lại FF nó hoạt động ........ thanx cho giải pháp của bạn ....
sajith

1
Bạn không nên sử dụng chức năng bên trong chuỗi. Ác ma làm việc ở đó một cách bất đắc dĩ. setTimeout ("geolocFail ()", 10000);
atilkan

42

Điều này làm việc cho tôi mọi lúc:

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

Mặc dù nó không chính xác lắm. Điều buồn cười là trên cùng một thiết bị nếu tôi chạy nó, nó sẽ khiến tôi mất khoảng 100 mét (mỗi lần), nhưng nếu tôi truy cập vào bản đồ của google thì nó sẽ tìm thấy vị trí của tôi một cách chính xác. Vì vậy, mặc dù tôi nghĩ enableHighAccuracy: true giúp nó hoạt động ổn định, nhưng dường như nó không làm cho nó chính xác hơn ...


Điều này đã ngăn firefox từ chối yêu cầu và gửi lại một đối tượng hết thời gian chờ.
tony

Cách đó 100 mét là tháp di động mà tôi gắn bó. Vì vậy, nó trả lại vị trí của tháp di động, không phải điện thoại của tôi. Có thể chính xác hơn nếu tôi ở bên ngoài để gps hoạt động.
K'shin Gendron 13/2/2015

9
Nó tiếp tục khiến bạn mất vài mét vì bạn có thiết bị đo tối đaAge được đặt thành 60 giây. Vì vậy, nó đặt vị trí của bạn, nơi bạn đang ở 60 giây trước. Đặt MaximumAge thành 10 giây hoặc ít hơn (MaximumAge: 10000) và thử lại.
Robert Smith

Tôi đã sử dụng getCienPocation này trong Bộ giải quyết góc mà trả về một mức có thể quan sát được. Bộ giải quyết chỉ hoàn thành không liên tục. Thêm các tùy chọn sau: {MaximumAge: 60000, thời gian chờ: 5000, enableHighAccuracy: true} khiến nó hoạt động mọi lúc !!!
Moutono

17

Đây đã là một câu hỏi cũ, nhưng tất cả các câu trả lời không giải quyết được vấn đề của tôi, vì vậy hãy thêm câu hỏi cuối cùng tôi đã tìm thấy. Nó có mùi giống như một hack (và nó là một), nhưng hoạt động luôn trong tình huống của tôi. Hy vọng trong tình huống của bạn quá.

//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
});

3
Đó là vụ hack mạnh nhất và tôi không biết bạn thậm chí đã nghĩ thế nào để thử điều đó, nhưng nó giải quyết vấn đề của tôi. Cảm ơn bạn!
Brett Gregson

Tôi đã sử dụng điều này bản thân mình trong một số trường hợp. Nỗ lực thứ hai luôn hoạt động tốt hơn theo kinh nghiệm của tôi
Nico Westerdale

13

Cũng giống như mọi người ở đây, điều này hoạt động hoàn hảo btw trong Chrome (ổn định, dev và canary) không chỉ trong FF và Safari. Nó cũng hoạt động hoàn hảo trên iPhone và iPad của tôi (Safari!). Điều này có thể là do tính mới tương đối của tính năng này (tức là nó là một lỗi). Bây giờ tôi dành gần một tuần cho việc này và tôi không thể làm cho nó hoạt động trên các trình duyệt đó

Đây là những gì tôi tìm thấy:

Lần đầu tiên bạn gọi getCienPocation, nó hoạt động hoàn hảo. Bất kỳ cuộc gọi tiếp theo nào cũng không bao giờ trả lại, tức là nó không kích hoạt các chức năng thành công hoặc phản hồi lỗi. Tôi đã thêm một vài tùy chọn vị trí vào cuộc gọi của mình để chứng minh quan điểm của mình:

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

và nó hết thời gian mỗi lần (sau cuộc gọi thành công đầu tiên). Tôi nghĩ rằng tôi có thể sửa nó với MaximumAge, nhưng điều đó dường như không hoạt động vì nó cũng có thể hoạt động:

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

điều này sẽ ngăn việc thực sự gọi hàm getCienPocation nếu bạn gọi nó trong vòng 60 giây, nhưng nó bỏ qua điều này (tuy nhiên, điều này có thể là do tôi thực sự làm mới trang của mình để kích hoạt cuộc gọi thứ hai, không chắc đây có phải là cuộc gọi liên tục không)

Tuy nhiên, ngay cả các ví dụ của google cũng thất bại trên các trình duyệt này khiến tôi tin rằng đây thực sự là lỗi trình duyệt, hãy thử, tải hai lần trong Safari và nó sẽ không hoạt động lần thứ hai.

Nếu bất cứ ai tìm thấy giải pháp cho việc này, xin vui lòng cho tôi biết :-)

Chúc mừng.


Tôi có vấn đề chính xác như của bạn, nó hoạt động cho cuộc gọi đầu tiên nhưng không bao giờ là cuộc gọi tiếp theo, nếu có ai tìm ra giải pháp tôi sẽ rất can thiệp ... @ xiaohouzi79 giải pháp của bạn kết thúc mỗi lần (ngoại trừ cuộc gọi đầu tiên) trong geolocFail ( )
Adriano Rizzo

8

Bạn không nhận được thông báo lỗi vì mặc định nó không có thời gian chờ (Ít nhất là tôi nghĩ). Tôi đã có cùng một vấn đề với firefox đối với tôi firefox luôn luôn có thời gian chờ. Bạn có thể tự đặt thời gian chờ như thế này.

Chức năng của tôi hoạt động rất tốt trong chrome nhưng tôi luôn có thời gian chờ trong firefox.

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

Tôi khuyên bạn nên xem lỗi của bạn một cách cẩn thận. Được mong đợi cho tất cả mọi thứ. Có một kế hoạch dự phòng cho tất cả mọi thứ. Tôi sử dụng một số giá trị hoặc giá trị mặc định từ cơ sở dữ liệu của mình trong trường hợp cả định vị địa lý và điều hướng địa lý của google đều thất bại.


7
chỉ là một FYI, MaximumAge đề cập đến tuổi của dữ liệu vị trí trong bộ đệm, đặt nó thành vô cùng đảm bảo bạn sẽ có được một phiên bản được lưu trong bộ nhớ cache. Đặt nó thành 0 buộc thiết bị lấy lại vị trí.
Porco

hạ cấp vì MaximumAge: Infinity sẽ làm bạn khó chịu như được chỉ ra ở trên, điều đó có nghĩa là bắt buộc sử dụng giá trị được lưu trong bộ nhớ cache.
n13

7

Tôi vẫn nhận được kết quả đáng chú ý trong năm 2017 và tôi có một lý thuyết: tài liệu API nói rằng cuộc gọi hiện chỉ khả dụng "trong một bối cảnh an toàn", tức là qua HTTPS. Tôi gặp sự cố khi nhận kết quả trong môi trường phát triển của mình (http trên localhost) và tôi tin rằng đây là lý do.


Hmm thú vị. Ngay cả trong năm 2020, nó vẫn không ổn định với HTTPS trên localhost!
NitroStoutPlz

6

Tôi sẽ đăng nó ở đây trong trường hợp nó hữu ích cho bất cứ ai

Trên iOS Safari, các cuộc gọi navigator.geolocation.getCurrentPositionsẽ hết thời gian nếu tôi có navigator.geolocation.watchPositionchức năng hoạt động .

Bắt đầu và dừng watchPositionsử dụng đúng cách clearWatch() như được mô tả ở đây, đã hoạt động: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPocation


1
Cảm ơn bạn rất nhiều. Đây là giải pháp cho tôi.
Tần Trịnh Tuyền

5

đây là giải pháp của tôi nhờ đóng cửa:

  function geoloc(success, fail){
    var is_echo = false;
    if(navigator && navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(
        function(pos) {
          if (is_echo){ return; }
          is_echo = true;
          success(pos.coords.latitude,pos.coords.longitude);
        }, 
        function() {
          if (is_echo){ return; }
          is_echo = true;
          fail();
        }
      );
    } else {
      fail();
    }
  }

  function success(lat, lng){
    alert(lat + " , " + lng);
  }
  function fail(){
    alert("failed");
  }

  geoloc(success, fail);

Điều này làm việc cho tôi trong phản ứng bản địa navigator && navigator.geolocation
Ashish Singh Rawat

5

Vì vậy, tôi đã chạy vào điều tương tự. Tôi đã thử giải pháp hết thời gian mà hiệu quả nhưng không đáng tin cậy. Tôi thấy rằng nếu bạn chỉ gọi nó hai lần thì vị trí được làm mới đúng cách

function getLocation(callback)
{   
    if(navigator.geolocation)
    {
        navigator.geolocation.getCurrentPosition(function(position)
        {
            navigator.geolocation.getCurrentPosition(callback, function(){},{maximumAge:0, timeout:10000});
        },function(){}, {maximumAge:0, timeout:10000});
    }
    return true;
}

điều này tất nhiên là chậm hơn một chút nhưng tôi đã không có nó cho tôi vị trí sai một lần. Tôi đã có nó đạt đến thời gian chờ một vài lần và không trả lại bất cứ điều gì nhưng sau đó nó hoạt động rất tốt. Tôi biết điều này vẫn còn một chút hack và tôi đang mong chờ ai đó tìm ra giải pháp thực sự.

Hoặc nếu bạn muốn chắc chắn rằng nó sẽ tiếp tục cố gắng cho đến khi bạn muốn từ bỏ, bạn có thể thử một cái gì đó như thế này.

//example
$(document).ready(function(){
    getLocation(function(position){
        //do something cool with position
        console.log(position);
    });
});


var GPSTimeout = 10; //init global var NOTE: I noticed that 10 gives me the quickest result but play around with this number to your own liking


//function to be called where you want the location with the callback(position)
function getLocation(callback)
{   
    if(navigator.geolocation)
    {
        var clickedTime = (new Date()).getTime(); //get the current time
        GPSTimeout = 10; //reset the timeout just in case you call it more then once
        ensurePosition(callback, clickedTime); //call recursive function to get position
    }
    return true;
}

//recursive position function
function ensurePosition(callback, timestamp)
{
    if(GPSTimeout < 6000)//set at what point you want to just give up
    {
        //call the geolocation function
        navigator.geolocation.getCurrentPosition(
            function(position) //on success
        {
                //if the timestamp that is returned minus the time that was set when called is greater then 0 the position is up to date
            if(position.timestamp - timestamp >= 0)
                {
                    GPSTimeout = 10; //reset timeout just in case
                    callback(position); //call the callback function you created
                }
                else //the gps that was returned is not current and needs to be refreshed
                {
                    GPSTimeout += GPSTimeout; //increase the timeout by itself n*2
                    ensurePosition(callback, timestamp); //call itself to refresh
                }
            },
            function() //error: gps failed so we will try again
            {
                GPSTimeout += GPSTimeout; //increase the timeout by itself n*2
                ensurePosition(callback, timestamp);//call itself to try again
            },
            {maximumAge:0, timeout:GPSTimeout}
        )
    }       
}

Tôi có thể có một số lỗi chính tả và một số lỗi chính tả ở đây nhưng tôi hy vọng bạn có ý tưởng. Hãy cho tôi biết nếu có ai có câu hỏi hoặc nếu ai đó tìm thấy điều gì đó tốt hơn.


4

Đối với bất kỳ ai làm việc trên ứng dụng iPhone ...

Nếu mã của bạn đang chạy trong UIWebView trên iOS 9+, thì bạn phải đặt NSLocationWhenInUseUsageDescriptiontrong phạm vi ứng dụng của mình.

Nếu bạn không đặt thì getCurrentPositionsẽ không bao giờ gọi lại và người dùng sẽ không bao giờ được nhắc.


3

Tôi thấy rằng cách này không hiệu quả

navigator.geolocation.getCurrentPosition(function() {...}, function(err) {...}, {});

Nhưng

cách này hoạt động hoàn hảo

function storeCoordinates(position) {
    console.log(position.coords.latitude, position.coords.longitude);
}    

function errorHandler() {...}

navigator.geolocation.getCurrentPosition(storeCoordinates, errorHandler, { enableHighAccuracy: true, timeout: 20000, maximumAge: 0 });

4
Sự khác biệt giữa cả hai là gì?
Pardeep Jain

Hàm ẩn danh so với tên một
1

sự khác biệt thực sự lớn. cảm ơn bạn, điều này cũng không hoạt động
withoutOne

3

Câu trả lời của @ brennanyoung là tuyệt vời, nhưng nếu bạn đang tự hỏi phải làm gì trong trường hợp thất bại, bạn có thể sử dụng API định vị địa lý IP như https://ipinfo.io (là dịch vụ của tôi). Đây là một ví dụ:

function do_something(coords) {
    // Do something with the coords here
    // eg. show the user on a map, or customize
    // the site contents somehow
}

navigator.geolocation.getCurrentPosition(function(position) { 
    do_something(position.coords);
    },
    function(failure) {
        $.getJSON('https://ipinfo.io/geo', function(response) { 
        var loc = response.loc.split(',');
        var coords = {
            latitude: loc[0],
            longitude: loc[1]
        };
        do_something(coords);
        });  
    };
});

Xem https://ipinfo.io/developers/replaces-getciverseposeition để biết thêm chi tiết.


Đây là liên kết được sửa cho điều này: ipinfo.io/developers/replaces-getciverseposeition
peater

5
Khủng khiếp. Độ chính xác là giống như một 5-7 dặm từ vị trí thực sự khi ở Mỹ và Canada và 100 dặm khi ở đâu đó tại Nga.
ekashking

1
Đối với rất nhiều ứng dụng tốt - và tốt hơn nhiều so với việc không biết vị trí của nó là gì.
Ben Dowling

Điều này không hoạt động ở bất cứ đâu. Mọi yêu cầu đều nhận được kinh độ và vĩ độ là sai
không có

Bạn có ý gì sai? Bạn có một số ví dụ?
Ben Dowling

2

Tôi đã gặp vấn đề tương tự và đã xem xét khả năng các trình duyệt có giới hạn về tần suất getCienPocation có thể được gọi. Có vẻ như tôi thường có thể có được một vị trí, nhưng nếu tôi làm mới trang ngay lập tức thì nó sẽ hết thời gian. Nếu tôi chờ một chút, tôi thường có thể lấy lại vị trí. Điều này thường xảy ra với FF. Trong Chrome và Safari, tôi chưa nhận thấy thời gian getCienPocation sắp hết. Chỉ là một suy nghĩ ...

Mặc dù tôi không thể tìm thấy bất kỳ tài liệu nào để hỗ trợ điều này, nhưng đó là kết luận mà tôi đã đưa ra sau nhiều thử nghiệm. Có lẽ ai đó đã có một số thông tin về điều đó?


Đó là một điểm hay. Thời gian chờ / thất bại của tôi dường như xảy ra chủ yếu khi tôi đang kiểm tra và liên tục truy vấn dữ liệu định vị địa lý. Tôi lo lắng muốn biết liệu đây có phải là kết quả của một lỗi hay, như bạn đề xuất, có thể là do thiết kế.
Jamie

Tôi chưa thấy trường hợp nào trình duyệt giới hạn số lượng cuộc gọi đến các dịch vụ định vị. Bạn có thường xuyên truy vấn không?
Nico Westerdale

2

Cuối cùng tôi đã tìm thấy một phiên bản hoạt động cho firefox, chrome & điều hướng mặc định trong Android (chỉ thử nghiệm 4.2):

function getGeoLocation() {
        var options = null;
        if (navigator.geolocation) {
            if (browserChrome) //set this var looking for Chrome un user-agent header
                options={enableHighAccuracy: false, maximumAge: 15000, timeout: 30000};
            else
                options={maximumAge:Infinity, timeout:0};
            navigator.geolocation.getCurrentPosition(getGeoLocationCallback,
                    getGeoLocationErrorCallback,
                   options);
        }
    }

2

Tham số thứ hai được truyền vào Geolocation.getCurrentPosition()là hàm bạn muốn xử lý bất kỳ lỗi định vị địa lý nào. Chính hàm xử lý lỗi nhận được một PositionErrorđối tượng với các chi tiết về lý do tại sao nỗ lực định vị địa lý không thành công. Tôi khuyên bạn nên xuất lỗi cho bảng điều khiển nếu bạn có bất kỳ vấn đề nào:

var positionOptions = { timeout: 10000 };
navigator.geolocation.getCurrentPosition(updateLocation, errorHandler, positionOptions);
function updateLocation(position) {
  // The geolocation succeeded, and the position is available
}
function errorHandler(positionError) {
  if (window.console) {
    console.log(positionError);
  }
}

Thực hiện điều này trong mã của tôi đã tiết lộ thông báo "Nhà cung cấp vị trí mạng tại ' https://www.googleapis.com/ ': Mã lỗi được trả về 400". Hóa ra Google Chrome sử dụng Google API để có được vị trí trên các thiết bị không tích hợp GPS (ví dụ: hầu hết các máy tính để bàn). Google trả về một vĩ độ / kinh độ gần đúng dựa trên địa chỉ IP của người dùng. Tuy nhiên , trong các bản dựng dành cho nhà phát triển của Chrome (như Chromium trên Ubuntu) không có khóa truy cập API có trong bản dựng trình duyệt. Điều này khiến yêu cầu API thất bại trong âm thầm. Xem Vấn đề về Chromium 179686: Định vị địa lý đưa ra lỗi 403 để biết chi tiết.


1

Tôi có vấn đề này trong Mozilla. Tất cả thời gian: Lỗi: Không biết lỗi nhận vị trí .

Bây giờ tôi đang sử dụng 47 Mozilla. Tôi đã thử tất cả mọi thứ, nhưng tất cả thời gian vấn đề này. NHƯNG sau đó tôi mở about: config trong thanh bổ sung của mình, truy cập Geo.wifi.ui và thay đổi giá trị của nó thành " https://location.service.mozilla.com/v1/geolocate?key=test ". làm!

Nếu bạn đã hết thời gian nhận vị trí , hãy thử tăng giá trị thời gian chờ:

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0       
};
navigator.geolocation.getCurrentPosition(success, error, options);

1

Có thể là một ý tưởng tốt để sử dụng dịch vụ định vị địa lý địa chỉ IP làm phương pháp dự phòng khi getCurrentPositionthất bại. Ví dụ với api https://ip-api.io của chúng tôi

$.getJSON("http://ip-api.io/json/",
    function(result) {
        console.log(result);
    });

1

Trong trường hợp của chúng tôi, nó luôn hoạt động lần đầu tiên nhưng chạy lại chức năng hơn 3-4 lần, nó không thành công.

Cách giải quyết đơn giản: Lưu trữ giá trị của nó trong LocalStorage.

Trước:

navigator.geolocation.getCurrentPosition((position) => {
  let val = results[0].address_components[2].long_name;
  doSthWithVal(val);      
}, (error) => { });

Sau:

if(localStorage.getItem('getCurrentPosition') !== null) {
  doSthWithVal(localStorage.getItem('getCurrentPosition'));
}
else {
  navigator.geolocation.getCurrentPosition((position) => {
      let val = results[0].address_components[2].long_name;
      localStorage.setItem('getCurrentPosition',val);
      doSthWithVal(val);      
  }, (error) => { });
}

0

Gần đây tôi đã nhận thấy vấn đề này và tôi không chắc nó xảy ra như thế nào nhưng nó sẽ xuất hiện đôi khi firefox bị kẹt trên một cái gì đó được tải trong bộ đệm. Sau khi xóa bộ nhớ cache và khởi động lại firefox, nó sẽ hoạt động trở lại.


0

Thư viện này thêm tùy chọn mong muốnAccuracy và maxWait cho các cuộc gọi định vị địa lý, có nghĩa là nó sẽ tiếp tục cố gắng để có được một vị trí cho đến khi độ chính xác nằm trong một phạm vi được chỉ định.


0

Cảm ơn tất cả mọi người cho đầu vào của họ, điều này đã giúp tôi.

Ngoài việc phải sử dụng watchPocation () thay vì getCienPocation (), tôi cũng thấy rằng tôi cần phải chuyển cuộc gọi từ trong document. Yet () sang phần đầu.


0

Điều này xảy ra với tôi khi sử dụng chế độ thiết kế đáp ứng của Firefox. Đã có một báo cáo lỗi được nộp. Hiện tại, chỉ không sử dụng chế độ thiết kế đáp ứng trong khi sử dụng API vị trí địa lý.


0

Có thể nó sẽ giúp một số một, Trên Android tôi đã có cùng một vấn đề nhưng tôi figured it out bằng cách sử dụng setTimeout bên trong document.ready để nó làm việc cho tôi thứ hai bạn phải tăng thời gian chờ chỉ trong trường hợp nếu người dùng cho phép vị trí của mình sau vài giây, vì vậy tôi giữ nó cho 60000 mili giây (1 phút) cho phép chức năng thành công của tôi gọi nếu người dùng nhấp vào nút cho phép trong vòng 1 phút.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.