🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
XHR

XHR(別名XMLHttpRequest)はJavaScriptなどのスクリプト言語を使ってサーバーとHTTP通信を行うAPIを指します。

JavaScript

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

Q&A

解決済

2回答

9555閲覧

XHRでresponseTextがうまく取得できない。

ar0890

総合スコア5

XHR

XHR(別名XMLHttpRequest)はJavaScriptなどのスクリプト言語を使ってサーバーとHTTP通信を行うAPIを指します。

JavaScript

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

0グッド

1クリップ

投稿2020/03/25 09:48

編集2020/03/25 09:57

初めまして。
JavaScriptでどうにも分からない事が出来たため、ご質問させていただきます。
皆様の知恵をお借りいただければと思っております。
どうぞ、宜しく願いいたします。

##XHRのresponseTextがうまく取得できない
趣味でJavaScriptとPHPの非同期通信を使ったアプリを作ろうとしています。
現在分からない事は、この非同期通信の部分でresponseTextが取得できません。

この"取得できない"と言うのは少し語弊がありまして
"取得はできているが、そのデータを扱おうとした時に扱うことができない"の方が正しいかもしれません。

##実際みてみる
xhrオブジェクトの中身をみてみますと、やはり取得自体は出来ているようです。

イメージ説明

しかしこれを

js

1console.log(xhr.responseText);

などで利用しようとすると

イメージ説明

中身が空扱いになり、扱うことができません。

##理由が全然分からない
xhrオブジェクトのresponsTextプロパティには、間違いなく値は入っているにもかかわらず、
何故、その値を使用しようとするとできないのでしょうか?

皆様の知識でお教えいただければと思います。

宜しくお願いいたします。

##追記
ご指摘をいただきましたので、該当のJavaScriptファイルのソースコードを記載します。
宜しくお願いいたします。

js

1'use strict'; 2 3const w = window, 4 d = document 5 ; 6 7const $ = id => { 8 return d.getElementById(id); 9} 10 11const $t = tag => { 12 return d.getElementsByTagName(tag); 13} 14 15const $c = cls => { 16 return d.getElementsByClassName(cls); 17} 18 19class User{ 20 21 constructor(){ 22 const form = $t('form'); 23 this.xhr = new XMLHttpRequest(); 24 25 for(let i=0; i < form.length; i++){ 26 form[i].addEventListener('submit', (e) => { 27 return e.preventDefault(); 28 }); 29 } 30 31 $('tweet_btn').addEventListener('click', () => { 32 this.postTweet(); 33 this.getNewTweets(); 34 }); 35 36 this.xhr.onreadystatechange = () => { 37 if (this.xhr.readyState === 4 && this.xhr.status === 200){ 38 } 39 } 40 } 41 42 postTweet() { 43 const url = './tweet.php', 44 tweet_msg = $('tweet_msg').value, 45 data = { 46 tweet : tweet_msg, 47 mode : 'ALL' 48 } 49 ; 50 51 this.xhr.open('POST', url); 52 this.xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8'); 53 this.xhr.send(JSON.stringify(data)); 54 } 55 56 getNewTweets() { 57 const url = './tweet.php', 58 latest = $c('tweet_date').item(0).innerText, 59 data = { 60 latest : latest, 61 mode : 'LATEST' 62 } 63 ; 64 65 this.xhr.open('POST', url); 66 this.xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8'); 67 this.xhr.send(JSON.stringify(data)); 68 console.log(this.xhr.responseText); 69 } 70 71} 72 73const user = new User();

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

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

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

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

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

yambejp

2020/03/25 09:55

パラメータ無しでlocalhostのtweet.phpにアクセスすると 「これはresponseTextです」が取得できるという仕様でしょうか?
ar0890

2020/03/25 09:59

Lhankor_Mhy様 申し訳ありませんでした。 追記いたしましたので、宜しくお願いいたします。
ar0890

2020/03/25 10:00 編集

yambejp様 そのご認識であっています。 後にjsonを扱うつもりではありますが、取りあえずで試してみた所、 質問のエラーが出て困っている所です。
yambejp

2020/03/25 10:05

回答付けておきました jsonに変換したい場合は res.text()をres.json()としてください
ar0890

2020/03/25 10:12

重ね重ねありがとうございます。 textとjsonの扱いが違うのは承知しておりましたが、 取り合えず今理解できてない部分から理解をして次に進もうと思っています。 Lhankor_Mhy様もお忙しい中ありがとうございました。
guest

回答2

0

ベストアンサー

javascript

1fetch('tweet.php').then(res=>res.text()).then(console.log); 2

投稿2020/03/25 09:56

yambejp

総合スコア116661

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

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

ar0890

2020/03/25 10:11

ありがとうございます。 コピペですが、無事にデータを取得する事が出来ました。 正直、理解がおいついていませんが、非同期通信と同期通信のデータの扱いに合わせて、 そちらの構文を説明してるドキュメントを見ながら理解を深めていこうと思います。
yambejp

2020/03/25 10:15

xhrはほぼfetchにリプレースされつつあります 非同期通信、データ渡しが楽になり 戻り値のデータ変換も簡単にできるので この手の処理では基礎的な技術になっています
ar0890

2020/03/25 10:26

jQueryを使わずAjaxを扱うとなると、xhrが基本と思っておりましたが、 現在ではそうなっているのですね。 自分の知見の狭さがただただお恥ずかしい限りです。 詳しくお教えいただきありがとうございます。
guest

0

IEサポートする理由がなければ、yambejp さんの回答を参考に fetch() で実装したほうが良いと思います。

理由が全然分からない

readyState が 4 未満のため、データを参照できない状態だからです。

ご質問のconsole.log(this.xhr.responseText)console.log(this.xhr.readyState) に変えて確認してみてください。

javascript

1 this.xhr.onreadystatechange = () => { 2 if (this.xhr.readyState === 4 && this.xhr.status === 200){ 3 console.log( this.xhr.responseText ); 4 } 5 }

投稿2020/03/25 10:16

AkitoshiManabe

総合スコア5434

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

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

ar0890

2020/03/25 10:25

そういう事なんですね。 理解不足な部分が多々ありお恥ずかしい限りです。 正直readyStateの事はあまりよくわかっていなかったので、ご指摘の通りに色々試してみようと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問