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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

3966閲覧

POST処理中のJavascript画面再描画( XMLHttpRequest.readyState の状態表示 )がしたい

yoh0811

総合スコア18

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2019/03/04 01:45

編集2019/03/04 02:40

目標

(用語や考え方が間違っていたらすみません。)
XMLHttpRequest.readyState (0~4)の状態を画面表示したい

練度

基本的なHTMLとCSSが記述できるレベル
(静的な画面表示を依頼されているなかで問題に遭遇中)

現状

正常終了(XMLHttpRequest.status===200 && XMLHttpRequest.readyState===4)
のときのみ再描画される

Javascript

1 2Foo.OnCreateSuccess = function() { 3 4// nowLoading 表示 5dispLoading('NowLoading'); 6 7// POST値受取 8var hoge = new XMLHttpRequest(); 9hoge.open('POST', 'https://httpbin.org/post'); // ←適当にPOSTできるサイト 10hoge.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); 11var replaceData = POSTする各値をセット; 12hoge.send(replaceData); 13 14// 決済開始イベント 15hoge.onreadystatechange = function() { 16 try{ 17 if( hoge.status===200 ){ 18 switch( hoge.readyState ){ 19 case 2: 20 console.log("POST readyState 2/4"); 21 dispLoading('2/4'); 22 break; 23 case 3: 24 console.log("POST readyState 3/4"); 25 dispLoading('3/4'); 26 break; 27 case 4: 28 console.log("POST readyState 4/4"); 29 dispLoading('4/4'); 30 if(hoge.responseText.indexOf('success')>0){ 31 console.log("success"); 32 showPayinfo_after(); 33 } 34 break; 35 default: 36 dispLoading('connect'); 37 console.log("HTTP connection success"); 38 break; 39 } 40 }else{ 41 console.log('HTTP error status:' + hoge.status ); 42 showPayinfo_ng(hoge.status); 43 } 44 45 }catch(e){ 46 console.log('例外を捕捉: ' + e.description); 47 showPayinfo_ng('例外を捕捉: ' + e.description); 48 return; 49 } 50 } 51 52}

Javascript(Loading画面)

1 2/*------------------------------ 3Loading 画面表示 4------------------------------*/ 5function dispLoading(msg){ 6 7 // #loading があればいったん解除 8 removeLoading(); 9 10 if( msg == undefined ){ msg = ""; } 11 12 // 画面表示メッセージ 13 var dispMsg = "<div class='loadingMsg'>" + msg + "</div>"; 14 15 // ローディング画像が表示されていない場合のみ出力 16 if($("#loading").length == 0){ 17 $("body").append("<div id='loading'>" + dispMsg + "</div>"); 18 } 19} 20 21/*------------------------------ 22Loading 画面解除 23------------------------------*/ 24function removeLoading(){ 25 $("#loading").remove(); 26} 27

Javascript(終了後の画面)

1 2/*------------------------------ 3終了後の画面表示 4------------------------------*/ 5function showPayinfo_after() { 6removeLoading(); 7$('#dialog-box').hide(); 8$('#dialog-overlay').hide(); 9$('#message').hide(); 10$('#before_pay').hide(); 11$('#after_pay').show(); 12$('#ng_pay').hide(); 13} 14

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

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

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

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

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

yambejp

2019/03/04 02:07

status=200を前提とするのにreadyState=4以外をとって何がしたいのでしょうか?
yoh0811

2019/03/04 02:38

yambejp さま 処理待ち時間が長いため、「2/4→3/4→4/4→success」と進捗の状態表示をしたいのが主な目的です。
yambejp

2019/03/04 03:31

回答つけましたが、読み込み開始から読み込み終わりまでを 単にsetIntervalでLoading画面を出す方がロジックが簡単です
guest

回答2

0

ベストアンサー

サーバー側の処理のバッファリング次第ですね
なにも対策しないとreadyStateの2,3,4はほぼ同時にシフトします

たとえばサーバー側をPHPで処理する場合こう

  • mypage.htm

HTML

1<script> 2var xhr = new window.XMLHttpRequest(); 3xhr.open("post","xhr.php"); 4xhr.send(); 5xhr.onreadystatechange=function(){ 6 if(xhr.status == 200){ 7 switch(xhr.readyState){ 8 case 2: 9 document.querySelector('#load').textContent='Loading '; 10 break; 11 case 3: 12 document.querySelector('#load').textContent+='.'; 13 break; 14 case 4: 15 document.querySelector('#load').textContent=''; 16 document.querySelector('#content').textContent=xhr.responseText; 17 break; 18 }; 19 } 20} 21</script> 22<div id="load"></div> 23<div id="content"></div>
  • xhr.php

PHP

1<?PHP 2$str='echo " ";'; 3passthru($str); 4ob_flush(); 5flush(); 6$str='sleep 3 ; echo " ";'; 7passthru($str); 8ob_flush(); 9flush(); 10$str='sleep 1 ; echo " ";'; 11passthru($str); 12ob_flush(); 13flush(); 14$str='sleep 2 ; echo "content";'; 15passthru($str); 16ob_flush(); 17flush(); 18ob_end_flush();

※OSのwait処理を使うのでOSによってはsleepを
「timeout /t nn > null」のような適当なwaitに変える必要があります

サーバー側に都度ゴミデータを履かせないとreadyState=3が拾えません。
readyState=2を待たないでも読み込み開始のトリガーからreadyState=4までを
setIntervalしてもよいかも。

投稿2019/03/04 03:28

編集2019/03/04 03:30
yambejp

総合スコア114814

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

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

yoh0811

2019/03/04 06:35

ご指摘いただいたとおり、順番にそれぞれの画面(2/4~4/4)の表示状態で 止めてみたところ、きちんと表示されていることが確認できました。 一瞬で通り過ぎていただけだったんですね。 私の練度が至らずPHPも絡めた処理は実現できませんでしたが、 setInterval 含め引き続き勉強したいと思います。 ありがとうございました。
guest

0

hoge.status===200readyState4 になっていないと採れません。

【XMLHttpRequest.status - Web API | MDN】
https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/status

【【メモ】XMLHttpRequestのイベントについて - Qiita】
https://qiita.com/ShinyaKato/items/64b6726c361f5377b0f3

投稿2019/03/04 02:57

編集2019/03/04 06:02
kei344

総合スコア69407

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

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

Lhankor_Mhy

2019/03/04 03:45

ご提示のQiita記事には、「readyStateが2以上の時アクセス可能」と書いてありますね。
kei344

2019/03/04 04:50 編集

To: Lhankor_Mhyさん それはreadyState自体なのでは? hoge.statusが200になるのはreadyState が4の時(それ以前は0)という回答です。(私の勘違いかも)
Lhankor_Mhy

2019/03/04 05:05

当方の環境で試してみたところ、HEADERS_RECEIVED 時点で取れました。 XHRのサンプルコードを見ると、HEADERS_RECEIVED 時点でレスポンスヘッダを取りに行っているので、ステータスコードだけ取れない、というのも少し変な感じがします。 https://xhr.spec.whatwg.org/#the-getresponseheader()-method
kei344

2019/03/04 06:01

確かにそうですね、指摘ありがとうございます。
yoh0811

2019/03/04 06:28

Lhankor_Mhyさま readyStatus=4 まで 0 から順番に来るものと思って、初期バージョンは case 0,1 もありました(お恥ずかしい)。 Qiita記事、参考になりました、ありがとうごいざいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問