二.form表单与模板引擎

form表单与模板引擎

 一、form表单的基本使用

 1.1 表单的概念

 表单在网页中主要负责数据采集功能 通过from功能 通过from标签提交操作

 1.2 表单的组成部分

  • 表单标签 <form>
  • 表单域: 包含文本框 密码框 隐藏域 多行文本框 复选框 单选框 文件上传框
  • 表单按钮 <button type="submit">

1.3 form标签的属性

  • 用来规定如何把采集到的数据发送到服务器
  • action(向何处发送表单数据) 默认为当前页面的url,当提交表单后,会立即跳转到action属性指定的url地址
  • target属性用来规定在何处打开action url

  • method 以何种方式提交表单数据(get post)
    • get提交少量简单的数据(默认值)
    • post提交大量 复杂的 或包含文件上传的数据
  • enctype 规定在发送表单数据之前如何对数据进行编码

1.4 表单的同步提交和缺点

 点击 submit 按钮,触发表单提交的操作,从而使页面跳转到 action URL 的行为,叫做表单的同步提交。
缺点
<form>表单同步提交后,整个页面会发生跳转,跳转到 action URL 所指向的地址,用户体验很差。
<form>表单同步提交后,页面之前的状态和数据会丢失
解决表单同步提交的缺点
表单只负责采集数据 Ajax负责将数据提交到服务器

二、通过Ajax提交表单数据

2.1 监听表单提交事件

jQuery中有下边两种方式
  //第一种方式
       $('#f1').submit(function () {
         alert('监听到表单的提交')
       })
      // 第二种方式
      $('#f1').on('submit', function () {
        alert('监听到了2')
      })

2.2 阻止表单默认提交行为

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

$(function () {
      //第一种方式
      $('#f1').submit(function (e) {
        // 组织表单的提交和页面的跳转
        alert('监听到表单的提交')
        e.preventDefault()

      })
      // 第二种方式
      // $('#f1').on('submit', function (e) {
      //   alert('监听到了2')
      // 组织表单的提交和页面的跳转
      // e.preventDefault()

      // })
    })

2.3 快速获取表单中的数据

serialize()函数

  • 一次性获取表单中的所有数据
  • 必须为每个表单元素添加name属性,且name不能重复
 $(function () {
      // 第一种方式
      /* $('#f1').submit(function (e) {
        e.preventDefault()
        var data = $(this).serialize()
        console.log(data)
      }) */

      // 第二种方式
      $('#f1').on('submit', function (e) {
        e.preventDefault()
        var data = $('#f1').serialize()
        console.log(data)
      })
    })

三、评论列表案例

引入的库
<script src="./lib/jquery.js"></script>
<link rel="stylesheet" href="./lib/bootstrap.css">
<script src="./js/cmt.js"></script>

 html部分

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<script src="./lib/jquery.js"></script>
<link rel="stylesheet" href="./lib/bootstrap.css">
<script src="./js/cmt.js"></script>

<body style="margin: 15px;">
  <!-- 评论面板 -->

  <div class="panel panel-primary">
    <div class="panel-heading">
      <h3 class="panel-title">发表评论</h3>
    </div>
    <form class="panel-body" id="formAddcmt">
      <div naem="">评论人:</div>
      <input type="text" class="form-control" name="username">
      <div naem="">评论内容:</div>
      <textarea class="form-control" name="content"></textarea>
      <button type="submit" class="btn btn-primary" naem="">发表评论</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>

</html>

js部分

function getCommenrList(){
  $.ajax({
    method:'GET',
    url:'https://ajax-base-api-t.itheima.net/api/cmtlist',
    success:function(res){
      console.log(res);
      if(res.status!==200)return  alert('获取评论列表失3败')
      let rows=[]
      $.each(res.data,function(i,item){
        let 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(''))
    }

  }) 
}
getCommenrList()


$(function(){
$('#formAddcmt').submit(function(e){
  e.preventDefault();
  var data = $(this).serialize()
$.post('https://ajax-base-api-t.itheima.net/api/addcmt',data,function(res){
if(res.status!==201)return alert('发表评论失败')
getCommenrList()
})
})
})

五、art-template模板引擎

5.1 art-template简介

 5.2安装

5.3 使用步骤

  <!-- 1. 导入模板引擎 -->
  <!-- 在 window 全局,多一个函数,叫做 template('模板的Id', 需要渲染的数据对象) -->
  <script src="./lib/template-web.js"></script>
    var data = {
      title: '<h3>用户信息</h3>',
      name: 'zs',
      age: 20,
      isVIP: true,
      regTime: new Date(),
      hobby: ['吃饭', '睡觉', '打豆豆']
    }
  <!-- 3.定义模板-->
  <!-- 3.1模板的HTML结构,必须定义到script中 -->
  <script type="text/html" id="tpl-user">
    <h1>{{name}}-------{{age}}</h1>
    {{@ test }}
    <div>
    // 4.调用template函数
    let htmlStr = template('tpl-user', data)
    console.log(htmlStr);
    // 4.调用template函数
    let htmlStr = template('tpl-user', data)
    console.log(htmlStr);
    // 5.渲染HTML结构
    $('#container').html(htmlStr)

5.4 标准语法

 

    <div>
      {{if flag===0}}
      falg的值是0
      {{else if flag===1}}
      falg的值是1
      {{/if}}

    </div>

 循环输出{{ }} 内,通过 each 语法循环数组

 

 当前的循环项使用 $value 

{{each hobby}}
	<li>索引是:{{$index}},循环项是:{{$value}}</li>
  {{/each}}
    • [官网地址](http://aui.github.io/art-template/zh-cn/)
    • 导入art-template
    • 定义数据
    • 定义模板
    • 调用template函数
    • 渲染HTML结构
    • {{ }}内可进行变量输出 或 循环数组
    • {{ }}语法中可进行变量的输出 对象属性的输出 三元表达式输出 逻辑输出 加减乘除表达式的输出
    • 原文输出 {{@ value}}
      • 如果输出的value值中 包含html标签,则需要使用原文输出
    • 条件输出{{}} 中使用if...else if...if
    • 当前循环的索引使用 $inde

六、模板引擎的实现原理

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

  • 如果字符串中有匹配的值 则返回该匹配值,否则返回null
    let str = 'hello'
    let arr = /o/
    console.log(arr.exec(str));

分组

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

6.2 实现简易的模板引擎

1.定义模板结构
<script type="text/html" id="box">
        <div>姓名:{{name}}</div>
        <div>年龄:{{age}}</div>
        <div>性别:{{gender}}</div>
    </script>

2.预调用模板引擎

//定义数据
        let data = {
            name: '张三',
            age: 28,
            gender: '男'
        }
        //调用模板引擎
        let htmlStr = template('#box', data)

3.封装template函数

//封装template函数
function template(id, data) {
    console.log('id', id, data);
    let str = document.querySelector(id).innerHTML
    console.log(str);
    let partern = /{{\s*([a-zA-Z]+)\s*}}/
    let Result = null
    while (Result = partern.exec(str)) {
        str = str.replace(Result[0], data[Result[1]])
    }
    return str
}

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

		<script src="./15-template.js"></script>
        //渲染模板引擎
        let div = document.querySelector('#div')
        div.innerHTML = htmlStr

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值