jQuery中的Ajax 二

Form表单的基本使用

什么是表单

表单在网页中主要负责 数据采集功能。HTML中<form>标签,就是用于采集用户输入的信息,并通过 <form>标签的提交操作,把采集的信息提交到服务器端进行处理

表单的组成部分

 表单标签        

        表单域 包含了文本框 密码框 隐藏域 多行文本框 复选框 单选框 下拉选择框和文恶剪上传框等等

        表单按钮:通过设置type 属性为 submit 来触发 form 表单的提交

<form> 标签的属性(⭐⭐⭐)

action 

        action 属性用来规定当提交表单时         向何处发送表单数据

        action 属性的值应该是后端提供的url地址 这个url地址专门负责接收表单提交过来的数据

        当<form>表单在未制定 action属性值的清空下 action 的默认值为当前的页面的 URL 地址

        注意 当提交表单后 会立即跳转到 action 属性指定的URL 地址

target

        target 属性用来规定在何处打开 action URL

       它的可选值有5个 默认情况下 target 的值是 _self 表单在相同的框架中打开 action URL

        

 method

        menthod 属性用来规定 以何种方式 吧表单数据提交到 action URL 它的可选值有两个 分别是get 和post

        默认情况下 method 的值为 get 表示通过URL 地址的形式 吧表单数据提交到 action URL

注意 

        get 方式适合用来提交少量的 简单的数据

        post 方式适合用来提交大量的 复杂的 或包含文件上传的数据

enctype

        enctype 属性用来规定在 发送表单数据之前如何对数据进行编码

        他的可选值有三个 默认情况下  enctype 的值为application/x-www-form-urlencoded,表示在发送前编码的所有字符

        

 

表单的同步提交及缺点

什么是表单的同步提交

通过点击 submit 按钮 触发表单提交的操作 从而使页面跳转到action URL 的行为 叫做表单的同步提交

表单同步提交的缺点

        

  • <form> 表单同步提交后,整个页面会发生跳转,跳转到 action URL 所指向的地址,用户体验很差

  • <form> 表单同步提交后,页面之前的状态和数据会丢失

如何解决呢?

表单只复杂采集数据,Ajax负责将数据提交到服务器

通过Ajax提交表单数据

监听表单提交事件

jQuery 中,可以使用如下两种方式,监听到表单的提交事件

 

阻止表单默认提交行为(⭐⭐⭐)

当监听到表单的提交事件以后 可以调用事件对象的 event.prentDefault() 函数 来阻止表单的提交和页面的跳转

        

 

如何快速获取表单数据(⭐⭐⭐)

serialize() 函数

为了简化表单中数据的获取操作 jQuery 提供了 serialize()  函数 语法格式如下

 

好处:可以一次性获取表单的数据

示例代码:

 注意:在使用 serialize() 函数快速获取表单数据时,必须为每个表单元素添加 name 属性

案例-评论列表

UI结构搭建

步骤

  • 评论面板结构

    • 创建panel (快捷键:bs3-panel:primary

    • 修改title里面的标题

    • 在body 里面 创建两个输入框,加上对应的文本提示

    • 最下面加上一个 button(快捷键:bs3-button:primary

  • 评论列表结构

    • 构建一个list列表(快捷键:bs3-list-group

    • 在第一个li里面放两个 span,写入 评论时间评论人

结构代码

<body style="padding: 15px;">

  <!-- 评论面板 -->
  <div class="panel panel-primary">
    <div class="panel-heading">
      <h3 class="panel-title">发表评论</h3>
    </div>
    <form class="panel-body" id="formAddCmt">
      <div>评论人:</div>
      <input type="text" class="form-control" name="username" autocomplete="off" />
      <div>评论内容:</div>
      <textarea class="form-control" name="content"></textarea>

      <button type="submit" class="btn btn-primary">发表评论</button>
    </form>
  </div>

  <!-- 评论列表 -->
  <ul class="list-group" id="cmt-list">
    <li class="list-group-item">
      <span class="badge" style="background-color: #F0AD4E;">评论时间:</span>
      <span class="badge" style="background-color: #5BC0DE;">评论人:</span>
      Item 1
    </li>
  </ul>

</body>

获取评论列表数据

定义函数来获取评论列表数据 getCommentList() 

        查阅接口文档· 关注请求 url 是否需要携带参数 请求方式

        利用 $.ajax()  来进行请求

        在 success 回调函数中 判断请求数据是否成功 如果状态码不是200 提示用户 

示例代码

function getCommentList() {
  $.ajax({
    method: 'GET',
    url: 'http://www.liulongbin.top:3006/api/cmtlist',
    success: function (res) {
      if (res.status !== 200) return alert('获取评论列表失败!')
    }
  })
}

getCommentList()

渲染评论列表

        创建一个空数组(rows) 用来存放每一个元素的html 字符串结构

        遍历服务器返回的数据 每遍历一次 拼接一个对应的html 字符串结构 然后放入到数组中

        找到list容器 先清空一下里面的内容 然后利用 append 添加新的数据

示例代码

function getCommentList() {
  $.ajax({
    method: 'GET',
    url: 'http://www.liulongbin.top:3006/api/cmtlist',
    success: function (res) {
      if (res.status !== 200) return alert('获取评论列表失败!')
      var rows = []
      $.each(res.data, function (i, item) {
        var str = '<li class="list-group-item"><span class="badge" style="background-color: #F0AD4E;">评论时间:' + item.time + '</span><span class="badge" style="background-color: #5BC0DE;">评论人:' + item.username + '</span>' + item.content + '</li>'
        rows.push(str)
      })
      $('#cmt-list').empty().append(rows.join(''))
    }
  })
}

发表评论

改造form表单

        吧之间  panel-body 的表单改成form 标签

        吧每一个输入框设置 name 属性 name 属性的值最好与接口文档定义的参数名称一致

        注册 sumbit 事件 阻止表单提交的默认行为

        获取用户输入内容 (利用 serialize())

示例代码

      

$(function () {
  $('#formAddCmt').submit(function (e) {
    e.preventDefault()
    var data = $(this).serialize()
    })
  })
})

完成发表功能

        查阅接口文档

        利用 $.post() 发送请求 传入数据

        在成功回调函数里面判断 返回的status 是否是201 如果是代表成功 失败进行提示

        刷新页面 (调用 getCommentList()) 清空表单内容 ($('#formAddCmt')[0].reset())

示例代码

$(function () {
  $('#formAddCmt').submit(function (e) {
    e.preventDefault()
    var data = $(this).serialize()
    $.post('http://www.liulongbin.top:3006/api/addcmt', data, function (res) {
      if (res.status !== 201) {
        return alert('发表评论失败!')
      }
      getCommentList()
      $('#formAddCmt')[0].reset()
    })
  })
})

模板引擎

相关概念

之前在渲染UI结构时候,拼接字符串是比较麻烦的,而且很容易出现问题

模板引擎,它可以根据程序员指定的 模板结构数据,自动生成一个完整的HTML页面

 

好处

 

  • 减少了字符串的拼接操作

  • 使代码结构更清晰

  • 使代码更易于阅读与维护

  • art-template模板引擎

    简介

    art-template 是一个简约,超快的模板引擎,中文官首页:art-template

  • 安装(⭐⭐⭐)

  • 浏览器访问 安装 - art-template

  • 找到 安装 导航栏,找到下载链接,右键下载即可

基本使用(⭐⭐⭐)

通过传统方式渲染的过程,我们了解到,动态去渲染UI的时候需要大量去拼接字符串,比较的麻烦,而且复用性也不是很好

art-template使用步骤

  • 导入 art-template

    • 在window全局,就多了一个函数,叫做 template('模板id',需要渲染的数据对象)

    • <script src="./lib/template-web.js"></script>

      定义数据

      var data = { name: 'zs', age: 20}

      定义模板

    • 模板的 HTML 结构,必须定义到 script 标签中,注意:需要把type属性改成 text/html

    • 给 模板 添加一个 id

    • 模板里面如果需要使用到传入的数据,利用 {{}} 来实现,例如:{{name}},那么就会去找 我们调用 template() 函数 第二个参数里面对应的name属性的值

    • <script type="text/html" id="tpl-user">
          <h1>{{name}}    ------    {{age}}</h1>
      </script>

      调用 template 函数

    • 函数的返回值就是拼接好的模板字符串

    • var htmlStr = template('tpl-user', data)

      渲染HTML结构

    • 最后我们需要把template返回的模板字符串设置到页面容器中

    • $('#container').html(htmlStr)

      标准语法

      什么是标准语法

      art-template 提供了 {{}} 这种语法格式,在 {{}} 内可以进行 变量输出循环数组 等操作,这种 {{}} 语法在 art-template 中被称为标准语法

      输出

     

    在 {{}} 语法中,可以进行 变量 的输出,对象属性的输出,三元表达式输出,逻辑或输出,加减乘除等表达式输出

    原文输出

 

如果输出的 value 值中,包含了 HTML 标签结构,则需要使用原文输出语法,才能保证HTML标签被正常渲染

条件输出

如果要实现条件输出,则可以在 {{}} 中使用 if...else if.../if 的方式,进行按需输出

 

循环输出

如果要实现循环输出,则可以在{{}} 内,通过 each 语法循环数组,当前循环的索引使用 $index 进行访问,当前循环项使用 $value 进行访问

 

过滤器

 过滤器本质就是一个 function 函数

语法

过滤器语法类似于 管道操作符,它的上一个输出作为下一个输入

定义过滤器的基本语法如下:

 

案例-格式化时间过滤器

  • 定义数据

var data = { regTime: new Date() }

定义过滤器

// 定义处理时间的过滤器
template.defaults.imports.dateFormat = function (date) {
      var y = date.getFullYear()
      var m = date.getMonth() + 1
      var d = date.getDate()

      return y + '-' + m + '-' + d
}

在模板引擎中使用过滤器

  <script type="text/html" id="tpl-user">
    <h3>{{regTime | dateFormat}}</h3>
  </script>

获取新闻列表数据

  • 定义函数,获取新闻列表数据 getNewsList()

  • 查阅接口文档,关注 请求url,请求方式,请求参数,响应数据

  • 利用 $.get() 发起请求

  • 在回调函数中,判断请求是否成功

定义新闻列表item模板

  • 创建 script 标签,更改type属性值为 text/html,给模板定义id

  • 找到静态页面中 item 的结构,拷贝到模板里面

编译模板渲染结构

  • 在请求成功的回调里面,先对返回数据进行改造,里面返回的 tags 是一个字符串,我们需要分割成数组

  • 调用 template() 方法,传入id和返回的数据

  • 把函数的返回值添加到页面容器中

  • 在模板中利用 each 遍历列表

  • 利用 $value 能够拿到每一个item

  • 设置图片 img注意:需要拼接请求根路径

  • 设置标题 title

  • 设置标签,注意:标签在之前改造成数组了,这里又需要进行遍历

  • 设置来源 source

  • 设置时间,注意:时间需要格式化,利用过滤器来实现

  • 设置评论数 cmtcount

模板代码

<!-- 定义模板 -->
<script type="text/html" id="tpl-news">
   {{each data}}
   <div class="news-item">
     <img class="thumb" src="{{'http://www.liulongbin.top:3006' + $value.img}}" alt="" />
     <div class="right-box">
       <h1 class="title">{{$value.title}}</h1>
       <div class="tags">
         {{each $value.tags}}
         <span>{{$value}}</span>
         {{/each}}
       </div>
       <div class="footer">
         <div>
           <span>{{$value.source}}</span>&nbsp;&nbsp;
           <span>{{$value.time | dateFormat}}</span>
         </div>
         <span>评论数:{{$value.cmtcount}}</span>
       </div>
     </div>
   </div>
   {{/each}}
</script>

js代码

$(function () {
  // 给时间补零的函数
  function padZero(n) {
    if (n < 10) {
      return '0' + n
    } else {
      return n
    }
  }

  // 定义格式化时间的过滤器
  template.defaults.imports.dateFormat = function (dtStr) {
    var dt = new Date(dtStr)

    var y = dt.getFullYear()
    var m = padZero(dt.getMonth() + 1)
    var d = padZero(dt.getDate())

    var hh = padZero(dt.getHours())
    var mm = padZero(dt.getMinutes())
    var ss = padZero(dt.getSeconds())

    return y + '-' + m + '-' + d + ' ' + hh + ':' + mm + ':' + ss
  }

  // 获取新闻列表的函数
  function getNewsList() {
    $.get('http://www.liulongbin.top:3006/api/news', function (res) {
      if (res.status !== 200) {
        return alert('获取新闻列表数据失败!')
      }
      for (var i = 0; i < res.data.length; i++) {
        // 把每一项的 tags 属性,从字符串改造成字符串的数组
        res.data[i].tags = res.data[i].tags.split(',')
      }
      console.log(res)
      var htmlStr = template('tpl-news', res)
      $('#news-list').html(htmlStr)
    })
  }

  getNewsList()

})

模板引擎的实现原理(⭐⭐)

正则与字符串操作

exec函数

exec() 函数用于 检索字符串 中的正在表达式的匹配

如果字符串中又匹配的值,则返回该匹配值,否则返回 null

 示例代码如下:

分组

正则表达式中 () 包起来的内容表示一个分组,可以通过分组来 提取自己想要的内容,示例代码如下

字符串的 replace 函数

replace() 函数用于在字符串中 用一些字符 替换 另一些字符的

 示例代码:

多次replace

使用循环来replace

因为用户输入的字符串长度不确定,我们replace次数不确定,所以我们可以利用while循环来进行

 

实现简易的模板引擎

  • 定义模板结构

  •  预调用模板引擎

  •  封装 template 函数

  •  导入并使用自定义的模板引擎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值