कैसे इंटरनेट कनेक्शन का पता लगाने के लिए जावास्क्रिप्ट में ऑफ़लाइन है?
कैसे इंटरनेट कनेक्शन का पता लगाने के लिए जावास्क्रिप्ट में ऑफ़लाइन है?
जवाबों:
आप यह निर्धारित कर सकते हैं कि असफल XHR अनुरोध करने से कनेक्शन खो गया है ।
मानक दृष्टिकोण कुछ बार अनुरोध को पुनः प्राप्त करने के लिए है। यदि यह नहीं गुजरता है, तो उपयोगकर्ता को कनेक्शन की जांच करने के लिए सतर्क करें , और इनायत से विफल रहें ।
सिडेनोट: पूरे एप्लिकेशन को "ऑफ़लाइन" स्थिति में रखने के लिए राज्य को संभालने में बहुत अधिक त्रुटि वाले काम हो सकते हैं .. वायरलेस कनेक्शन आ सकते हैं और जा सकते हैं, आदि। इसलिए आपका सबसे अच्छा शर्त केवल शान से असफल होना हो सकता है, संरक्षित करना डेटा, और उपयोगकर्ता को सचेत करें .. उन्हें अंत में कनेक्शन समस्या को ठीक करने की अनुमति देता है अगर एक है, और अपने ऐप का उपयोग उचित मात्रा में करना जारी रखना है।
पक्षीय लेख: आप कनेक्टिविटी के लिए Google जैसी विश्वसनीय साइट की जांच कर सकते हैं, लेकिन यह पूरी तरह से उपयोगी नहीं हो सकता है क्योंकि सिर्फ अपना अनुरोध करने की कोशिश कर रहा है, क्योंकि जब तक Google उपलब्ध हो सकता है, आपका अपना आवेदन नहीं हो सकता है, और आप अभी भी जा रहे हैं अपनी कनेक्शन समस्या को संभालना होगा। Google को एक पिंग भेजने की कोशिश करना यह पुष्टि करने का एक अच्छा तरीका होगा कि इंटरनेट कनेक्शन स्वयं नीचे है, इसलिए यदि वह जानकारी आपके लिए उपयोगी है, तो यह परेशानी का कारण हो सकता है।
सिडेनोट : एक पिंग भेजना उसी तरह से प्राप्त किया जा सकता है जिससे आप किसी भी तरह का दो-तरफा अजाक्स अनुरोध करेंगे, लेकिन इस मामले में Google को एक पिंग भेजना, कुछ चुनौतियों का सामना करेगा। सबसे पहले, हमारे पास समान क्रॉस-डोमेन समस्याएं होंगी जो आम तौर पर अजाक्स संचार बनाने में सामना होती हैं। एक विकल्प सर्वर-साइड प्रॉक्सी सेट करना है, जिसमें हम वास्तव में ping
Google (या जो भी साइट) हैं, और ऐप में पिंग के परिणाम लौटाते हैं। यह एक कैच -22 हैक्योंकि अगर इंटरनेट कनेक्शन वास्तव में समस्या है, तो हम सर्वर पर नहीं जा पाएंगे, और यदि कनेक्शन समस्या केवल हमारे स्वयं के डोमेन पर है, तो हम अंतर नहीं बता पाएंगे। अन्य क्रॉस-डोमेन तकनीकों की कोशिश की जा सकती है, उदाहरण के लिए, आपके पृष्ठ में एक iframe एम्बेड करना जो google.com को इंगित करता है, और फिर सफलता / विफलता के लिए iframe को पोलिंग (सामग्री आदि की जांच करें)। छवि को एम्बेड करना वास्तव में हमें कुछ भी नहीं बता सकता है, क्योंकि हमें संचार तंत्र से एक उपयोगी प्रतिक्रिया की आवश्यकता है ताकि जो कुछ भी हो रहा है उसके बारे में एक अच्छा निष्कर्ष निकाला जा सके। तो फिर, एक पूरे के रूप में इंटरनेट कनेक्शन की स्थिति का निर्धारण करना इसके लायक होने से अधिक परेशानी हो सकती है। आपको अपने विशिष्ट ऐप के लिए इन विकल्पों का वजन करना होगा।
IE 8 window.navigator.onLine संपत्ति का समर्थन करेगा ।
लेकिन निश्चित रूप से अन्य ब्राउज़रों या ऑपरेटिंग सिस्टम के साथ मदद नहीं करता है। मैं अनुमान लगाता हूं कि अन्य ब्राउज़र विक्रेता उस संपत्ति को प्रदान करने का निर्णय लेंगे और साथ ही साथ अजाक्स अनुप्रयोगों में ऑनलाइन / ऑफ़लाइन स्थिति जानने के महत्व को भी प्रदान करेंगे।
जब तक ऐसा होता है, या तो एक्सएचआर या एक Image()
या <img>
अनुरोध आप चाहते हैं कार्यक्षमता के लिए कुछ करीबी प्रदान कर सकते हैं।
अपडेट (2014/11/16)
प्रमुख ब्राउज़र अब इस संपत्ति का समर्थन करते हैं, लेकिन आपके परिणाम अलग-अलग होंगे।
मोज़िला प्रलेखन से उद्धरण :
क्रोम और सफारी में, यदि ब्राउज़र स्थानीय क्षेत्र नेटवर्क (LAN) या एक राउटर से कनेक्ट करने में सक्षम नहीं है, तो यह ऑफ़लाइन है; अन्य सभी स्थितियां लौटती हैं
true
। इसलिए जब आप मान सकते हैं कि ब्राउज़र ऑफ़लाइन है जब यह एकfalse
मूल्य लौटाता है , तो आप यह नहीं मान सकते कि एक सही मूल्य आवश्यक रूप से इसका मतलब है कि ब्राउज़र इंटरनेट का उपयोग कर सकता है। आप झूठी सकारात्मकता प्राप्त कर सकते हैं, जैसे कि उन मामलों में जहां कंप्यूटर एक वर्चुअलाइजेशन सॉफ़्टवेयर चला रहा है जिसमें वर्चुअल ईथरनेट एडेप्टर होते हैं जो हमेशा "कनेक्ट" होते हैं। इसलिए, यदि आप वास्तव में ब्राउज़र की ऑनलाइन स्थिति निर्धारित करना चाहते हैं, तो आपको जाँच के लिए अतिरिक्त साधन विकसित करने चाहिए।फ़ायरफ़ॉक्स और इंटरनेट एक्सप्लोरर में, ब्राउज़र को ऑफ़लाइन मोड में बदलना एक
false
मूल्य भेजता है । अन्य सभी स्थितियाँ एकtrue
मान लौटाती हैं।
लगभग सभी प्रमुख ब्राउज़र अब window.navigator.onLine
संपत्ति का समर्थन करते हैं, और इसी online
और offline
खिड़की की घटनाओं:
window.addEventListener('online', () => console.log('came online'));
window.addEventListener('offline', () => console.log('came offline'));
अपने सिस्टम या ब्राउज़र को ऑफ़लाइन / ऑनलाइन मोड में सेट करने का प्रयास करें और window.navigator.onLine
मूल्य परिवर्तनों के लिए कंसोल या संपत्ति की जांच करें । आप इसे इस वेबसाइट पर भी देख सकते हैं ।
हालाँकि यह उद्धरण मोज़िला प्रलेखन से लिया गया है :
क्रोम और सफारी में, यदि ब्राउज़र किसी स्थानीय क्षेत्र नेटवर्क (LAN) या एक राउटर से कनेक्ट करने में सक्षम नहीं है, तो यह ऑफ़लाइन है; अन्य सभी स्थितियां लौटती हैं
true
। इसलिए जब आप मान सकते हैं कि ब्राउज़र ऑफ़लाइन है जब वहfalse
मान लौटाता है , तो आप यह नहीं मान सकते कि एकtrue
मूल्य आवश्यक रूप से इसका मतलब है कि ब्राउज़र इंटरनेट तक पहुंच सकता है । आप झूठी सकारात्मकता प्राप्त कर सकते हैं, जैसे कि उन मामलों में जहां कंप्यूटर एक वर्चुअलाइजेशन सॉफ़्टवेयर चला रहा है जिसमें वर्चुअल ईथरनेट एडेप्टर होते हैं जो हमेशा "कनेक्ट" होते हैं। इसलिए, यदि आप वास्तव में ब्राउज़र की ऑनलाइन स्थिति निर्धारित करना चाहते हैं, तो आपको जाँच के लिए अतिरिक्त साधन विकसित करने चाहिए।फ़ायरफ़ॉक्स और इंटरनेट एक्सप्लोरर में, ब्राउज़र को ऑफ़लाइन मोड में बदलना एक
false
मूल्य भेजता है । फ़ायरफ़ॉक्स 41 तक, अन्य सभी स्थितियाँ एकtrue
मान लौटाती हैं; फ़ायरफ़ॉक्स 41 के बाद से, ओएस एक्स और विंडोज पर, मूल्य वास्तविक नेटवर्क कनेक्टिविटी का पालन करेगा।
(जोर मेरा खुद का है)
इसका मतलब है कि यदि window.navigator.onLine
है false
(या आपको कोई offline
घटना मिलती है ), तो आपको इंटरनेट कनेक्शन नहीं होने की गारंटी है।
यदि यह true
फिर भी है (या आपको कोई online
घटना मिलती है ), इसका मतलब केवल यह है कि सिस्टम किसी नेटवर्क से जुड़ा है, सबसे अच्छा। इसका मतलब यह नहीं है कि आपके पास उदाहरण के लिए इंटरनेट का उपयोग है। यह जांचने के लिए, आपको अभी भी अन्य उत्तरों में वर्णित समाधानों में से एक का उपयोग करने की आवश्यकता होगी।
मैंने शुरू में इसे ग्रांट वैगनर के जवाब के अपडेट के रूप में पोस्ट करने का इरादा किया था, लेकिन यह बहुत अधिक संपादित लगता था, खासकर यह देखते हुए कि 2014 का अपडेट पहले से ही नहीं था ।
यह करने के कई तरीके हैं:
आप एक onerror
में डाल सकते हैं img
, जैसे
<img src='http://www.example.com/singlepixel.gif'
onerror='alert("Connection dead");' />
यदि स्रोत छवि को स्थानांतरित / नाम दिया गया है, तो यह विधि विफल भी हो सकती है, और आमतौर पर अजाक्स विकल्प के लिए एक अवर विकल्प होगा।
तो इसको आज़माने और पता लगाने के लिए कई अलग-अलग तरीके हैं, कोई भी सही नहीं है, लेकिन ब्राउज़र सैंडबॉक्स से बाहर कूदने और उपयोगकर्ता के नेट कनेक्शन की स्थिति तक सीधे पहुंचने की क्षमता के अभाव में, वे सबसे अच्छे विकल्प लगते हैं।
if(navigator.onLine){
alert('online');
} else {
alert('offline');
}
आप $ .ajax () के error
कॉलबैक का उपयोग कर सकते हैं , जो अनुरोध विफल होने पर आग हो जाती है। यदि textStatus
स्ट्रिंग "टाइमआउट" के बराबर है, तो इसका मतलब है कि कनेक्शन टूट गया है:
function (XMLHttpRequest, textStatus, errorThrown) {
// typically only one of textStatus or errorThrown
// will have info
this; // the options for this ajax request
}
से दस्तावेज़ :
त्रुटि : अनुरोध को विफल होने पर कहा जाने वाला कार्य। फ़ंक्शन को तीन तर्क दिए गए हैं: XMLHttpRequest ऑब्जेक्ट, एक स्ट्रिंग जो त्रुटि के प्रकार और एक वैकल्पिक अपवाद ऑब्जेक्ट का वर्णन करती है, यदि एक हुई। दूसरे तर्क के लिए संभावित मान (शून्य के अलावा) "टाइमआउट", "त्रुटि", "नोटमोडिफाइड" और "पार्सररोर" हैं। यह एक अजाक्स इवेंट है
उदाहरण के लिए:
$.ajax({
type: "GET",
url: "keepalive.php",
success: function(msg){
alert("Connection active!")
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
if(textStatus == 'timeout') {
alert('Connection seems dead!');
}
}
});
जैसा कि ओलीजे ने कहा, navigator.onLine
ब्राउज़र संपत्ति का उपयोग करना नेटवर्क अनुरोध भेजने की तुलना में बेहतर है और तदनुसार, डेवलपर. mozilla.org/En/Online_and_offline_events के साथ , यह फ़ायरफ़ॉक्स और IE के पुराने संस्करणों द्वारा भी समर्थित है।
हाल ही में, WHATWG ने बदलावों पर प्रतिक्रिया देने की आवश्यकता के मामले में online
और offline
घटनाओं के अलावा को निर्दिष्ट किया है navigator.onLine
।
कृपया डैनियल सिलवीरा द्वारा पोस्ट किए गए लिंक पर भी ध्यान दें जो बताता है कि सर्वर के साथ सिंक करने के लिए उन सिग्नल / संपत्ति पर भरोसा करना हमेशा एक अच्छा विचार नहीं है।
window.navigator.onLine
वह है जो आप खोज रहे हैं, लेकिन कुछ चीजें यहां जोड़ने के लिए, सबसे पहले, यदि यह आपके ऐप पर कुछ है जिसे आप चेक करते रहना चाहते हैं (जैसे यह देखना है कि क्या उपयोगकर्ता अचानक ऑफ़लाइन हो जाता है, जो इस मामले में सबसे अधिक बार सही होता है, तो आप परिवर्तन को भी सुनने की जरूरत है), इसके लिए आप किसी भी परिवर्तन का पता लगाने के लिए विंडो में ईवेंट श्रोता को जोड़ते हैं, यह जांचने के लिए कि क्या उपयोगकर्ता ऑफ़लाइन है, आप कर सकते हैं:
window.addEventListener("offline",
()=> console.log("No Internet")
);
और ऑनलाइन जाँच के लिए:
window.addEventListener("online",
()=> console.log("Connected Internet")
);
onLine
। ब्राउज़र बहुत अलग तरीके से ऑनलाइन होने की स्थिति को परिभाषित करते हैं। Developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine पर एक नज़र डालें ।
मुझे एक ग्राहक के लिए एक वेब ऐप (ajax आधारित) बनाना था जो स्कूलों के साथ बहुत काम करता है, इन स्कूलों में अक्सर एक खराब इंटरनेट कनेक्शन होता है मैं इस सरल फ़ंक्शन का उपयोग यह पता लगाने के लिए करता हूं कि क्या कोई कनेक्शन है, बहुत अच्छी तरह से काम करता है!
मैं CodeIgniter और Jquery का उपयोग करता हूं:
function checkOnline() {
setTimeout("doOnlineCheck()", 20000);
}
function doOnlineCheck() {
//if the server can be reached it returns 1, other wise it times out
var submitURL = $("#base_path").val() + "index.php/menu/online";
$.ajax({
url : submitURL,
type : "post",
dataType : "msg",
timeout : 5000,
success : function(msg) {
if(msg==1) {
$("#online").addClass("online");
$("#online").removeClass("offline");
} else {
$("#online").addClass("offline");
$("#online").removeClass("online");
}
checkOnline();
},
error : function() {
$("#online").addClass("offline");
$("#online").removeClass("online");
checkOnline();
}
});
}
यदि आप ऑफ़लाइन हैं, तो यह पता लगाने के लिए आपके डोमेन के लिए अजाक्स कॉल सबसे आसान तरीका है
$.ajax({
type: "HEAD",
url: document.location.pathname + "?param=" + new Date(),
error: function() { return false; },
success: function() { return true; }
});
यह आपको केवल अवधारणा देने के लिए है, इसमें सुधार किया जाना चाहिए।
उदा। त्रुटि = 404 का अभी भी मतलब होना चाहिए कि आप ऑनलाइन हैं
मुझे लगता है कि यह बहुत सरल तरीका है।
var x = confirm("Are you sure you want to submit?");
if (x) {
if (navigator.onLine == true) {
return true;
}
alert('Internet connection is lost');
return false;
}
return false;
if the browser is not able to connect to a local area network (LAN) or a router, it is offline; all other conditions return true
मैं एक क्लाइंट-साइड समाधान की तलाश कर रहा था ताकि यह पता लगाया जा सके कि इंटरनेट डाउन था या मेरा सर्वर डाउन था। मुझे जो अन्य समाधान मिले वे हमेशा एक 3 पार्टी स्क्रिप्ट फ़ाइल या छवि पर निर्भर प्रतीत होते थे, जो मुझे ऐसा नहीं लगता था कि यह समय की कसौटी पर खरा उतरेगा। एक बाहरी होस्टेड स्क्रिप्ट या छवि भविष्य में बदल सकती है और डिटेक्शन कोड को विफल कर सकती है।
मुझे 404 कोड वाले xhrStatus की तलाश करके इसका पता लगाने का एक तरीका मिल गया है। इसके अलावा, मैं JSONP का उपयोग CORS प्रतिबंध को बायपास करने के लिए करता हूं। 404 के अलावा एक स्थिति कोड दिखाता है कि इंटरनेट कनेक्शन काम नहीं कर रहा है।
$.ajax({
url: 'https://www.bing.com/aJyfYidjSlA' + new Date().getTime() + '.html',
dataType: 'jsonp',
timeout: 5000,
error: function(xhr) {
if (xhr.status == 404) {
//internet connection working
}
else {
//internet is down (xhr.status == 0)
}
}
});
मरे तरीके।
<!-- the file named "tt.jpg" should exist in the same directory -->
<script>
function testConnection(callBack)
{
document.getElementsByTagName('body')[0].innerHTML +=
'<img id="testImage" style="display: none;" ' +
'src="tt.jpg?' + Math.random() + '" ' +
'onerror="testConnectionCallback(false);" ' +
'onload="testConnectionCallback(true);">';
testConnectionCallback = function(result){
callBack(result);
var element = document.getElementById('testImage');
element.parentNode.removeChild(element);
}
}
</script>
<!-- usage example -->
<script>
function myCallBack(result)
{
alert(result);
}
</script>
<a href=# onclick=testConnection(myCallBack);>Am I online?</a>
जैसे कुछ तरीकों की समस्या navigator.onLine
यह है कि वे कुछ ब्राउज़रों और मोबाइल संस्करण के साथ संगत नहीं हो रहा है, एक विकल्प है कि मुझे मदद की एक बहुत क्लासिक का उपयोग किया गया XMLHttpRequest
विधि है और यह भी संभव मामले पूर्वानुमान है कि फाइल प्रतिक्रिया के साथ कैश में जमा हो गया था XMLHttpRequest.status
से अधिक है 200 और 304 से कम है।
यहाँ मेरा कोड है:
var xhr = new XMLHttpRequest();
//index.php is in my web
xhr.open('HEAD', 'index.php', true);
xhr.send();
xhr.addEventListener("readystatechange", processRequest, false);
function processRequest(e) {
if (xhr.readyState == 4) {
//If you use a cache storage manager (service worker), it is likely that the
//index.php file will be available even without internet, so do the following validation
if (xhr.status >= 200 && xhr.status < 304) {
console.log('On line!');
} else {
console.log('Offline :(');
}
}
}
दो अलग-अलग सीनियर्स के लिए 2 उत्तर हैं: -
यदि आप एक वेबसाइट पर जावास्क्रिप्ट का उपयोग कर रहे हैं (यानी, या किसी भी फ्रंट-एंड भाग) यह करने का सबसे सरल तरीका है:
<h2>The Navigator Object</h2>
<p>The onLine property returns true if the browser is online:</p>
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = "navigator.onLine is " + navigator.onLine;
</script>
लेकिन अगर आप सर्वर साइड (यानी; नोड आदि) पर js का उपयोग कर रहे हैं, तो आप यह निर्धारित कर सकते हैं कि असफल XHR अनुरोध करने से कनेक्शन खो गया है।
मानक दृष्टिकोण कुछ बार अनुरोध को पुनः प्राप्त करने के लिए है। यदि यह नहीं गुजरता है, तो उपयोगकर्ता को कनेक्शन की जांच करने के लिए सतर्क करें, और इनायत से विफल रहें।
अनुरोध त्रुटि में सिर
$.ajax({
url: /your_url,
type: "POST or GET",
data: your_data,
success: function(result){
//do stuff
},
error: function(xhr, status, error) {
//detect if user is online and avoid the use of async
$.ajax({
type: "HEAD",
url: document.location.pathname,
error: function() {
//user is offline, do stuff
console.log("you are offline");
}
});
}
});
यहाँ मेरे पास एक सहायक उपयोगिता का एक टुकड़ा है। यह जावास्क्रिप्ट नाम दिया गया है:
network: function() {
var state = navigator.onLine ? "online" : "offline";
return state;
}
आपको इसे विधि का पता लगाने के साथ प्रयोग करना चाहिए और ऐसा करने के एक 'वैकल्पिक' तरीके को बंद करना चाहिए। समय तेजी से आ रहा है जब यह वह सब होगा जिसकी आवश्यकता है। अन्य तरीके हैक हैं।