質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

2284閲覧

javascriptで接続状況(オンラインかどうか)の確認方法を知りたい

pecchan

総合スコア592

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/05/15 22:44

rails+javascriptでチャットアプリを作成中です。
メッセージ投稿時に接続状況を確認する必要があり、どんな方法があるのか調べてみました。

window.navigator.onLine

を使う方法が一般的なのでしょうか?
こちらを使う情報が多く見つかりました。

ところが、以下の記事には「ブラウザにより挙動に違いあり、適さない」とありました。
JavaScriptでブラウザのインターネット接続を判定する方法

とりあえず3つの方法で試してみました。
いずれかの方法で判定ができればと思いました。
・window.navigator.onLine を使う方法
・XMLHttpRequest(XHR)を使う方法
・Fetch API を使う方法

javascript

1if (window.navigator.onLine) { 2 alert("wifi online"); 3} else { 4 alert("wifi offline"); 5} 6 7fetch("/favicon.ico") 8 .then(response => { 9 alert("fetch Ok"); 10 }) 11 .catch(error => { 12 alert("Network Error"); 13 }); 14 15 16const xhr = new XMLHttpRequest(); 17 18xhr.open("GET", "/favicon.ico"); 19xhr.send(); 20 21xhr.onload = () => { 22 alert("xhr Ok"); 23}; 24 25xhr.onerror = () => { 26 alert("Network Error"); 27}; 28

###確認したこと
PCとandorid携帯でwifiを入れた状態と切った状態で動作確認しました。
※pcの回線はusb子機による無線wifiのみ

PCでwifi onの状態で確認→
「wifi online」「fetch Ok」「xhrOk」と表示されました。

PCでwifi offの状態で確認→
「wifi offline」「fetch Ok」「xhrOk」と表示されました。

疑問1
あれ?wifi接続なくてもfetchやxhrは使える??確認先が内側(/favicon.ico)だから?

さらに分からないのが、Androidの方です。
Androidではwifi on、offどちらでも
「wifi online」「fetch Ok」「xhrOk」と表示されました。

疑問2
なぜAndroidの方は、wifi切ってもオンラインになってるのでしょうか?
Androidバージョンは8.1.0、デバイスはOPPO AX7です。

ちなみに「機内モード」にしてアクセスすると、そもそも「オフラインです」
表示されalert以前にページが表示されません。

疑問3
どうすれば正しくオンラインかどうかの確認ができるのでしょうか?

分かる方教えていただけないでしょうか?
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

メッセージ投稿時に接続状況を確認する必要があり

「投稿して失敗したら、失敗した時に返すエラーコードから状態を判定する」ではだめなのでしょうか?

投稿2021/05/15 22:50

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pecchan

2021/05/15 23:37

なるほど!その発想はなかったです! それは以下のようなイメージでしょうか? $.ajax({ //省略 success: function(res) { if (res.is_success) { } else { // ここでエラー判定するということ } } }); 現状、メッセージ送信部分がjavascriptからではなく、 viewからPOST送信してます。 <form action="/messages" data-remote="true" method="post"> このような場合は、 >失敗した時に返すエラーコードから状態を判定する はどこで行うのでしょうか? コントローラでしょうか?ビューでしょうか?
m.ts10806

2021/05/16 00:22 編集

オフラインなら通信自体失敗するのでsuccessではなくfailに入るはずです。
pecchan

2021/05/16 02:57

m.ts10806様 なるほど、failでcatchするんですね。有難う御座います。 javascriptからではなく、viewのformからPOST送信しているのですが、この場合どこにエラー判定を入れるものでしょうか?
m.ts10806

2021/05/16 04:00

JavaScriptでオンライン確認してから送信しては。 formで送信したら結局リクエスト先にアクセスできないままエラー画面となるはずなので。
pecchan

2021/05/16 05:47

m.ts10806様 度々恐れ入ります。 はい、それが元の質問なのです・・・。
m.ts10806

2021/05/16 06:27

実際のリクエスト送信先で試さないと意味がないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問