ตรวจสอบว่าการเชื่อมต่ออินเทอร์เน็ตออฟไลน์หรือไม่


246

วิธีการตรวจสอบการเชื่อมต่ออินเทอร์เน็ตออฟไลน์ใน JavaScript?


หากคุณสามารถใช้ websockets ได้หรือไม่ - websockets มี Event Close ซึ่งต้องถูกเรียกถ้าผู้ใช้ขาดการเชื่อมต่อกับเซิร์ฟเวอร์
Simon

คำตอบ:


135

คุณสามารถตรวจสอบว่าการเชื่อมต่อจะหายไปโดยการร้องขอ XHR ล้มเหลว

วิธีการมาตรฐานคือการลองส่งคำขออีกสองสามครั้ง ถ้ามันไม่ได้ผ่านไปเตือนผู้ใช้ในการตรวจสอบการเชื่อมต่อและล้มเหลวได้อย่างสง่างาม

Sidenote:ในการทำให้แอปพลิเคชันทั้งหมดอยู่ในสถานะ "ออฟไลน์" อาจทำให้เกิดข้อผิดพลาดในการจัดการสถานะ .. การเชื่อมต่อไร้สายอาจมาและไป ฯลฯ ดังนั้นทางออกที่ดีที่สุดของคุณคือการล้มเหลวอย่างสง่างาม ข้อมูลและแจ้งเตือนผู้ใช้ .. ทำให้พวกเขาสามารถแก้ไขปัญหาการเชื่อมต่อได้ในที่สุดหากมีอยู่และเพื่อใช้งานแอปของคุณต่อไปด้วยการให้อภัย

Sidenote:คุณสามารถตรวจสอบเว็บไซต์ที่เชื่อถือได้เช่น google สำหรับการเชื่อมต่อ แต่สิ่งนี้อาจไม่เป็นประโยชน์อย่างสมบูรณ์เพียงแค่พยายามส่งคำขอของคุณเองเพราะในขณะที่ Google อาจพร้อมให้ใช้งานแอปพลิเคชันของคุณเองอาจไม่เป็นเช่นนั้น ต้องจัดการกับปัญหาการเชื่อมต่อของคุณเอง การพยายามส่ง ping ไปยัง google จะเป็นวิธีที่ดีในการยืนยันว่าการเชื่อมต่ออินเทอร์เน็ตนั้นไม่ทำงานดังนั้นหากข้อมูลนั้นมีประโยชน์กับคุณ

Sidenote : การส่ง Pingสามารถทำได้ในลักษณะเดียวกับที่คุณทำขอ ajax สองทาง แต่การส่ง ping ไปยัง google ในกรณีนี้จะเป็นปัญหาบางอย่าง อันดับแรกเรามีปัญหาข้ามโดเมนแบบเดียวกันซึ่งโดยทั่วไปแล้วจะพบในการสื่อสาร Ajax ทางเลือกหนึ่งคือการตั้งค่าพร็อกซีฝั่งเซิร์ฟเวอร์โดยที่เราเป็นpinggoogle (หรือเว็บไซต์ใด ๆ ) และส่งคืนผลลัพธ์ของ ping ไปยังแอป นี่คือcatch-22เพราะหากการเชื่อมต่ออินเทอร์เน็ตเป็นปัญหาจริงเราจะไม่สามารถไปยังเซิร์ฟเวอร์และหากปัญหาการเชื่อมต่ออยู่ในโดเมนของเราเองเราจะไม่สามารถบอกความแตกต่างได้ สามารถลองใช้เทคนิคข้ามโดเมนอื่น ๆ ได้เช่นฝัง iframe ในหน้าเว็บของคุณซึ่งชี้ไปที่ google.com จากนั้นทำการสำรวจ iframe เพื่อความสำเร็จ / ล้มเหลว (ตรวจสอบเนื้อหา ฯลฯ ) การฝังรูปภาพอาจไม่สามารถบอกอะไรเราได้เลยเพราะเราต้องการการตอบสนองที่มีประโยชน์จากกลไกการสื่อสารเพื่อที่จะได้ข้อสรุปที่ดีเกี่ยวกับสิ่งที่เกิดขึ้น ดังนั้นการพิจารณาสถานะการเชื่อมต่ออินเทอร์เน็ตโดยรวมอาจมีปัญหามากกว่าที่ควรจะเป็น คุณจะต้องลดน้ำหนักตัวเลือกเหล่านี้สำหรับแอปเฉพาะของคุณ


84
ซ้ำแล้วซ้ำอีก "Sidenote" เสียงเหมือนดไวต์ Schrute พูดว่า "คำถาม ..." :-)
ไบรอันเคลลี่

19
ทำไม "catch-22" เป็นตัวหนา?
codingbear

33
ตอนนี้ในปี 2012 คุณสามารถตรวจสอบตัวแปร navigator.onLine;)
João Pinto Jerónimo

13
navigator.online/offline ไม่น่าเชื่อถือเช่นกันด้วยเหตุผลเดียวกัน ดูstackoverflow.com/questions/3181080/…
Efran Cobisi

17
คุณอาจต้องการลองใช้Offline.jsซึ่งเป็นไลบรารี่โอเพนซอร์ซที่สร้างขึ้นเพื่อจุดประสงค์นี้
อดัม

51

IE 8 จะรองรับคุณสมบัติwindow.navigator.onLine

แต่แน่นอนว่าไม่ได้ช่วยอะไรกับเบราว์เซอร์หรือระบบปฏิบัติการอื่น ฉันคาดการณ์ว่าผู้ขายเบราว์เซอร์รายอื่นจะตัดสินใจจัดหาอสังหาริมทรัพย์นั้นและให้ความสำคัญกับการรู้สถานะออนไลน์ / ออฟไลน์ในแอปพลิเคชัน Ajax

จนถึงที่เกิดขึ้นอย่างใดอย่างหนึ่งหรือ XHR Image()หรือ<img>คำขอสามารถให้สิ่งที่ใกล้เคียงกับการทำงานที่คุณต้องการ

อัปเดต (2014/11/16)

เบราว์เซอร์ส่วนใหญ่รองรับคุณสมบัตินี้ แต่ผลลัพธ์ของคุณจะแตกต่างกันไป

อ้างจากเอกสาร Mozilla :

ใน Chrome และ Safari หากเบราว์เซอร์ไม่สามารถเชื่อมต่อกับเครือข่ายท้องถิ่น (LAN) หรือเราเตอร์แสดงว่าออฟไลน์อยู่ เงื่อนไขอื่น ๆ trueทั้งหมดกลับ ดังนั้นในขณะที่คุณสามารถสันนิษฐานได้ว่าเบราว์เซอร์ออฟไลน์เมื่อส่งคืนfalseค่าคุณไม่สามารถสันนิษฐานได้ว่ามูลค่าที่แท้จริงจำเป็นต้องหมายความว่าเบราว์เซอร์สามารถเข้าถึงอินเทอร์เน็ตได้ คุณอาจได้รับผลบวกปลอมเช่นในกรณีที่คอมพิวเตอร์ใช้งานซอฟต์แวร์การจำลองเสมือนที่มีอะแดปเตอร์อีเธอร์เน็ตเสมือนที่เชื่อมต่ออยู่เสมอ ดังนั้นหากคุณต้องการตรวจสอบสถานะออนไลน์ของเบราว์เซอร์คุณควรพัฒนาวิธีการเพิ่มเติมสำหรับการตรวจสอบ

ใน Firefox และ Internet Explorer การสลับเบราว์เซอร์ไปที่โหมดออฟไลน์จะส่งfalseค่า เงื่อนไขอื่น ๆ ทั้งหมดคืนtrueค่า


5
navigator.onLine เป็นส่วนหนึ่งของ HTML5 - เบราว์เซอร์อื่น ๆ มีรุ่นพัฒนาอยู่แล้วซึ่งมีอยู่ใน Firefox 3 แล้ว
olliej

- แต่น่าเสียดายที่ไม่มีให้บริการใน IE เวอร์ชันก่อนหน้าซึ่งเรามักต้องการการสนับสนุน
keparo

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

5
ถ้าฉันปิด Wi-Fi บน Nexus7 ของฉันหน้ายังบอกว่า navigator.onLine เป็นจริง ไม่ดี ...
walv

42

เบราว์เซอร์หลักเกือบทั้งหมดสนับสนุนwindow.navigator.onLineคุณสมบัติและคุณสมบัติดังกล่าวแล้วonlineและofflineหน้าต่าง:

window.addEventListener('online', () => console.log('came online'));
window.addEventListener('offline', () => console.log('came offline'));

ลองตั้งค่าระบบหรือเบราว์เซอร์ของคุณในโหมดออฟไลน์ / ออนไลน์และตรวจสอบคอนโซลหรือ window.navigator.onLineคุณสมบัติสำหรับการเปลี่ยนแปลงค่า คุณสามารถทดสอบบนเว็บไซต์นี้ได้เช่นกัน

อย่างไรก็ตามโปรดอ้างอิงข้อความนี้จาก เอกสาร Mozilla :

ใน Chrome และ Safari หากเบราว์เซอร์ไม่สามารถเชื่อมต่อกับเครือข่ายท้องถิ่น (LAN) หรือเราเตอร์แสดงว่าออฟไลน์อยู่ เงื่อนไขอื่น ๆ trueทั้งหมดกลับ ดังนั้นในขณะที่คุณสามารถคิดว่าเบราว์เซอร์ออฟไลน์เมื่อผลตอบแทนfalseคุ้มค่า ,คุณไม่สามารถคิดว่าtrueคุ้มค่าจำเป็นต้องหมายความว่าเบราว์เซอร์สามารถเข้าถึงอินเทอร์เน็ต คุณอาจได้รับผลบวกปลอมเช่นในกรณีที่คอมพิวเตอร์ใช้งานซอฟต์แวร์การจำลองเสมือนที่มีอะแดปเตอร์อีเธอร์เน็ตเสมือนที่เชื่อมต่ออยู่เสมอ ดังนั้นหากคุณต้องการตรวจสอบสถานะออนไลน์ของเบราว์เซอร์คุณควรพัฒนาวิธีการเพิ่มเติมสำหรับการตรวจสอบ

ใน Firefox และ Internet Explorer การสลับเบราว์เซอร์ไปที่โหมดออฟไลน์จะส่งfalseค่า จนกว่า Firefox 41 จะมีการคืนเงื่อนไขอื่น ๆtrueค่า ตั้งแต่ Firefox 41 บน OS X และ Windows ค่าจะเป็นไปตามการเชื่อมต่อเครือข่ายจริง

(เน้นเป็นของฉันเอง)

ซึ่งหมายความว่าถ้าwindow.navigator.onLineเป็นfalse(หรือคุณได้รับofflineเหตุการณ์) คุณจะรับประกันว่าจะไม่มีการเชื่อมต่ออินเทอร์เน็ต

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

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


คำตอบที่ดีที่สุด ขอบคุณ
vibs2006

1
ฉันเพิ่งมีโอกาสได้ทำงานแบบออฟไลน์เล็กน้อย เหตุการณ์เป็นสิ่งที่ดีในการใช้งาน แต่ ios safari จะสร้างปัญหา เมื่อคุณเปิดอินเทอร์เน็ตบนโทรศัพท์ของคุณกิจกรรมออฟไลน์ / ออนไลน์จะล่าช้าได้ถึง 2 วินาทีและอาจเป็นปัญหาสำหรับเหตุผลในการแสดงผลภาพเนื่องจากคุณไม่สามารถทำนายอนาคตได้ นั่นเป็นเพียงสิ่งที่ฉันต้องการพูดถึงและอาจช่วยใครบางคน
TeeJaay

38

มีหลายวิธีในการทำสิ่งนี้:

  • AJAX ขอเว็บไซต์ของคุณเอง หากคำขอนั้นล้มเหลวอาจเป็นไปได้ว่าการเชื่อมต่อนั้นผิดพลาด JQueryเอกสารมีส่วนในการจัดการแสดง AJAX ล้มเหลว ระวังนโยบายต้นกำเนิดเดียวกันเมื่อทำสิ่งนี้ซึ่งอาจทำให้คุณไม่สามารถเข้าถึงเว็บไซต์ที่อยู่นอกโดเมนของคุณ
  • คุณสามารถใส่ลงonerrorในimgแบบ

    <img src='http://www.example.com/singlepixel.gif' 
          onerror='alert("Connection dead");' />

    วิธีนี้อาจล้มเหลวหากอิมเมจต้นทางถูกย้าย / เปลี่ยนชื่อและโดยทั่วไปจะเป็นตัวเลือกที่ด้อยกว่าสำหรับตัวเลือก ajax

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


36
 if(navigator.onLine){
  alert('online');
 } else {
  alert('offline');
 }

11
มันจะกลับมาจริงเสมอถ้าบนเบราว์เซอร์
Slavcho

2
ก่อนอื่นฉันพยายามปิดการใช้งาน LAN เท่านั้น แต่มันกลับมา TRUE เสมอ ดังนั้นเมื่อฉันปิดการใช้งานเครือข่ายทั้งหมด (LAN2, กล่องเสมือน ฯลฯ ) มันกลับมาเป็นเท็จ
Slavcho

3
คำตอบนี้ซ้ำคำตอบที่มีอยู่หลายจาก 3 ปีก่อน
JasonMArcher

2
มันไม่ได้ตรวจสอบการเชื่อมต่ออินเทอร์เน็ตมันแค่ตรวจสอบการเชื่อมต่อ LAN เพียงอย่างเดียว
Suganth G

ทำงานสำหรับฉันใน HTML 5, JavaScript, ใน mac book (โดยใช้ wifi) แม้ใช้งานบนมือถือ แต่ปัญหาคือ - เมื่อ wifi บนมันส่งกลับ TRUE ทุกครั้งที่ฉันปิด wifi รอง - ในทางกลับกัน
S.Yadav

11

HTML5 Application Cache API ระบุ navigator.onLine ซึ่งปัจจุบันมีให้บริการใน IE8 betas, WebKit (เช่น Safari) nightlies และได้รับการสนับสนุนใน Firefox 3 แล้ว


11

คุณสามารถใช้การโทรกลับของ$ .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 สตริงที่อธิบายถึงประเภทของข้อผิดพลาดที่เกิดขึ้นและวัตถุข้อยกเว้นทางเลือกหากเกิดขึ้น ค่าที่เป็นไปได้สำหรับอาร์กิวเมนต์ที่สอง (นอกเหนือจาก null) คือ "หมดเวลา", "ข้อผิดพลาด", "notmodified" และ "parsererror" นี่คือเหตุการณ์ Ajax

ตัวอย่างเช่น:

 $.ajax({
   type: "GET",
   url: "keepalive.php",
   success: function(msg){
     alert("Connection active!")
   },
   error: function(XMLHttpRequest, textStatus, errorThrown) {
       if(textStatus == 'timeout') {
           alert('Connection seems dead!');
       }
   }
 });

9

ดังที่ olliej กล่าวว่าการใช้navigator.onLineคุณสมบัติเบราว์เซอร์ดีกว่าการส่งคำขอเครือข่ายและตามด้วยdeveloper.mozilla.org/En/Online_and_offline_eventsจะสนับสนุน Firefox และ IE เวอร์ชันเก่าด้วย

เมื่อเร็ว ๆ นี้ WHATWG ได้ระบุการเพิ่มonlineและofflineเหตุการณ์ในกรณีที่คุณต้องการตอบสนองnavigator.onLineการเปลี่ยนแปลง

โปรดสังเกตลิงก์ที่โพสต์โดย Daniel Silveira ซึ่งชี้ให้เห็นว่าการใช้สัญญาณ / คุณสมบัติสำหรับการซิงค์กับเซิร์ฟเวอร์นั้นไม่ใช่ความคิดที่ดีเสมอไป


ปรับปรุง: ณ วันที่ 2015 ดูเหมือนว่าจะทำงานในเบราว์เซอร์ส่วนใหญ่ดูแผนภูมิ caniuseและบทความ
Olga

8
window.navigator.onLine

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

window.addEventListener("offline", 
  ()=> console.log("No Internet")
);

และสำหรับการตรวจสอบว่าออนไลน์:

window.addEventListener("online", 
  ()=> console.log("Connected Internet")
);

2
onLineคุณจะต้องระมัดระวังด้วย เบราว์เซอร์กำหนดสถานะของการออนไลน์แตกต่างกันมาก มีลักษณะที่developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine
Andreas Baumgart

1
คำตอบของคุณผิด คุณสมบัติ 'ออนไลน์' ไม่มีส่วนเกี่ยวข้องกับความคิดทางอินเทอร์เน็ต ดูข้อมูลอ้างอิงด้านบนเกี่ยวกับเว็บ API
Alexandre V.

7

ฉันต้องสร้างเว็บแอพ (ajax based) สำหรับลูกค้าที่ทำงานกับโรงเรียนบ่อยโรงเรียนเหล่านี้มักจะมีการเชื่อมต่ออินเทอร์เน็ตที่ไม่ดีฉันใช้ฟังก์ชั่นง่าย ๆ นี้เพื่อตรวจสอบว่ามีการเชื่อมต่อใช้งานได้ดีมาก!

ฉันใช้ 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();
        }
    });
}

6

การโทร ajax ไปยังโดเมนของคุณเป็นวิธีที่ง่ายที่สุดในการตรวจสอบว่าคุณออฟไลน์อยู่หรือไม่

$.ajax({
      type: "HEAD",
      url: document.location.pathname + "?param=" + new Date(),
      error: function() { return false; },
      success: function() { return true; }
   });

นี่เป็นเพียงการนำเสนอแนวคิดที่ควรปรับปรุง

เช่นข้อผิดพลาด = 404 ควรหมายความว่าคุณออนไลน์


4

ฉันคิดว่ามันเป็นวิธีที่ง่ายมาก

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;

ออนไลน์ไม่ได้หมายความว่ามีการเชื่อมต่ออินเทอร์เน็ต ตามdeveloper.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine 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
Shmuel Kamensky

2

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

ฉันได้พบวิธีตรวจสอบโดยค้นหา xhrStatus ด้วยรหัส 404 นอกจากนี้ฉันใช้ 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)
        }
    }
});

2
นั่นไม่ได้ผลตั้งแต่วันที่ 10-5-2016 ไม่แน่ใจว่าทำไมแค่ไม่ต้องการให้คนอื่นเสียเวลา
Bren

ผมไม่คิดอย่างนั้นมันจะทำงานสำหรับสิ่งต้องห้ามและไม่ดีข้อผิดพลาดคำขอ :)
Faisal Naseer

1

ทางของฉัน.

<!-- 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>

1

ปัญหาของวิธีการบางอย่างเช่น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 :(');
         }
     }
}

0

มีคำตอบ 2 ข้อสำหรับสองรุ่นที่แตกต่างกัน: -

  1. หากคุณใช้ JavaScript บนเว็บไซต์ (เช่นหรือส่วนหน้า) วิธีที่ง่ายที่สุดคือ:

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

  2. แต่ถ้าคุณใช้ js ในฝั่งเซิร์ฟเวอร์ (เช่นโหนด ฯลฯ ) คุณสามารถตรวจสอบว่าการเชื่อมต่อขาดหายไปโดยการร้องขอ XHR ที่ล้มเหลว

    วิธีการมาตรฐานคือการลองส่งคำขออีกสองสามครั้ง หากไม่ผ่านให้เตือนผู้ใช้ให้ตรวจสอบการเชื่อมต่อและล้มเหลวอย่างสง่างาม


0

หัวคำขอในข้อผิดพลาดคำขอ

$.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"); 
              }
         });
    }   
});

-1

นี่คือตัวอย่างของยูทิลิตี้ผู้ช่วยที่ฉันมี นี่คือ javascript เนมสเปซ:

network: function() {
    var state = navigator.onLine ? "online" : "offline";
    return state;
}

คุณควรใช้วิธีนี้กับการตรวจจับวิธีอื่นโดยไม่ต้องใช้วิธีอื่นในการทำเช่นนี้ เวลาใกล้เข้ามาเร็วเมื่อสิ่งนี้เป็นทุกอย่างที่ต้องการ วิธีการอื่นจะแฮ็ก

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