navigator.geolocation.getCurrentPosition कभी-कभी काम करता है कभी-कभी नहीं करता है


220

इसलिए मेरे पास navigator.geolocation.getCurrentPosition जैमी का उपयोग करके 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

मूल रूप से यहाँ क्या हो रहा है, हम वर्तमान स्थिति प्राप्त कर रहे हैं, अगर इसे प्राप्त किया जाता है, तो दो "वॉटरमार्क" दो क्षेत्रों में रखे जाते हैं जो कहते हैं कि "वर्तमान स्थिति" और दो छिपे हुए फ़ील्ड उनके मूल्य के रूप में लंबे-लंबे डेटा के साथ बनाए गए हैं (वे हटा दिए गए हैं) शुरुआत में इसलिए वे हर बार नकल नहीं करते)। दो बटन भी हैं जिनके पास एक क्लिक फ़ंक्शन है जो एक ही काम करता है। दुर्भाग्य से, हर तीसरी बार या तो यह काम करता है। यहाँ क्या समस्या है ???


हो सकता है कि कार्यों का उपयोग करने से पहले आप उन्हें परिभाषित करें।
14

4
@digitalFresh, इससे कोई फर्क नहीं पड़ता क्योंकि जेएस पार्सर कोड के निष्पादन से पहले उन घोषणाओं की तलाश करता है
एंटीमैटर 15

क्या यह संभव है कि वहाँ jQuery का उपयोग समस्या पैदा कर रहा है?
theassociatedweb

1
जब आप कहते हैं कि इसका मतलब क्या है तो यह कभी-कभी काम नहीं करता है? क्या noLocationसमारोह कहा जा रहा है? यदि हां, तो आप एक जोड़ सकते हैं errorकरने के लिए पैरामीटर noLocation()और फिर error.codeऔर error.messageआप को दूर करने में मदद मिल सकती है। यह हमें यह जानने में भी मदद कर सकता है कि आप किस ब्राउज़र का उपयोग कर रहे हैं और यदि आपको विभिन्न ब्राउज़रों में एक ही समस्या दिखाई देती है।
20

मेरा मतलब है कि कभी-कभी यह मुझे लैट-लोन देता है, और कभी-कभी ऐसा नहीं करता है। जब यह काम नहीं करता है, तो यह "स्थान नहीं ढूंढ सकता है" संदेश को भी नहीं फेंकता है इसलिए नोटबंदी बिट फायरिंग भी नहीं करता है।
theassociatedweb

जवाबों:


342

मैं वास्तव में एक ही समस्या रहा है, और इसके बारे में ऑनलाइन कोई जानकारी नहीं पा रहा हूं । किताबों में कुछ भी नहीं। अंत में मुझे स्टैकओवरफ्लो पर यह शांत क्वेरी मिली और (हा!) यह एक अंतिम इम्पेटस था जिसे मुझे यहां एक खाता स्थापित करने की आवश्यकता थी।

और मेरे पास एक आंशिक उत्तर है, लेकिन अफसोस पूरा नहीं है।

सबसे पहले, महसूस करें कि getCurrentPosition के लिए डिफ़ॉल्ट समय-सीमा अनंत (!) है। इसका मतलब है कि अगर आपका त्रुटि हैंडलर कभी नहीं बुलाया जाएगा तो गेटकंट्रीपोजिशन पिछले छोर पर कहीं लटका हुआ है।

यह सुनिश्चित करने के लिए कि आपको टाइमआउट मिलता है, अपने कॉल के लिए वैकल्पिक तीसरे पैरामीटर को getCurrentPosition में शामिल करें, उदाहरण के लिए, यदि आप चाहते हैं कि उपयोगकर्ता उन्हें कोई सुराग देने से पहले 10 सेकंड से अधिक प्रतीक्षा न करें कि क्या हो रहा है, तो उपयोग करें:

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

दूसरे, मैंने विभिन्न संदर्भों में काफी अलग विश्वसनीयता का अनुभव किया है। यहां घर पर, मुझे एक या दो सेकंड के भीतर कॉलबैक मिल जाता है, हालांकि सटीकता खराब है।

हालांकि काम पर, मुझे व्यवहार में काफी विचित्र भिन्नता का अनुभव होता है: जियोलोकेशन कुछ कंप्यूटरों पर हर समय काम करता है (IE को छोड़कर, निश्चित रूप से), अन्य केवल क्रोम और सफारी में काम करते हैं, लेकिन फ़ायरफ़ॉक्स (जेको इश्यू?) नहीं, दूसरों को एक बार, फिर बाद में। विफल - और पैटर्न दिन-प्रतिदिन, घंटे से घंटे में बदलता है। कभी-कभी आपके पास एक 'भाग्यशाली' कंप्यूटर होता है, कभी-कभी नहीं। शायद पूर्णिमा पर बकरियों को मारने से मदद मिलेगी?

मैं इसे थाह नहीं पा रहा हूं, लेकिन मुझे संदेह है कि बैक-एंड इन्फ्रास्ट्रक्चर विभिन्न गूंग-हो किताबों और वेबसाइटों में विज्ञापित की तुलना में अधिक असमान है जो इस सुविधा को आगे बढ़ा रहे हैं। मैं वास्तव में चाहता हूं कि वे इस बात के बारे में थोड़ा और सीधे हों कि यह सुविधा कितनी भद्दी है, और यह महत्वपूर्ण है कि टाइमआउट सेटिंग, यदि आप चाहते हैं कि आपका त्रुटि हैंडलर ठीक से काम करे

मैं आज इस सामान को छात्रों को पढ़ाने की कोशिश कर रहा हूं, और यह शर्मनाक स्थिति थी जहां मेरा खुद का कंप्यूटर (प्रोजेक्टर और कई बड़ी स्क्रीन पर) चुपचाप विफल हो रहा था, जबकि लगभग 80% छात्रों को लगभग तुरंत परिणाम मिल रहा था (उपयोग करके) सटीक एक ही वायरलेस नेटवर्क)। इन मुद्दों को हल करना बहुत मुश्किल है, जब मेरे छात्र टाइपो और अन्य गफ़्स भी बना रहे हैं, और जब मेरा खुद का पीसी भी विफल हो रहा है।

वैसे भी, मुझे आशा है कि यह आप में से कुछ लोगों की मदद करता है। पवित्रता की जाँच के लिए धन्यवाद!


5
अच्छी विस्तृत जानकारी, धन्यवाद! मैं वही समस्याएं देख रहा हूं, लेकिन केवल फ़ायरफ़ॉक्स 3.6.13 पर। लगता है कि क्रोम काफी विश्वसनीय है।
फेलिप लीमा

यहाँ भी, और मैक्सिमम पैरामीटर भी अविश्वसनीय लगता है। पोस्ट के लिए धन्यवाद।
रिचर्ड

1
एक अच्छा, मेरे पास एक ही मुद्दा था ( सैमसंग गैलेक्सी टैब पर, 10.1, एंड्रॉइड 4.0.3 पर चल रहा है ), एक बार जब मैंने ऊपर दिए गए टाइमआउट परम का उपयोग किया, तो मैं इस मुद्दे को संभालने में सक्षम था।
mlo55

9
यह समझना महत्वपूर्ण है कि वास्तव timeoutमें विकल्प क्या getCurrentPosition()है। यह उपयोगकर्ता को जियोलोकेशन अनुरोध को अनुमति देने या अस्वीकार करने का समय नहीं देता है, लेकिन अनुमति मिलने के बाद नेटवर्क को किसी स्थान को वापस लेने में कितना समय लगता है। यदि उपयोगकर्ता जियोलोकेशन अनुरोध का जवाब नहीं देता है, तो त्रुटि हैंडलर को कभी नहीं बुलाया जाएगा। इस प्रकार, आपको @ xiaohouzi79 उत्तर में दूसरे टाइमआउट की आवश्यकता है।
फ्रांस्वा

2
पूर्णिमा पर बकरियों को मारने से मदद मिलेगी? LOL
असीम केटी

66

यह हैक करने का तरीका है जो मुझे इसके आस-पास मिल रहा है, कम से कम यह सभी वर्तमान ब्राउज़रों में काम करता है (विंडोज पर, मेरे पास मैक नहीं है):

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

यह तब भी काम करेगा जब कोई करीबी क्लिक करता है या फ़ायरफ़ॉक्स पर नेवर शेयर विकल्प चुनता है या नहीं चुनता है।

क्लंकी, लेकिन यह काम करता है।


1
+1 लेकिन आपको geolocFail();त्रुटि हैंडलर और getcodeLatLng();जियो कोडर याद आ रहे हैं ।
kaiser

मीठा - टाइमर खूबसूरती से काम करता है अगर कोई स्थान साझा करने के लिए नहीं चुनता है। जब उपयोगकर्ता ऐसा करते हैं तो कुछ ब्राउज़र अच्छा नहीं खेलते हैं। इस टाइमर वर्कअराउंड ने मेरे स्टोर लोकेटर प्लस WP प्लगइन पर बहुत अच्छा काम किया!
लांस क्लीवलैंड

2
@sajith - निश्चित नहीं है कि यह समाधान हाल के एफएफ ब्राउज़रों के साथ पुराना हो गया है। इसने उस समय काम किया जब मैंने समाधान प्रदान किया क्योंकि मुझे उस साइट की आवश्यकता थी जिस पर मैं काम कर रहा था। क्या आपने परीक्षण किया है?
जा रहा है

क्षमा करें, यह काम किया।लेकिन मैं नहीं मिल सकता है कि यह क्या काम करता है। बंद करने और एफएफ को फिर से खोलने के बाद अपने काम के लिए ........ अपने समाधान के लिए
धन्यवाद

1
आपको स्ट्रिंग के अंदर फ़ंक्शन का उपयोग नहीं करना चाहिए। बुराई का सबूत वहाँ काम करता है। सेटटाइमआउट ("जियोलोकेल ()", 10000);
atilkan

42

यह मेरे लिए हर बार काम करता है:

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

हालांकि यह बहुत सटीक नहीं है। मज़ेदार बात यह है कि अगर मैं इसे चलाता हूं तो उसी डिवाइस पर यह मुझे लगभग 100 मीटर (हर बार) बंद कर देता है, लेकिन अगर मैं Google के नक्शे पर जाता हूं तो यह मेरे स्थान को बिल्कुल ठीक पाता है। इसलिए हालांकि मुझे लगता है कि enableHighAccuracy: true इसे लगातार काम करने में मदद करता है, लेकिन यह इसे और सटीक नहीं बनाता है ...


इसने फ़ायरफ़ॉक्स को अनुरोध को अस्वीकार करने और टाइमआउट ऑब्जेक्ट को वापस भेजने से रोक दिया है।
टोनी

100 मीटर की दूरी पर मैं जिस सेल टॉवर से जुड़ा हुआ हूं। इसलिए यह सेल टॉवर का स्थान लौटा रहा है, मेरा फोन नहीं। अगर मैं में लात करने के लिए जीपीएस के लिए बाहर था और अधिक सटीक हो सकता है।
K'shin गेनड्रोन

9
यह आपको कुछ मीटर की दूरी पर रखता है क्योंकि आपके पास 60 सेकंड के लिए अधिकतम पारेमीटर सेट है। तो इसका स्थान आपके स्थान पर है जहाँ आप 60 सेकंड पहले थे। अधिकतम 10 सेकंड या उससे कम (अधिकतम: 10000) पर सेट करें और फिर से प्रयास करें।
रॉबर्ट स्मिथ

मैं एक Angular Resolver के भीतर इस getCurrentPosition का उपयोग कर रहा था जो एक ऑब्जर्वेबल रिटर्न देता है। रिज़ॉल्वर ने केवल रुक-रुक कर पूरा किया। इन विकल्पों को जोड़ना: {maxAge: 60000, timeout: 5000, enableHighAccuracy: true} ने इसे हर बार काम किया !!!
माउटनो

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
यह हैक का सबसे आसान तरीका है, और मुझे नहीं पता कि आपने इसे कैसे आजमाया है, लेकिन यह मेरी समस्या को हल करता है। धन्यवाद!
ब्रेट ग्रेगसन

मैंने कुछ मामलों में इसका खुद इस्तेमाल किया है। दूसरा प्रयास हमेशा मेरे अनुभव में बेहतर काम करता है
निको वेस्टरडेल

13

यहां भी लोग, यह क्रोम (स्थिर, देव और कैनरी) में सही btw काम करता है न कि एफएफ और सफारी में। यह मेरे iPhone और iPad (सफारी!) पर भी काम करता है। यह इस सुविधा के सापेक्ष नएपन के कारण हो सकता है (अर्थात यह एक बग है)। मैं अब इस पर लगभग एक सप्ताह बिताता हूं और मैं इसे केवल उन ब्राउज़रों पर काम करने के लिए नहीं कर सकता

यहाँ मैं क्या पाया:

पहली बार जब आप getCurrentPosition कहते हैं तो यह सही काम करता है। कोई भी बाद की कॉल कभी नहीं लौटती है, अर्थात यह सक्सेसकॉलबैक या एररकलबैक फ़ंक्शंस को फायर नहीं करता है। मैंने अपनी बात साबित करने के लिए अपने कॉल में कुछ पोजिशन विकल्प जोड़े:

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

और यह हर बार (पहली सफल कॉल के बाद) निकल जाता है। मैंने सोचा कि मैं इसे अधिकतम रूप से ठीक कर सकता हूं, लेकिन यह काम नहीं करता जैसा कि लगता है कि यह काम करने के लिए है:

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

यदि आप इसे 60 सेकंड के भीतर कहते हैं, तो इसे वास्तव में getCurrentPosition फ़ंक्शन को कॉल करने से रोकना चाहिए, लेकिन यह इसे अनदेखा करता है (हालांकि, यह इसलिए हो सकता है क्योंकि मैं वास्तव में दूसरी कॉल को ट्रिगर करने के लिए अपने पृष्ठ को ताज़ा करता हूं, यह सुनिश्चित नहीं है कि अगर यह लगातार कॉल है)

btw, यहां तक ​​कि Google के उदाहरण इन ब्राउज़रों पर विफल होते हैं जो मुझे विश्वास दिलाता है कि यह वास्तव में ब्राउज़र बग हैं, इसे आज़माएं, इसे दो बार सफारी में लोड करें और यह दूसरी बार काम नहीं करेगा।

अगर किसी को इसके लिए एक समाधान मिल जाता है, तो कृपया मुझे बताएं :-)

चीयर्स।


मुझे आपके समान सटीक समस्या है, यह पहली कॉल के लिए काम करता है, लेकिन अगले वाले कभी नहीं, अगर किसी को भी कोई समाधान मिल जाए तो मैं बहुत ही अंतःस्त्रोत होगा ... @ xiaohouzi79 आपका समाधान हर बार (फ्रॉस्ट एक को छोड़कर) जियोलोकेल में समाप्त होता है ( )
एड्रियानो रिज़ो

8

आपको एक त्रुटि संदेश नहीं मिलता है क्योंकि इसमें डिफ़ॉल्ट रूप से कोई टाइमआउट नहीं है (कम से कम मुझे लगता है)। मुझे केवल फ़ायरफ़ॉक्स के साथ एक ही समस्या थी मेरे लिए फ़ायरफ़ॉक्स हमेशा एक टाइमआउट देता है। आप इस तरह से खुद को टाइमआउट सेट कर सकते हैं।

मेरा कार्य क्रोम में बहुत अच्छा काम करता है लेकिन मुझे फ़ायरफ़ॉक्स में हर बार टाइमआउट मिलता है।

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

मैं आपकी त्रुटियों को ध्यान से देखने की सलाह देता हूं। हर चीज के लिए अपेक्षित रहें। सब कुछ के लिए एक बैकअप योजना है। Google जियोलोकेशन और नेविगेटर जियोलोकेशन दोनों विफल होने की स्थिति में मैं अपने डेटाबेस से कुछ डिफ़ॉल्ट मान या मान का उपयोग करता हूं।


7
सिर्फ एक FYI करें, मैक्सिमम कैश में स्थान डेटा की आयु को संदर्भित करता है, इसे अनंत गारंटी देता है कि आपको कैश्ड संस्करण मिलेगा। इसे 0 पर सेट करने से स्थिति को पुनः प्राप्त करने के लिए उपकरण मजबूर हो जाता है।
पोर्क

डाउनवोटेड क्योंकि मैक्सिमाइज: इनफिनिटी आपको ऊपर बताएगी क्योंकि इसका मतलब है कि कैश्ड वैल्यू का उपयोग करें।
n13

7

मुझे अभी भी 2017 में धब्बेदार परिणाम मिल रहे हैं, और मेरे पास एक सिद्धांत है: एपीआई प्रलेखन का कहना है कि कॉल अब केवल "एक सुरक्षित संदर्भ में" उपलब्ध है, अर्थात एचटीटीपीएस पर। मुझे अपने विकास के माहौल (httphost पर http) के कारण परेशानी हो रही है और मुझे विश्वास है कि ऐसा क्यों है।


हां दिलचस्प। 2020 में भी यह लोकलहोस्ट पर HTTPS के साथ अभी भी परतदार है!
NitroStoutPlz

6

मैं इसे यहाँ पोस्ट करूँगा अगर यह किसी के लिए उपयोगी हो तो…

IOS सफारी पर, navigator.geolocation.getCurrentPositionयदि मैं एक सक्रिय navigator.geolocation.watchPositionफ़ंक्शन चला रहा था तो कॉलआउट टाइमआउट हो जाएगा ।

यहाँ वर्णित के रूप में watchPositionठीक से उपयोग करना शुरू करना और रोकना clearWatch(), https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition


1
बहुत बहुत धन्यवाद। मेरे लिए यही समाधान था।
किन झेंगक्वान

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
आशीष सिंह रावत

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 ऐप पर काम करने वाले किसी भी व्यक्ति के लिए ...

यदि आपका कोड iOS 9+ पर UIWebView में चल रहा है, तो आपको 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
दोनों में क्या अंतर है?
परदीप जैन

बेनामी फ़ंक्शन बनाम एक का नाम
1nstinct

वास्तव में बड़े अंतर। धन्यवाद, यह या तो काम नहीं कर रहा है
बिना

3

@ brennanyoung का जवाब बहुत अच्छा है, लेकिन अगर आप सोच रहे हैं कि विफलता के मामले में आप क्या करना चाहते हैं तो आप 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 मील दूर है।
ईशान

1
बहुत सारे अनुप्रयोगों के लिए यह ठीक है - और बहुत से बेहतर पता नहीं है कि स्थान क्या है।
बेन डाउलिंग

यह कहीं भी काम नहीं करता है। हर अनुरोध देशांतर और गलत के रूप में अक्षांश हो रही
withoutOne

गलत से क्या मतलब है? क्या आपके पास कुछ उदाहरण हैं?
बेन डाउलिंग

2

मैं इसी तरह के मुद्दे रख रहा हूं, और इस संभावना पर गौर कर रहा हूं कि ब्राउज़रों के पास कितनी बार getCurrentPosition कहा जा सकता है। ऐसा लगता है कि मैं अक्सर एक स्थान प्राप्त कर सकता हूं, लेकिन अगर मैं तुरंत पृष्ठ को ताज़ा करता हूं तो यह समय समाप्त हो जाएगा। यदि मैं थोड़ा इंतजार करता हूं, तो मैं आमतौर पर फिर से एक स्थान प्राप्त कर सकता हूं। यह आमतौर पर एफएफ के साथ होता है। Chrome और Safari में, मैंने अभी तक getCurrentPosition टाइमिंग पर ध्यान नहीं दिया है। सिर्फ एक विचार...

हालाँकि मुझे इसका समर्थन करने के लिए कोई दस्तावेज नहीं मिला, लेकिन यह निष्कर्ष था कि मैं बहुत परीक्षण के बाद आया हूं। शायद किसी और के बारे में कुछ जानकारी है?


ये एक अच्छा बिंदु है। मेरे टाइमआउट / फेल ज्यादातर तब होते हैं जब मैं परीक्षण कर रहा हूं और बार-बार जियोलोकेशन डेटा को क्वेरी कर रहा हूं। मैं यह जानने के लिए उत्सुक हूं कि क्या यह बग का परिणाम है या, जैसा कि आप सुझाव देते हैं, संभवतः डिजाइन द्वारा।
जेमी

मैंने ऐसा कोई मामला नहीं देखा है जहां ब्राउज़र स्थान सेवाओं के लिए कॉल की मात्रा को सीमित करता है। आप कितनी बार क्वेरी कर रहे हैं?
निको वेस्टरडेल

2

मुझे अंत में एंड्रॉइड में फ़ायरफ़ॉक्स, क्रोम और डिफ़ॉल्ट नेविगेटर के लिए एक कार्यशील संस्करण मिला (केवल 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 Chrome का उपयोग करता है, जिनके पास GPS नहीं है (उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटर)। Google उपयोगकर्ता के आईपी पते के आधार पर लगभग अक्षांश / देशांतर देता है। हालाँकि , डेवलपर में Chrome का निर्माण होता है (जैसे उबंटू में क्रोमियम) ब्राउज़र बिल्ड में कोई एपीआई एक्सेस कुंजी शामिल नहीं है। यह एपीआई अनुरोध को चुपचाप विफल होने का कारण बनता है। क्रोमियम अंक 179686 देखें : विवरण के लिए 403 त्रुटि देते हुए जियोलोकेशन


1

मुझे मोज़िला में यह समस्या है। हर समय: त्रुटि: अज्ञात त्रुटि स्थिति प्राप्त करना

अब मैं 47 मोज़िला का उपयोग कर रहा हूँ। मैंने हर चीज की कोशिश की है, लेकिन हर समय यह समस्या है। लेकिन फिर मैं इसके बारे में खोलता हूं : मेरे अतिरिक्त बार में कॉन्फ़िगर करें , 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

यह एक अच्छा विचार हो सकता है जब एक आईपी एड्रेस जियो लोकेशन सर्विस को फेलबैक विधि के रूप में उपयोग किया getCurrentPositionजाता है जब वह विफल हो जाता है। उदाहरण के लिए हमारे एपीआई https://ip-api.io के साथ

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

1

हमारे मामले में यह हमेशा पहली बार काम करता है लेकिन फ़ंक्शन को 3-4 बार से अधिक पुन: निर्देशित करता है, यह विफल रहता है।

सिंपल वर्कअराउंड: लोकलस्टोरेज में इसकी वैल्यू स्टोर करें।

इससे पहले:

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

मैंने हाल ही में इस समस्या पर ध्यान दिया, और मुझे यकीन नहीं है कि यह कैसे आता है, लेकिन यह कभी-कभी दिखाई देता है कि फ़ायरफ़ॉक्स कैश में भरी हुई चीज़ पर अटक जाता है। कैश साफ़ करने और फ़ायरफ़ॉक्स को पुनरारंभ करने के बाद यह फिर से कार्य करता है।


0

यह लाइब्रेरी जियोलोकेशन कॉल के लिए एक वांछित योग्यता और अधिकतम विकल्प जोड़ता है, जिसका अर्थ है कि यह तब तक स्थिति प्राप्त करने की कोशिश करता रहेगा जब तक कि एक निर्दिष्ट सीमा के भीतर सटीकता न हो।


0

सभी को उनके इनपुट के लिए धन्यवाद, इससे मुझे मदद मिली।

GetCurrentPosition () के बजाय वॉचपोजिशन () का उपयोग करने के अलावा, मैंने यह भी पाया कि मुझे डॉक्यूमेंट के भीतर से कॉल को स्थानांतरित करने की आवश्यकता थी।


0

फ़ायरफ़ॉक्स के उत्तरदायी डिज़ाइन मोड का उपयोग करते समय मेरे साथ ऐसा हुआ। एक बग रिपोर्ट दर्ज की गई है। अभी के लिए, जियोलोकेशन एपीआई का उपयोग करते समय बस उत्तरदायी डिज़ाइन मोड का उपयोग न करें।


0

हो सकता है कि यह कुछ मदद करता है, एंड्रॉइड पर मेरे पास एक ही मुद्दा था, लेकिन मैंने इसे setTimeout अंदर का उपयोग करके समझ लिया, document.ready इसलिए यह मेरे लिए काम किया दूसरा आपको समयसीमा बढ़ाना होगा यदि उपयोगकर्ता कुछ सेकंड के बाद अपने स्थान की अनुमति देता है, तो मैंने इसे 60000 पर रखा यदि उपयोगकर्ता 1 मिनट के भीतर अनुमति बटन पर क्लिक करता है तो मेरी सफलता फ़ंक्शन को कॉल करने की अनुमति देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.