navigator.geolocation.getCurrentPosition บางครั้งใช้งานไม่ได้


220

ดังนั้นฉันมี JS ที่ค่อนข้างง่ายโดยใช้ navigator.geolocation.getCurrentPosition jammy

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

โดยทั่วไปสิ่งที่เกิดขึ้นที่นี่คือเราได้รับตำแหน่งปัจจุบันหากได้รับสอง "ลายน้ำ" ถูกวางไว้ในสองสาขาที่กล่าวว่า "ตำแหน่งปัจจุบัน" และสองเขตข้อมูลที่ซ่อนอยู่จะถูกสร้างขึ้นด้วยข้อมูล lat-long เป็นค่าของพวกเขา ในตอนแรกพวกเขาจะไม่ถูกทำซ้ำทุกครั้ง) นอกจากนี้ยังมีปุ่มสองปุ่มที่มีฟังก์ชั่นคลิกเชื่อมโยงกับปุ่มที่ทำสิ่งเดียวกัน น่าเสียดายที่ทุก ๆ ครั้งที่สามทำงานได้ มีปัญหาอะไรที่นี่ ???


อาจกำหนดฟังก์ชั่นก่อนที่จะใช้
tcooc

4
@digitalFresh ที่ไม่ควรทำเพราะตัวแยกวิเคราะห์ JS มองหาการประกาศเหล่านั้นก่อนที่รหัสจะเริ่มดำเนินการ
antimatter15

เป็นไปได้ไหมว่าการใช้ jQuery ในที่นั่นทำให้เกิดปัญหา?
theassociatedweb

1
คุณหมายความว่าอย่างไรเมื่อคุณพูดว่าบางครั้งมันใช้ไม่ได้ มีnoLocationการเรียกใช้ฟังก์ชันหรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถเพิ่มerrorพารามิเตอร์ลงในnoLocation()และจากนั้นerror.codeและerror.messageอาจช่วยคุณในการดีบัก นอกจากนี้ยังอาจช่วยให้เราทราบว่าคุณใช้เบราว์เซอร์ใดและหากคุณพบปัญหาเดียวกันในเบราว์เซอร์ที่แตกต่างกัน
npdoty

ฉันหมายความว่าบางครั้งมันให้ lat-lon และบางครั้งก็ไม่ เมื่อมันไม่ทำงานมันก็ไม่ได้โยนข้อความ "ไม่สามารถหาตำแหน่ง" ดังนั้นบิต noLocation ก็ไม่ได้ยิงเช่นกัน
theassociatedweb

คำตอบ:


342

ผมได้มีว่าปัญหาเดียวกันและหาเกือบไม่มีข้อมูลออนไลน์เกี่ยวกับเรื่องนี้ ไม่มีอะไรในหนังสือเลย ในที่สุดฉันก็พบข้อความค้นหาที่เงียบขรึมนี้ใน stackoverflow และ (ฮ่า!) มันเป็นแรงผลักดันขั้นสุดท้ายที่ฉันต้องการในการตั้งค่าบัญชีที่นี่

และฉันมีคำตอบบางส่วน แต่ไม่ใช่คำตอบที่สมบูรณ์

ก่อนอื่นให้ตระหนักว่าการหมดเวลาเริ่มต้นสำหรับ getCurrentPosition นั้นไม่มีที่สิ้นสุด (!) นั่นหมายความว่าตัวจัดการข้อผิดพลาดของคุณจะไม่ถูกเรียกใช้ถ้า getCurrentPosition แฮงค์ที่ด้านหลัง

เพื่อให้แน่ใจว่าคุณจะได้รับการหมดเวลาให้เพิ่มพารามิเตอร์ตัวเลือกที่สามลงในการโทรของคุณไปที่ getCurrentPosition ตัวอย่างเช่นหากคุณต้องการให้ผู้ใช้รอไม่เกิน 10 วินาทีก่อนที่จะบอกสิ่งที่เกิดขึ้นให้ใช้:

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

ประการที่สองฉันมีประสบการณ์ความน่าเชื่อถือแตกต่างกันมากในบริบทที่แตกต่างกัน ที่นี่ฉันได้รับการติดต่อกลับภายในหนึ่งหรือสองวินาทีแม้ว่าความแม่นยำจะแย่

ที่ทำงาน แต่ฉันพบกับการเปลี่ยนแปลงที่แปลกประหลาดในพฤติกรรม: ตำแหน่งทางภูมิศาสตร์ทำงานบนคอมพิวเตอร์บางเครื่องตลอดเวลา (ยกเว้น IE แน่นอน) คนอื่น ๆ ทำงานเฉพาะในโครเมียมและซาฟารี แต่ไม่ใช่ Firefox (ปัญหาตุ๊กแก?) คนอื่นทำงานครั้งเดียวแล้วภายหลัง ล้มเหลว - และรูปแบบการเปลี่ยนแปลงจากชั่วโมงเป็นชั่วโมงวันต่อวัน บางครั้งคุณมีคอมพิวเตอร์ 'โชคดี' บางครั้งก็ไม่ บางทีการฆ่าแพะที่พระจันทร์เต็มดวงอาจช่วยได้บ้าง

ฉันไม่สามารถเข้าใจสิ่งนี้ได้ แต่ฉันสงสัยว่าโครงสร้างพื้นฐานด้านหลังนั้นไม่สม่ำเสมอกว่าโฆษณาในหนังสือและเว็บไซต์ต่าง ๆ ที่ผลักดันคุณลักษณะนี้ ผมหวังว่าพวกเขาจะมีมากขึ้นอีกนิดตรงเกี่ยวกับวิธี flakey คุณลักษณะนี้และวิธีการที่สำคัญว่าการตั้งค่าหมดเวลาคือถ้าคุณต้องการจัดการข้อผิดพลาดของคุณในการทำงานอย่างถูกต้อง

ฉันพยายามสอนสิ่งนี้ให้กับนักเรียนในวันนี้และมีสถานการณ์ที่น่าอายที่คอมพิวเตอร์ของฉัน (บนเครื่องฉายภาพและหน้าจอขนาดใหญ่หลายจอ) ล้มเหลวอย่างเงียบ ๆ ในขณะที่นักเรียนประมาณ 80% ได้รับผลเกือบทันที (โดยใช้ เครือข่ายไร้สายเดียวกันที่แน่นอน) มันยากมากที่จะแก้ไขปัญหาเหล่านี้เมื่อนักเรียนของฉันกำลังพิมพ์ผิดและ gaffes อื่น ๆ และเมื่อคอมพิวเตอร์ของฉันเองก็ล้มเหลวเช่นกัน

อย่างไรก็ตามฉันหวังว่านี่จะช่วยพวกคุณบางคนได้ ขอบคุณสำหรับการตรวจสุขภาพ!


5
ข้อมูลรายละเอียดดีขอบคุณ! ฉันพบปัญหาเดียวกัน แต่ใช้ Firefox 3.6.13 เท่านั้น Chrome ดูเหมือนว่าจะมีความน่าเชื่อถือ
Felipe Lima

เหมือนกันที่นี่และพารามิเตอร์ maximumAge ดูเหมือนจะไม่น่าเชื่อถือเช่นกัน ขอบคุณสำหรับการโพสต์
Richard

1
เป็นคนดีฉันมีปัญหาเดียวกัน (บนSamsung Galaxy Tab, 10.1, ที่ใช้ Android 4.0.3 ) เมื่อฉันใช้หมดเวลาหมดเวลาข้างบนฉันก็สามารถจัดการกับปัญหาได้
mlo55

9
สิ่งสำคัญคือต้องเข้าใจว่าtimeoutตัวเลือกในgetCurrentPosition()เวลาจริงเป็นอย่างไร ไม่เวลาที่ผู้ใช้จะอนุญาตหรือปฏิเสธคำขอตำแหน่งทางภูมิศาสตร์ แต่จะอนุญาตให้เครือข่ายใช้เวลานานเท่าใดในการส่งคืนตำแหน่งเมื่อได้รับอนุญาต หากผู้ใช้ไม่ตอบรับการร้องขอตำแหน่งทางภูมิศาสตร์ตัวจัดการข้อผิดพลาดจะไม่ถูกเรียกใช้ ดังนั้นคุณต้องหมดเวลาที่สองเช่นใน @ xiaohouzi79 คำตอบ
François

2
การฆ่าแพะที่พระจันทร์เต็มดวงจะช่วยได้ไหม? LOL
Asim KT

66

นี่เป็นวิธีแฮ็กที่ฉันได้รับรอบนี้อย่างน้อยก็ทำงานได้ในเบราว์เซอร์ปัจจุบันทั้งหมด (บน 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

แต่มันก็ใช้งานได้ดี


1
+1 แต่คุณgeolocFail();พลาดเครื่องมือจัดการข้อผิดพลาดและตัวgetcodeLatLng();เข้ารหัสภูมิศาสตร์
ไกเซอร์

หวาน - จับเวลาทำงานได้อย่างสวยงามถ้ามีคนเลือกที่จะไม่แบ่งปันตำแหน่ง เบราว์เซอร์บางตัวเล่นได้ไม่ดีเมื่อผู้ใช้ทำเช่นนี้ วิธีแก้ปัญหาตัวจับเวลานี้ทำงานได้ดีในปลั๊กอิน Locator ร้านค้าของฉันพร้อม WP!
แลนซ์คลีฟแลนด์

2
@sajith - ไม่แน่ใจว่าโซลูชันนี้ล้าสมัยด้วยเบราว์เซอร์ FF ล่าสุดหรือไม่ มันทำงานได้ในเวลาที่ฉันให้วิธีการแก้ปัญหาเพราะฉันต้องการมันสำหรับเว็บไซต์ที่ฉันกำลังทำงานอยู่ คุณผ่านการทดสอบแล้วหรือยัง
ไป

ขออภัยมันทำงาน แต่ฉันไม่สามารถหาสิ่งที่ทำให้มันทำงานหลังจากปิดและเปิด FF อีกครั้งมันทำงาน ........ ขอบคุณสำหรับการแก้ปัญหาของคุณ ....
sajith

1
คุณไม่ควรใช้ฟังก์ชั่นภายในสตริง Eval ชั่วร้ายทำงานที่นั่นอย่างไร้เหตุผล setTimeout ("geolocFail ()", 10,000);
atilkan

42

สิ่งนี้ใช้ได้กับฉันทุกครั้ง:

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

แม้ว่ามันจะไม่ถูกต้องมากนัก สิ่งที่ตลกก็คือบนอุปกรณ์เดียวกันถ้าฉันใช้มันมันทำให้ฉันห่างออกไปประมาณ 100 เมตร (ทุกครั้ง) แต่ถ้าฉันไปที่แผนที่ของ google จะพบตำแหน่งของฉันอย่างแน่นอน ดังนั้นแม้ว่าฉันคิดว่า enableHighAccuracy: จริงช่วยให้ทำงานได้อย่างต่อเนื่อง แต่ดูเหมือนจะไม่ทำให้ถูกต้องมากขึ้น ...


สิ่งนี้ได้หยุด Firefox จากการปฏิเสธคำขอและการส่งคืนวัตถุหมดเวลา
โทนี่

ซึ่งอยู่ห่างออกไป 100 เมตรเป็นหอคอยเซลล์ที่ฉันอยู่ ดังนั้นมันจึงกลับมาที่ตั้งของหอคอยเซลล์ไม่ใช่โทรศัพท์ของฉัน อาจจะแม่นยำมากขึ้นถ้าฉันออกไปข้างนอกเพื่อให้ gps เข้า
K'shin Gendron

9
มันทำให้คุณออกไปสองสามเมตรเพราะคุณตั้งค่า paremeter สูงสุดเป็น 60 วินาที ดังนั้นการวางตำแหน่งของคุณเมื่อ 60 วินาทีก่อน ตั้งค่า MaximumAge เป็น 10 วินาทีหรือน้อยกว่า (maximumAge: 10,000) แล้วลองอีกครั้ง
Robert Smith

ฉันใช้ getCurrentPosition นี้ภายใน Angular Resolver ที่ส่งคืน Observable Resolver เสร็จสมบูรณ์เป็นระยะเท่านั้น การเพิ่มตัวเลือกเหล่านี้: {maximumAge: 60000, หมดเวลา: 5,000, enableHighAccuracy: true} ทำให้มันใช้งานได้ทุกครั้ง !!!
Moutono

17

นี่เป็นคำถามเก่าอยู่แล้ว แต่คำตอบทั้งหมดไม่สามารถแก้ปัญหาของฉันได้ดังนั้นลองเพิ่มคำถามที่พบในที่สุด มันมีกลิ่นเหมือนแฮ็ค (และเป็นหนึ่ง) แต่ใช้ได้เสมอในสถานการณ์ของฉัน หวังในสถานการณ์ของคุณด้วย

//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
นั่นคือแฮ็คที่แฮ็กที่สุดและฉันก็ไม่รู้ว่าคุณจะลองทำยังไง แต่มันแก้ปัญหาของฉันได้ ขอบคุณ!
Brett Gregson

ฉันเคยใช้ตัวเองในบางกรณี ความพยายามครั้งที่สองจะทำงานได้ดีขึ้นในประสบการณ์ของฉัน
Nico Westerdale

13

คนเดียวกันที่นี่ใช้งานได้ดีกับ btw ใน Chrome (เสถียร dev และ canary) ไม่ได้อยู่ใน FF และ Safari มันใช้งานได้ดีกับ iPhone และ iPad (Safari!) นี่อาจเป็นเพราะความแปลกใหม่ของคุณสมบัตินี้ (นั่นคือข้อผิดพลาด) ฉันใช้เวลาเกือบหนึ่งสัปดาห์ในตอนนี้และฉันก็ไม่สามารถทำให้มันทำงานบนเบราว์เซอร์เหล่านั้นได้

นี่คือสิ่งที่ฉันพบ:

ครั้งแรกที่คุณเรียกใช้ getCurrentPosition มันทำงานได้อย่างสมบูรณ์แบบ การเรียกครั้งต่อมาจะไม่ส่งคืนเช่นจะไม่ใช้ฟังก์ชัน successCallback หรือ errorCallback ฉันเพิ่มตัวเลือกตำแหน่งบางอย่างในการโทรเพื่อพิสูจน์จุดของฉัน:

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

และจะหมดเวลาทุกครั้ง (หลังจากการโทรสำเร็จครั้งแรก) ฉันคิดว่าฉันสามารถแก้ไขได้ด้วย MaximumAge แต่ดูเหมือนว่าจะไม่ทำงานเพราะมันควรจะทำงานอย่างใดอย่างหนึ่ง:

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

สิ่งนี้ควรป้องกันไม่ให้เรียกใช้ฟังก์ชัน getCurrentPosition จริง ๆ หากคุณโทรภายใน 60 วินาที แต่จะไม่สนใจสิ่งนี้ (อย่างไรก็ตามนี่อาจเป็นเพราะฉันรีเฟรชหน้าเว็บของฉันเพื่อเรียกการโทรครั้งที่สองไม่แน่ใจว่านี่เป็นการโทรแบบถาวรหรือไม่)

btw แม้ตัวอย่างของ googleล้มเหลวในเบราว์เซอร์เหล่านี้ซึ่งทำให้ฉันเชื่อว่านี่เป็นข้อผิดพลาดของเบราว์เซอร์ลองโหลดสองครั้งใน Safari และจะไม่ทำงานครั้งที่สอง

หากใครพบวิธีแก้ปัญหานี้โปรดแจ้งให้เราทราบ :-)

ไชโย


ฉันมีปัญหาแน่นอนเป็นของคุณมันใช้งานได้สำหรับการโทรครั้งแรก แต่ไม่เคยมีคนต่อไปถ้าใครพบวิธีการแก้ปัญหาฉันจะ intersted มาก ... @ xiaohouzi79 ทางออกของคุณจะสิ้นสุดทุกครั้ง (ยกเว้นเฟิร์สที่แรก) ใน geolocFail ( )
Adriano Rizzo

8

คุณไม่ได้รับข้อความแสดงข้อผิดพลาดเนื่องจากไม่มีการหมดเวลาโดยปริยาย (อย่างน้อยฉันก็คิดว่า) ฉันมีปัญหาเดียวกันกับ Firefox เท่านั้นสำหรับฉัน Firefox มักจะให้หมดเวลา คุณสามารถตั้งค่าการหมดเวลาได้ด้วยตัวเองเช่นนี้

ฟังก์ชั่นของฉันใช้งานได้ดีในโครเมี่ยม แต่ฉันหมดเวลาทุกครั้งใน Firefox

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

ฉันแนะนำให้ดูข้อผิดพลาดของคุณอย่างระมัดระวัง เป็นที่คาดหวังสำหรับทุกสิ่ง มีแผนสำรองสำหรับทุกสิ่ง ฉันใช้ค่าเริ่มต้นหรือค่าบางอย่างจากฐานข้อมูลของฉันด้วยตนเองในกรณีที่ตำแหน่งทางภูมิศาสตร์ของ Google และตำแหน่งทางภูมิศาสตร์ของตัวนำทางล้มเหลว


7
เพียง FYI, MaximumAge หมายถึงอายุของข้อมูลสถานที่ในแคชการตั้งค่าเป็นอินฟินิตี้รับประกันว่าคุณจะได้รับเวอร์ชันแคช การตั้งค่าเป็น 0 จะบังคับให้อุปกรณ์ดึงข้อมูลตำแหน่ง
Porco

downvoted เนื่องจากค่าสูงสุดอายุ: อนันต์จะทำให้คุณสกรูตามที่ระบุไว้ด้านบนนั่นหมายถึงกำลังใช้ค่าแคช
n13

7

ฉันยังคงได้รับผลลัพธ์ที่ไม่แน่นอนในปี 2560 และฉันมีทฤษฎี: เอกสาร APIบอกว่าตอนนี้การโทรมีให้เฉพาะ "ในบริบทที่ปลอดภัย" เช่นผ่าน HTTPS ฉันมีปัญหาในการรับผลลัพธ์ในสภาพแวดล้อมการพัฒนาของฉัน (http บน localhost) และฉันเชื่อว่านี่เป็นสาเหตุ


อืมน่าสนใจ แม้ในปี 2020 มันยังคงเป็นขุยด้วย HTTPS บนโฮสต์ในตัว!
NitroStoutPlz

6

ฉันจะโพสต์ที่นี่ในกรณีที่เป็นประโยชน์กับทุกคน ...

บน iOS Safari การเรียกใช้navigator.geolocation.getCurrentPositionจะหมดเวลาหากฉันเปิดใช้งานnavigator.geolocation.watchPositionฟังก์ชั่น

การเริ่มต้นและหยุดการwatchPositionใช้อย่างถูกต้องclearWatch() ตามที่อธิบายไว้ที่นี่ทำงาน: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition


1
ขอบคุณมาก. นี่คือทางออกสำหรับฉัน
ฉิน Zhengquan

5

นี่คือทางออกของฉันด้วยการปิด:

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

สิ่งนี้ใช้ได้ผลกับฉันในภาษาพื้นเมือง navigator && navigator.geolocation
Ashish Singh Rawat

5

ดังนั้นฉันจึงวิ่งเข้าไปในสิ่งเดียวกัน ฉันลองใช้วิธีหมดเวลาซึ่งทำงานได้ แต่ไม่น่าเชื่อถือ ฉันพบว่าถ้าคุณเรียกมันสองครั้งตำแหน่งจะถูกรีเฟรชอย่างถูกต้อง

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

แน่นอนว่านี่จะช้าไปนิดหน่อย แต่ฉันก็ไม่ได้ให้มันผิดตำแหน่งซักที ฉันมีมันตีหมดเวลาสองสามครั้งและไม่คืนสิ่งใด แต่อื่น ๆ แล้วมันใช้งานได้ดี ฉันรู้ว่านี่ยังเป็นเรื่องแฮ็คอยู่เล็กน้อยและฉันตั้งตารอใครบางคนที่หาทางแก้ปัญหาที่แท้จริง

หรือถ้าคุณต้องการให้แน่ใจว่าจะพยายามต่อไปจนกว่าคุณจะต้องการยอมแพ้คุณสามารถลองสิ่งนี้

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

ฉันอาจมีข้อผิดพลาดในการสะกดและการสะกดคำบางอย่างที่นี่ แต่ฉันหวังว่าคุณจะได้รับแนวคิด แจ้งให้เราทราบหากใครมีคำถามหรือถ้ามีคนพบสิ่งที่ดีกว่า


4

สำหรับทุกคนที่ทำงานกับแอพ iPhone ...

หากรหัสของคุณทำงานใน UIWebView บน iOS 9 ขึ้นไปคุณจะต้องตั้งค่าNSLocationWhenInUseUsageDescriptionภายในแอพพลิเคชั่นของคุณ

หากคุณไม่ได้ตั้งค่าgetCurrentPositionจะไม่มีการโทรกลับและผู้ใช้จะไม่ได้รับแจ้ง


3

ฉันพบว่าวิธีนี้ใช้งานไม่ได้

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

แต่

วิธีนี้ใช้งานได้สมบูรณ์แบบ

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
ความแตกต่างระหว่างทั้งสองคืออะไร?
Pardeep Jain

ฟังก์ชั่นไม่ระบุชื่อ vs ชื่อหนึ่ง
1nstinct

ความแตกต่างใหญ่จริงๆ ขอบคุณสิ่งนี้ก็ไม่ได้ผลเช่นกัน
ถ้าไม่มี

3

คำตอบของ @ brennanyoung นั้นยอดเยี่ยม แต่ถ้าคุณสงสัยว่าจะทำอย่างไรในกรณีที่เกิดความล้มเหลวคุณสามารถใช้ API ตำแหน่งทางภูมิศาสตร์ของ IP เช่นhttps://ipinfo.io (ซึ่งเป็นบริการของฉัน) นี่คือตัวอย่าง:

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

ดูhttps://ipinfo.io/developers/replacing-getcurrentpositionสำหรับรายละเอียดเพิ่มเติม


นี่คือลิงค์ที่ถูกต้องสำหรับสิ่งนี้: ipinfo.io/developers/replacing-getcurrentposition
peater

5
น่ากลัว ความแม่นยำนั้นอยู่ห่างจากตำแหน่งที่แท้จริงเพียง 5-7 ไมล์เมื่ออยู่ในสหรัฐอเมริกาและแคนาดาและอยู่ห่าง 100 ไมล์เมื่ออยู่ในรัสเซีย
ekashking

1
สำหรับแอปพลิเคชั่นจำนวนมากที่ใช้ได้ - และดีกว่ามากที่ไม่รู้ว่าตำแหน่งที่ตั้งคืออะไร
เบ็นดาวลิ่ง

มันใช้งานไม่ได้ทุกที่ ทุกคำขอรับลองจิจูดและละติจูดไม่ถูกต้อง
ไม่มี

คุณหมายถึงอะไรที่ผิด? คุณมีตัวอย่างบ้างไหม?
Ben Dowling

2

ฉันได้รับปัญหาที่คล้ายกันและได้รับความเป็นไปได้ที่เบราว์เซอร์มีข้อ จำกัด เกี่ยวกับความถี่ที่เรียกว่า getCurrentPosition ดูเหมือนว่าฉันมักจะได้รับตำแหน่ง แต่ถ้าฉันรีเฟรชหน้าทันทีมันจะหมดเวลา หากฉันรอสักครู่ฉันมักจะได้รับตำแหน่งอีกครั้ง สิ่งนี้มักเกิดขึ้นกับ FF ใน Chrome และ Safari ฉันยังไม่ได้สังเกตว่า getCurrentPosition หมดเวลาแล้ว แค่คิด ...

แม้ว่าฉันจะไม่สามารถหาเอกสารเพื่อสนับสนุนสิ่งนี้ได้ แต่มันก็เป็นข้อสรุปที่ฉันได้รับหลังการทดสอบมากมาย บางทีคนอื่นมีข้อมูลบางอย่างเกี่ยวกับที่?


นั่นเป็นจุดที่ดี หมดเวลา / ล้มเหลวของฉันดูเหมือนจะเกิดขึ้นส่วนใหญ่เมื่อฉันทดสอบและกำลังค้นหาข้อมูลตำแหน่งทางภูมิศาสตร์ซ้ำ ๆ ฉันอยากทราบว่านี่เป็นผลของข้อผิดพลาดหรือตามที่คุณแนะนำอาจเป็นไปได้จากการออกแบบ
Jamie

ฉันไม่เห็นกรณีที่เบราว์เซอร์ จำกัด จำนวนการโทรไปยังบริการระบุตำแหน่ง คุณสอบถามบ่อยครั้งเพียงใด
Nico Westerdale

2

ในที่สุดฉันก็พบรุ่นที่ใช้งานได้สำหรับ firefox, chrome & default navigator ใน Android (ทดสอบแล้ว 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

พารามิเตอร์ที่สองที่ส่งไปยังGeolocation.getCurrentPosition()คือฟังก์ชันที่คุณต้องการจัดการกับข้อผิดพลาดทางภูมิศาสตร์ ฟังก์ชันตัวจัดการข้อผิดพลาดรับPositionErrorวัตถุที่มีรายละเอียดเกี่ยวกับสาเหตุที่ความพยายามระบุตำแหน่งล้มเหลว ฉันขอแนะนำให้ส่งออกข้อผิดพลาดไปยังคอนโซลหากคุณมีปัญหาใด ๆ :

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

การทำเช่นนี้ในรหัสของฉันเปิดเผยข้อความ "ผู้ให้บริการตำแหน่งเครือข่ายที่ ' https://www.googleapis.com/ ': รหัสข้อผิดพลาดที่ส่งคืน 400" ปรากฎว่า Google Chrome ใช้ Google API เพื่อรับตำแหน่งบนอุปกรณ์ที่ไม่มี GPS ในตัว (ตัวอย่างเช่นคอมพิวเตอร์เดสก์ท็อปส่วนใหญ่) Google ส่งคืนละติจูด / ลองจิจูดโดยประมาณตามที่อยู่ IP ของผู้ใช้ อย่างไรก็ตามในนักพัฒนาซอฟต์แวร์สร้าง Chrome (เช่น Chromium บน Ubuntu) ไม่มีรหัสการเข้าถึง API ที่รวมอยู่ในการสร้างเบราว์เซอร์ สิ่งนี้ทำให้คำร้องขอ API ล้มเหลวอย่างเงียบ ๆ ดูChromium Issue 179686: การระบุตำแหน่งทางภูมิศาสตร์ให้ข้อผิดพลาด 403สำหรับรายละเอียด


1

ฉันมีปัญหานี้ใน Mozilla เวลาทั้งหมด: ข้อผิดพลาด: ไม่ระบุข้อผิดพลาดการซื้อตำแหน่ง

ตอนนี้ฉันใช้ 47 Mozilla ฉันลองทุกอย่างแล้ว แต่ทุกครั้งปัญหานี้ แต่จากนั้นฉันเปิดเกี่ยวกับ: configในแถบ address ของฉันไปgeo.wifi.uiและเปลี่ยนค่าเป็น " https://location.services.mozilla.com/v1/geolocate?key=test " ทำงาน!

หากคุณมีข้อผิดพลาดการซื้อตำแหน่งให้ลองเพิ่มค่าการหมดเวลา:

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

1

อาจเป็นความคิดที่ดีที่จะใช้บริการระบุตำแหน่งทางภูมิศาสตร์ที่อยู่ IP เป็นวิธีการสำรองเมื่อgetCurrentPositionล้มเหลว ตัวอย่างเช่น api https://ip-api.ioของเรา

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

1

ในกรณีของเรามันใช้งานได้เป็นครั้งแรกเสมอ แต่ทำการฟังก์ชั่นใหม่มากกว่า 3-4 ครั้งมันล้มเหลว

วิธีแก้ปัญหาง่าย ๆ : เก็บค่าไว้ใน LocalStorage

ก่อน:

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

หลังจาก:

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

ฉันสังเกตเห็นปัญหานี้เมื่อเร็ว ๆ นี้ด้วยตัวเองและฉันไม่แน่ใจว่ามันจะเกิดขึ้นได้อย่างไร แต่บางครั้งมันก็ปรากฏว่า firefox ติดอยู่ในบางสิ่งที่โหลดอยู่ในแคช หลังจากล้างแคชและเริ่ม Firefox ใหม่ดูเหมือนว่าจะทำงานอีกครั้ง


0

ไลบรารีนี้เพิ่มตัวเลือกที่ต้องการความแม่นยำและ maxWait ในการโทรหาตำแหน่งทางภูมิศาสตร์ซึ่งหมายความว่ามันจะพยายามรับตำแหน่งต่อไปจนกว่าความแม่นยำจะอยู่ในช่วงที่กำหนด


0

ขอบคุณทุกคนสำหรับความคิดเห็นของพวกเขาสิ่งนี้ช่วยฉัน

นอกจากต้องใช้ watchPosition () แทน getCurrentPosition () แล้วฉันยังพบว่าฉันต้องย้ายสายจากภายใน document.ready () ไปที่หัวด้วย


0

สิ่งนี้เกิดขึ้นกับฉันเมื่อใช้โหมดออกแบบที่ตอบสนองของ Firefox ได้มีการรายงานข้อผิดพลาดที่ยื่น ในตอนนี้อย่าเพิ่งใช้โหมดการออกแบบที่ตอบสนองขณะใช้ Geolocation API


0

อาจจะช่วยได้บ้างบน Android ฉันมีปัญหาเดียวกัน แต่ฉันคิดออกโดยใช้ setTimeout ข้างใน document.ready ดังนั้นมันจึงทำงานให้ฉันอย่างที่สองคุณต้องเพิ่มการหมดเวลาเพียงแค่ใส่หีบถ้าผู้ใช้อนุญาตตำแหน่งของเขาหลังจากไม่กี่วินาทีดังนั้นฉันจึงเก็บไว้ที่ 60000 mili วินาที (1 นาที) อนุญาตให้ฟังก์ชันความสำเร็จของฉันโทรถ้าผู้ใช้คลิกที่ปุ่มอนุญาตภายใน 1 นาที

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.