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

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

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

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

Q&A

解決済

2回答

6727閲覧

サーバに置いたファイルの読み込みが完了したタイミングで読み込んだファイル内容を配列にしたい

Nooki

総合スコア20

JavaScript

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

0グッド

0クリップ

投稿2016/05/03 17:03

###前提・実現したいこと
htmlを開いた際にサーバに置いているファイルを非同期で読み込み、読み込みが完了したら読み込んだ内容を配列にセットしたいです。
更に上記の処理を関数にし、ファイル名を引数に渡すことで汎用的に使用できるようにしたいと考えています。

###発生している問題・エラーメッセージ

XMLHttpRequestクラスを使って読み込だファイルの内容をrteurnで返すと、undifinedになってしまう。 読み込んだ内容を関数内で処理すればよいがファイル名が関数内にベタ書きになってしまう。

###該当のソースコード

//下記は関数定義の記述です。 function loadFile(fileName){ var httpObj = new XMLHttpRequest(); httpObj.open('GET', fileName+"?"+(new Date()).getTime(), true); httpObj.send(null); httpObj.onreadystatechange = function(){ if ( (httpObj.readyState == 4) && (httpObj.status == 200) ){ //ここに何か書けばよいのだろうが記述方法がわからない。 //alert(httpObj.responseText); } } } <!--下記はhtmlの記述です。--> <script type="text/javascript"> loadFile("sample.txt"); </script>

###試したこと
読み込んだファイルの内容をalertで表示することはできました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

もしかして、loadFile()をこんな風に使えるようになりたいということでしょうか?

JavaScript

1var list = [], resultText; 2resultText = loadFile('htttp://example.jp/test.txt'); 3list.push(resultText); 4// 以下、listに対する処理が続く

上のような処理ができるloadFile()を実装することはできません。JavaScriptは非同期であり__処理を待つ__という動作自体ができないからです。できることは__何かが起きたときに行う処理を設定する__ことで、XMLHttpRequestではonreadystatechangeでの設定がそれにあたります。

では、今回のような場合はどのようにするかというと、コールバックを使います。

JavaScript

1function loadFile(fileName, callback){ 2 var httpObj = new XMLHttpRequest(); 3 httpObj.open('GET', fileName+"?"+(new Date()).getTime(), true); 4 httpObj.send(null); 5 httpObj.onreadystatechange = function(){ 6 if ( (httpObj.readyState == 4) && (httpObj.status == 200) ){ 7 callback(httpObj.responseText); 8 } 9 } 10} 11 12var list = []; 13loadFile('htttp://example.jp/test.txt', function(resultText) { 14 list.push(resultText); 15 // 以下、listに対する処理が続く 16});

コールバック関数の中身は、データを取得した後に非同期で実行されます。つまり、処理を待ってから行ったといると言えます。JavaScriptはこのようにブロックする処理自体が存在できないため、コールバックを使って、次にやりたい処理をなかにどんどん書き足していく形になります。

なお、このコールバックですが、どんどんコールバックを追加していくと処理が深くなり、複雑になってしまう場合があります(コールバック地獄と呼ばれる)。それを回避するためにECMAScript2015からはPromiseというのが用意されていますので興味があれば調べてみてください。

投稿2016/05/03 23:04

raccy

総合スコア21735

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

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

Nooki

2016/05/04 00:38

まさに、やりたい処理は回答頂いた内容です。処理終了時に実行する関数をコールバック関数と言うのですね。勉強になりました。今、出先で試せないので帰ったら試します。
guest

0

「JavaScript DOM」で検索されれば、ひとまず HTML を JavaScript から操作する方法が見つかると思います。

【初心者のためのJavaScript入門(7):JavaScriptでDOMに挑戦 (1/2) - @IT】
http://www.atmarkit.co.jp/ait/articles/1102/07/news137.html

【JavaScriptでDOMを操作する方法【初心者向け】 | TechAcademyマガジン】
http://techacademy.jp/magazine/5638


また、呼び出すテキスト内が JSON / CSV 等である場合は処理がかわるため、どういう運用(どういうデータをどの環境でどのように表示し、その先どのような処理をするのか)を目指しているのかをもう少し具体的に、質問文に追記いただいたほうが回答を得られやすいと思います。

投稿2016/05/03 17:17

編集2016/05/03 18:12
kei344

総合スコア69398

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

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

Nooki

2016/05/04 00:34

回答ありがとうございます。 読み込むファイル形式も汎用的にしたいです。例えば、ファイルに応じて実行する処理を変えたいです。質問の内容が具体的でなく失礼しました。
kei344

2016/05/04 02:30

すみません、勘違いしていました。出力部分ではなく配列に入れる部分ですね。それなら raccyさんが書かれたやりかたです。 > 読み込むファイル形式も汎用的にしたいです。 テキストで書かれたものだけでも JSON / CSV / HTML / CSS などとかなりの数があり、それぞれ最適な表示方法(利用方法)があります。さらに Excelファイル / 画像ファイル / zipファイル など、ファイル形式は無数にあります。 「どの環境でどのように表示し、その先どのような処理をするのか」がそれぞれのファイル形式で違うため、なるべく「具体的に」伝えられたほうが、と思います。が、今回の質問とは直接は関係が無いですね、すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問