Skip to content

form-serialize 插件

试一下,你会比你自己想象中的还要强大

Author: zhangjunchang

目标

  • 使用 form-serialize 插件,快速收集目标表单范围内表单元素的值

内容

我们前面收集表单元素的值,是一个个标签获取的

如果一套表单里有很多很多表单元素,如何一次性快速收集出来呢?

使用 form-serialize 插件提供的 serialize 函数就可以办到

form-serialize 插件语法:

  • 引入 form-serialize 插件到自己网页中

使用 serialize 函数 - 参数1:要获取的 form 表单标签对象(要求表单元素需要有 name 属性-用来作为收集的数据中属性名) - 参数2:配置对象

  • hash:
  • true - 收集出来的是一个 JS 对象结构
  • false - 收集出来的是一个查询字符串格式
  • empty:
  • true - 收集空值
  • false - 不收集空值

需求:收集登录表单里用户名和密码

对应代码:

  <!-- 
    目标在点击提交时使用form-serialize插件快速收集表单元素值
    1. 把插件引入到自己网页中
  -->
  <script src="./lib/form-serialize.js"></script>
  <script>
    document.querySelector('.btn').addEventListener('click', () => {
      /**
       * 2. 使用serialize函数,快速收集表单元素的值
       * 参数1:要获取哪个表单的数据
       *  表单元素设置name属性,值会作为对象的属性名
       *  建议name属性的值,最好和接口文档参数名一致
       * 参数2:配置对象
       *  hash 设置获取数据结构
       *    - true:JS对象(推荐)一般请求体里提交给服务器
       *    - false: 查询字符串
       *  empty 设置是否获取空值
       *    - true: 获取空值(推荐)数据结构和标签结构一致
       *    - false:不获取空值
      */
      const form = document.querySelector('.example-form')
      const data = serialize(form, { hash: true, empty: true })
      // const data = serialize(form, { hash: false, empty: true })
      // const data = serialize(form, { hash: true, empty: false })
      console.log(data)
    })
  </script>

小结

1.我们什么时候使用 form-serialize 插件?

  • 快速收集表单元素的值

2.如何使用 form-serialize 插件?

  • 先引入插件到自己的网页中,
  • 准备form和表单元素的name属性,
  • 使用serialize函数,传入form表单和配置对象

3.配置对象中 hash 和 empty 有什么用?

  • hash 决定是收集为 JS 对象还是查询参数字符串,empty 决定是否收集空值

案例-用户登录-form-serialize

目标

尝试通过 form-serialize 重新修改用户登录案例-收集用户名和密码

讲解

  1. 基于模板代码,使用 form-serialize 插件来收集用户名和密码

  2. 在原来的代码基础上修改即可

  3. 先引入插件

    <!-- 3.1 引入插件 -->
    <script src="./lib/form-serialize.js"></script>
    
  4. 然后修改代码

    // 3.2 使用serialize函数,收集登录表单里用户名和密码
    const form = document.querySelector('.login-form')
    const data = serialize(form, { hash: true, empty: true })
    console.log(data)
    // {username: 'itheima007', password: '7654321'}
    const { username, password } = data
    

小结

  1. 如何把一个第三方插件使用在已完成的案例中?

  2. 引入后,只需要使用在要修改的地方,修改一点就要确认测试一下

  3. 完整代码示例

  <!-- 3.1引入插件 -->
  <script src="./lib/form-serialize.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    // 目标1:点击登录时,用户名和密码长度判断,并提交数据和服务器通信
    // 目标2:使用提示框,反馈提示消息
    // 目标3:使用form-serialize插件,收集用户名和密码

    // 2.1 获取提示框
    const myAlert = document.querySelector('.alert')
    /**2.2 封装提示框函数,重复调用,满足提示需求
     * 功能:
     * 1. 显示提示框
     * 2. 不同提示文字msg,和成功绿色失败红色isSuccess(true成功,false失败)
     * 3. 过2秒后,让提示框自动消失
    */
    function alertFn(msg, isSuccess) {
      // 1> 显示提示框
      myAlert.classList.add('show')

      // 2> 实现细节
      myAlert.innerText = msg
      const bgStyle = isSuccess ? 'alert-success' : 'alert-danger'
      myAlert.classList.add(bgStyle)

      // 3> 过2秒隐藏
      setTimeout(() => {
        myAlert.classList.remove('show')
        // 提示:避免类名冲突,重置背景色
        myAlert.classList.remove(bgStyle)
      }, 2000)
    }

    // 1.1 登录-点击事件
    document.querySelector('.btn-login').addEventListener('click', () => {
      // 3.2  使用serialize函数,收集登录表单里用户和密码
      const form = document.querySelector('.login-form')
      const data = serialize(form, { hash: true, empty: true })
      console.log(data)
      // 解构data赋值给变量
      const { username, password } = data

      // 1.2 获取用户名和密码
      // const username = document.querySelector('.username').value
      // const password = document.querySelector('.password').value
      // console.log(username, password)

      // 1.3 判断长度
      if (username.length < 8) {
        alertFn('用户名必须大于等于8位', false)
        console.log('用户名必须大于等于8位')
        return // 阻止代码继续执行
      }
      if (password.length < 6) {
        alertFn('密码必须大于等于6位', false)
        console.log('密码必须大于等于6位')
        return // 阻止代码继续执行
      }

      // 1.4 基于axios提交用户名和密码
      // console.log('提交数据到服务器')
      axios({
        url: 'http://hmajax.itheima.net/api/login',
        method: 'POST',
        data: {
          username,
          password
        }
      }).then(result => {
        alertFn(result.data.message, true)
        console.log(result)
        console.log(result.data.message)
      }).catch(error => {
        alertFn(error.response.data.message, false)
        console.log(error)
        console.log(error.response.data.message)
      })
    })
  </script>