LoginSignup
0
0

More than 1 year has passed since last update.

【HTML, JS】csvファイルの中身をtableに表示する

Last updated at Posted at 2022-11-19

はじめに

かんたんなWebサイトに更新履歴を表示する際,htmlファイルに直に更新履歴を追記するという方法もあるが,更新履歴を追記するためだけにhtmlファイルを開くのはナンセンスだと思った.
そこで,更新履歴はcsvファイルに記述し,jsを使って表示する,という方法を思いついたので,そのやり方と注意点をまとめる.

最初に実装したもの (良くない例)

index.html
<table id="displayCsv"></table>

<script>
function getCsv(){
  const req=new XMLHttpRequest()
  req.addEventListener("load", (event)=>{
    const res=event.target.responseText

    var line=res.split("\n")
    var str=[]
    var insert=""
    for(let i=0; i<line.length; i++){
      str=line[i].split(",")
      insert='<tr><td>'+str[0]+'</td><td>'+str[1]+'</td></tr>'
      document.getElementById("displayCsv").innerHTML+=insert
    }
  })
  req.open("GET", "input.csv", true)
  req.send()
}
//実行
getCsv()
</script>

実行結果

input.csv
2022.11.1,hogehoge
2022.11.10,fugafuga
index.html
<table id="displayCsv">
  <tbody>
    <tr>
      <td>2022.11.1</td>
      <td>hogehoge</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>2022.11.10</td>
      <td>fugafuga</td>
    </tr>
  </tbody>
</table>

問題点

  • loop毎にinnnerHTMLに加算する方法では,行ごとにtbody要素が生成されてしまう.(加算するごとにDOMノードが生成される為?)
  • 新しい履歴をcsvファイルの末尾に追記している為,この方法では最新の更新履歴が一番下に表示されてしまう.

再び実装

index.html
<table>
  <tbody id="displayCsv"></tbody>
</table>

<script>
function getCsv(){
  const req=new XMLHttpRequest()
  req.addEventListener("load", (event)=>{
    const res=event.target.responseText

    var line=res.split("\n")
    var str=[]
    var insert=""
    for(let i=0; i<line.length; i++){
      str=line[i].split(",")
      insert='<tr><td>'+str[0]+'</td><td>'+str[1]+'</td></tr>'
      document.getElementById("displayCsv").insertAdjacentHTML("afterbegin", insert)
    }
  })
  req.open("GET", "input.csv", true)
  req.send()
}
//実行
getCsv()
</script>

実行結果

input.csv
2022.11.1,hogehoge
2022.11.10,fugafuga
index.html
<table>
  <tbody id="displayCsv">
    <tr>
      <td>2022.11.10</td>
      <td>fugafuga</td>
    </tr>
    <tr>
      <td>2022.11.1</td>
      <td>hogehoge</td>
    </tr>
  </tbody>
</table>

どう直したのか

  • idtable要素ではなくtbody要素に付加した.
    → 行ごとにtbody要素が生成されるのを防げる.
    (insert=...insert+=...に変え,innnerHTML+=insertをloopの外に出したうえでinnnerHTML=insertに変えることでも解決するが,この方法では2つめの問題点を解決できない.)
  • innnerHTMLではなくinsertAdjacentHTML()を使用した.
    → これにより最新の更新履歴がいちばん上に表示されるようになる.

参考文献

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0