Home  >  Q&A  >  body text

HTML table repeats content on every submit click

My program takes a .csv file, reads information from it and sends it to an HTML table in js. Additionally, I have input fields for future actions. It can search the entire table for data by the entered filter.

The problem is that if the form is already generated and I click "Submit" again, my form appears again and a copy is created (as shown in the picture)

The problem is how to make it not copy when submitting

.html:

<!DOCTYPE html>
<html lang="en">
   <head>
      <title>Excel Transform Site</title>
      <link rel="stylesheet" href="./excel-transfrom.css">
   </head>
   <body>
      <form id="input-form">
         <input type="file" id="file-choose" apply=".csv">

         <label class="test-input-label">Test Input</label>
         <input type="text" id="test-input">
         <input type="submit" value="Submit" class="submit-button">
      </form><br>

      <table id="data-table"></table>

      <script src="./excel-transform.js"></script>
   </body>
</html>         

.js:

const inputForm = document.getElementById("input-form")
const file = document.getElementById("file-choose")
const filterInput = document.getElementById("test-input")

let table = document.createElement("table")
let thead = document.createElement("thead")
let tbody = document.createElement("tbody")

function csvToArray(str, delimiter=',') {
   const headers = str.slice(0, str.indexOf("\n")).split(delimiter)
   const rows = str.slice(str.indexOf("\n") + 1).split("\n")

   headers.pop()

   const arr = rows.map((row) => {
      const values = row.split(delimiter)
      const element = headers.reduce((object, header, index) => {
         object[header] = values[index]
         return object
      }, {})
      return element
   })

   return arr
}

inputForm.addEventListener("submit", (e) => {
   e.preventDefault()

   const input = file.files[0]
   const reader = new FileReader()

   reader.onload = function(e) {
      const text = e.target.result
      const data = csvToArray(text)
      
      table.appendChild(thead)
      table.appendChild(tbody)

      document.getElementById('data-table').appendChild(table)
      
      let hrow = document.createElement('tr')
      for (let i = 0; i < Object.keys(data[0]).length; i++) {
         let theader = document.createElement('th')

         theader.innerHTML = Object.keys(data[0])[i]
         hrow.appendChild(theader)
      }
      thead.appendChild(hrow)

      for (let i = 0; i < data.length; i++) {
         let drow = document.createElement('tr')
         console.log(data[i])
         for (let j = 0; j < Object.values(data[i]).length; j++) {
            let tdata = document.createElement('td')

            tdata.innerHTML = Object.values(data[i])[j]

            drow.appendChild(tdata)
         }
         tbody.appendChild(drow)
      }
   }

   reader.readAsText(input)
})

P粉706038741P粉706038741240 days ago399

reply all(1)I'll reply

  • P粉384366923

    P粉3843669232024-02-22 16:04:35

    Solution found

    The replaceChildren approach has already been suggested in the comments section, but I decided to use
    .innerHTML = '' instead

    Therefore, when the submit event occurs, the table content will be innerHTML = '' if isn't erased

    This is what the js code looks like now:

    const inputForm = document.getElementById("input-form")
    const file = document.getElementById("file-choose")
    const filterInput = document.getElementById("test-input")
    
    let table = document.createElement("table")
    let thead = document.createElement("thead")
    let tbody = document.createElement("tbody")
    
    function csvToArray(str, delimiter=',') {
       const headers = str.slice(0, str.indexOf("\n")).split(delimiter)
       const rows = str.slice(str.indexOf("\n") + 1).split("\n")
    
       headers.pop()
    
       const arr = rows.map((row) => {
          const values = row.split(delimiter)
          const element = headers.reduce((object, header, index) => {
             object[header] = values[index]
             return object
          }, {})
          return element
       })
    
       return arr
    }
    
    inputForm.addEventListener("submit", (e) => {
       e.preventDefault()
    
    \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
       table.innerHTML = ''
       thead.innerHTML = ''
       tbody.innerHTML = ''
    /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
    
       const input = file.files[0]
       const reader = new FileReader()
    
       reader.onload = function(e) {
          const text = e.target.result
          const data = csvToArray(text)
          
          table.appendChild(thead)
          table.appendChild(tbody)
    
          document.getElementById('data-table').appendChild(table)
          
          let hrow = document.createElement('tr')
          for (let i = 0; i < Object.keys(data[0]).length; i++) {
             let theader = document.createElement('th')
    
             theader.innerHTML = Object.keys(data[0])[i]
             hrow.appendChild(theader)
          }
          thead.appendChild(hrow)
    
          for (let i = 0; i < data.length; i++) {
             let drow = document.createElement('tr')
             console.log(data[i])
             for (let j = 0; j < Object.values(data[i]).length; j++) {
                let tdata = document.createElement('td')
    
                tdata.innerHTML = Object.values(data[i])[j]
    
                drow.appendChild(tdata)
             }
             tbody.appendChild(drow)
          }
       }
    
       reader.readAsText(input)
    })
    

    reply
    0
  • Cancelreply