Js的dom综合信息表单的处理方法

150 阅读3分钟

综合表单.jpg

snipaste20220120_192809.jpg

snipaste20220120_192827.jpg

snipaste20220120_192959.jpg

方法: 看到这个表单 首先进行思路分析!!

第一步

1.1 因为是要将输入的信息输入到下方表单中, 因此要考虑到上方用户输入信息的可用性

1.2 首先找到需要输入的表单元素(css选择器),也就是调用元素
// 首先创建三个标签 将数组的信息分别打印进去标签里面 然后把标签放进tbody中的最后面 // 先找出所有需要用到的元素

      let tbody = document.querySelector('tbody') // 装tr标签的元素
      let age = document.querySelector('.age') // 年龄
      let uname = document.querySelector('.uname')  // 姓名
      let city = document.querySelector('.city') // 成熟
      let salary = document.querySelector('.salary')  // 薪水
      let gender = document.querySelector('.gender') // 性别
      let add = document.querySelector('.add')   // '录入'按钮
      let form = document.querySelector('form')   // 表单

      for (let i = 0; i < arr.length; i++) {
        let tr = document.createElement('tr')  // 创建tr标签


        tr.innerHTML = `
           <td>${arr[i].stuId}</td>
           <td>${arr[i].uname}</td>
           <td>${arr[i].age}</td>
           <td>${arr[i].gender}</td>
           <td>${arr[i].salary}</td>
           <td>${arr[i].city}</td>
           <td>
             <button class="up">上移</button>
             <button class="down">下移</button>
             <a href="javascript:" class="delete">删除</a>
           </td>
        `
        
        tbody.appendChild(tr)

      }

第二步

1.3 表单元素存在默认事件(默认行为) 每次输入信息后点击会被带进别的事件中(比如跳转页面),需要进行默认事件阻止

1.4 因为性别和就业城市是下拉表单元素,不需要用户输入信息,因此在给"录入"按钮注册事件时只需要考虑 姓名、年龄以及信息三个表单元素的信息的输入情况即可

1.5

  • 如果不满足条件弹出警告框,form表单数据清空

  • 如果满足,创建新标签,标签内部放入相应的元素,放入tbody中的最后方,并且清空数据,用来进行新的信息输入

      // 注册点击事件  先检测内部消息输入情况
      add.onclick = function (e) {
        e.preventDefault() // 关闭表单默认样式

        if (uname.value.trim() == '' || age.value.trim() == '' || salary.value.trim() == '') { // 判断文字信息
          alert('请输入正确的信息!!!')
          form.reset() 
        } else { // 否则打出表单,创建标签

          let tr = document.createElement('tr')

          tr.innerHTML = `
              <td>1001</td>
              <td>${uname.value}</td>
              <td>${uname.age}</td>
              <td>${uname.gender}</td>
              <td>${uname.salary}</td>
              <td>${uname.city}</td>
              <td>
                 <button class="up">上移</button>
                 <button class="down">下移</button>
                <a href="javascript:" class="delete">删除</a>
              </td>
          `

          tbody.appendChild(tr)
        }
      }

第三步

1.6 对删除、上移、下移三种功能进行事件委托,因为三个按钮都是动态生成的,一开始没有,无法找到

1.7 由于tbody标签不是动态新增的,因此对他们的父元素tbody注册事件,然后指定目标区域进行事件委托,这种方法用于对变动生成的tr标签使用,用来准确找到里面的功能按钮

1.8

  • 对于删除功能,点击这个删除按钮所在区域,然后整个父元素tr全部删除
  • 对于上移功能,如果这个tr标签前面存在元素,才能进行交换位置,把这个元素放到前面的元素的前面
  • 对于下移功能,如果这个tr标签后面存在元素,才能进行交换位置,把这个元素放到后面的后面的元素的前面
  • 注意这里不要单独设置三个if结构语句 因为这样的话第一个if条件不生效 后面的其他if条件仍然会进行运行 这样会增加网页加载判断的时间和负担
  • 直接使用一个if结构语句 其他的条件不生效的话直接取消运行if语句 增减网页运行速度和效率
      tbody.onclick = function (e) {
       // 将指向的真正点击的子元素的父亲的父亲设定为tr标签
        let tr = e.target.parentNode.parentNode // tr 元素
        
        if (e.target.classList.contains('delete')) { // 将点击的事件委派给里面的删除键  设定里面的点击生效范围    
          
          tbody.removeChild(tr)
          
        } else if (e.target.classList.contains('up')) {

          if (tr.previousElementSibling) { // 如果前面有tr标签 生效 
            tbody.insertBefore(tr, tr.previousElementSibling) // 将当前元素放到前面的元素的前面
          }
        } else if (e.target.classList.contains('down')) {

          if (tr.nextElementSibling) { // 如果后面有tr标签 生效
            tbody.insertBefore(tr, tr.nextElementSibling.nextElementSibling) // 将当前元素放到后面的后面的元素的前面
          }
          
        }

      }