• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JavaScriptで複数のCSVを取得しひとつのCSVごとに1つのs)

JavaScriptで複数のCSVを取得し1つのselectフォームを表示する方法

このQ&Aのポイント
  • JavaScriptを使用して、複数のCSVを取得し、それぞれのCSVごとに1つのselectフォームを表示する方法についてご教授ください。
  • aryCsvName配列にはいっている名前のCSVを取得し、getElementByIdでselectフォームに表示したいのですが、上手く値を取得できません。
  • loadCSV関数を使用してaryCsvName配列に格納されたCSVのパスを取得し、createXMLHttpRequest関数でHTTPリクエストを送信し、handleResult関数でレスポンスを処理しています。selectフォームにCSVの内容を表示する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

このケースで一番、簡単そうな解決策は、 それぞれのCSVファイルの中に、どのセレクト用なのかの 目印を書き込んでおき、それで判定だと思いますが、 それが出来ないなら、非同期通信は止めて同期通信 にして、1ファイル毎に確実に読み込む。(詳しく見てないけど)  httpObj.open("GET", path, false); かな それがいやなら、XHR(XmlHttpRequest)の、レスポンスヘッダーを コールバック関数の中で自分で調べて、何への要求か見つけて 処理を分けるといったところかな。  this.getAllResponseHeaders() どのブラウザーのXHRでも出来るかどうかは?

titikun00
質問者

お礼

回答ありがとうございます。 おっしゃるとおり、普通に同期通信でやってみました。 1ファイルごとに確実に読み込めてないんだとおもいます。リロードすればひとつひとつのファイルデータが 表示されるのですが、 一回で表示できません。 恐れ入りますが、こういった場合CSVを全部読み込んでから表示する方法というのはどのように 行うのでしょうか? ちなみに書き換えたみたコードは以下のようにしております。 <script language="javascript"> function loadCSV() { aryCsvName = ["1","2","3","4","5","6","7","8","9","10","11","12"]; var httpObj; for (var j = 0; j < aryCsvName.length; j++) { var path = './data/'+aryCsvName[j]+'.csv'; httpObj = new XMLHttpRequest(); httpObj.onload = function(){ httpObj.open("GET", path, true); httpObj.send(null); csvData = parseCSV(httpObj.responseText); var result = "<select name=\"select\""+ aryCsvName[j] + " onChange=\"\">"; for (var i = 0; i < csvData.length; i++) { result += "<option value=\"" + i + "\">" + csvData[i][0] + "</option>"; } result += "</select>"; document.getElementById("select"+ aryCsvName[j]).innerHTML = result; } } } </script> <body onload="loadCSV()"> <div id="select1"></div> ・・・・ <div id="select12"></div> </body> </html>

titikun00
質問者

補足

失礼いたしました。 httpObj.open("GET", path, true); ↓ httpObj.open("GET", path, false); に変更したらうまく動作したようです。 申し訳ないです  

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

No.1です。 無理矢理感いっぱいな気がするので参考程度に・・ loadCSV()内の >var httpObj = createXMLHttpRequest(handleResult); var httpObj = createXMLHttpRequest(handleResult, aryCsvName[j]); >function handleResult() { function handleResult(httpObj, fileName) { if ((httpObj.readyState == 4) && (httpObj.status == 200)) { var text = getAjaxFilter()(httpObj.responseText); csvData = parseCSV(text); ///ここが不明 document.getElementById("select" + fileName).innerHTML = result; //ここまで } } >function createXMLHttpRequest(cbFunc) { function createXMLHttpRequest(cbFunc, fileName) { >if (XMLhttpObject) XMLhttpObject.onreadystatechange = cbFunc; if (XMLhttpObject) XMLhttpObject.onreadystatechange = function() { cbFunc(XMLhttpObject, fileName); }; としたら、IE8、chrome、Firefoxでは動きました。

すると、全ての回答が全文表示されます。
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

ぱっと見ですが・・ 処理中のファイル名(配列の値)を保持する変数を用意します。 loadCsvのループの中で用意した変数 = aryCsvName[j]; とセットします handleResultでdocument.getElementById('select'+用意した変数).innerHTML = result; とかではダメなのですか?resultがどこにあるのかが分かりませんが・・・ というかhandleResultに引数を渡すようにすればいいだけなのか? 的外れだったらすみません。

titikun00
質問者

補足

ご回答ありがとうございます。 >というかhandleResultに引数を渡すようにすればいいだけなのか? おっしゃるとおり、var httpObj = createXMLHttpRequest(handleResult); の部分に引数を渡すようにしてみたのです。以下のように var httpObj = createXMLHttpRequest(handleResult(aryCsvName[j])); すると「実装されていない」というIEのエラーがでます。 ちなみに、resultの部分ですが、以下のように実際は記述しております。 2000文字しか入らなかったので処理の部分を書きませんでした。 var result = "<select name=\"select***\" onChange=\"\">"; for (var i = 0; i < csvData.length; i++) { result += "<option value=\"" + i + "\">" + csvData[i][0] + "</option>"; } result += "</select>"; document.getElementById("select***").innerHTML = result; 恐れ入りますがよろしくお願いいたします。

すると、全ての回答が全文表示されます。

関連するQ&A