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


type属性为submit来触发form表单的提交<form> 标签的属性(⭐⭐⭐)actionaction 属性用来规定当提交表单时,向何处发送表单数据。
action 属性的值应该是后端提供的一个URL地址,这个URL地址专门负责接收表单提交过来的数据。
当 <form>表单在未制定 action 属性值的清空下,action的默认值为当前页面的 URL 地址
注意: 当提交表单后,会立即跳转到 action 属性指定的 URL 地址
targettarget 属性用来规定 在何处打开 action URL
它的可选值有5个,默认情况下,target的值是 _self,表示在相同的框架中打开 action URL

methodmethod 属性用来规定 以何种方式 把表单数据提交到 action URL
它的可选值有两个,分别是 get 和 post
默认情况下,method的值为 get, 表示通过URL地址的形式,把表单数据提交到 action URL
注意:
enctypeenctype属性用来规定在 发送表单数据之前如何对数据进行编码
它的可选值有三个,默认情况下,enctype的值为 application/x-www-form-urlencoded,表示在发送前编码的所有字符

通过点击 submit 按钮,触发表单提交的操作,从而使页面跳转到 action URL 的行为,叫做表单的同步提交
<form> 表单同步提交后,整个页面会发生跳转,跳转到 action URL 所指向的地址,用户体验很差<form> 表单同步提交后,页面之前的状态和数据会丢失如何解决呢?
表单只复杂采集数据,Ajax负责将数据提交到服务器
在 jQuery 中,可以使用如下两种方式,监听到表单的提交事件

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

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

好处:可以一次性获取表单的数据
示例代码:

注意:在使用 serialize() 函数快速获取表单数据时,必须为每个表单元素添加 name 属性
UI结构搭建步骤
评论面板结构
bs3-panel:primary)bs3-button:primary)评论列表结构
list列表(快捷键:bs3-list-group)li里面放两个 span,写入 评论时间和评论人结构代码
x<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,提示用户示例代码
xxxxxxxxxxfunction 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字符串结构,然后放入到数组中示例代码
xxxxxxxxxxfunction 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('')) } })}panel-body的标签改成 form 标签name 属性,name属性的值最好与接口文档定义的参数名称一致sumbit 事件,阻止表单提交的默认行为serialize() )示例代码
xxxxxxxxxx$(function () { $('#formAddCmt').submit(function (e) { e.preventDefault() var data = $(this).serialize() }) })})$.post() 发送请求,传入数据status 是否是201,如果是代表成功,失败进行提示getCommentList()),清空表单内容($('#formAddCmt')[0].reset())示例代码
xxxxxxxxxx$(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 是一个简约,超快的模板引擎,中文官首页:http://aui.github.io/art-template/zh-cn/index.html

通过传统方式渲染的过程,我们了解到,动态去渲染UI的时候需要大量去拼接字符串,比较的麻烦,而且复用性也不是很好
导入 art-template
xxxxxxxxxx<script src="./lib/template-web.js"></script>定义数据
xxxxxxxxxxvar data = { name: 'zs', age: 20}定义模板
script 标签中,注意:需要把type属性改成 text/htmlidname属性的值xxxxxxxxxx<script type="text/html" id="tpl-user"> <h1>{{name}} ------ {{age}}</h1></script>调用 template 函数
xxxxxxxxxxvar htmlStr = template('tpl-user', data)渲染HTML结构
xxxxxxxxxx$('#container').html(htmlStr)art-template 提供了 {{}} 这种语法格式,在 {{}} 内可以进行 变量输出 或 循环数组 等操作,这种 {{}} 语法在 art-template 中被称为标准语法

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

如果输出的 value 值中,包含了 HTML 标签结构,则需要使用原文输出语法,才能保证HTML标签被正常渲染
如果要实现条件输出,则可以在 {{}} 中使用 if...else if.../if 的方式,进行按需输出

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


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

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

定义数据
xxxxxxxxxxvar data = { regTime: new Date() }定义过滤器
xxxxxxxxxx// 定义处理时间的过滤器template.defaults.imports.dateFormat = function (date) { var y = date.getFullYear() var m = date.getMonth() + 1 var d = date.getDate() return y + '-' + m + '-' + d}在模板引擎中使用过滤器
xxxxxxxxxx <script type="text/html" id="tpl-user"> <h3>{{regTime | dateFormat}}</h3> </script>UI效果
getNewsList()url,请求方式,请求参数,响应数据$.get() 发起请求item模板text/html,给模板定义idtags 是一个字符串,我们需要分割成数组template() 方法,传入id和返回的数据each 遍历列表$value 能够拿到每一个item项img,注意:需要拼接请求根路径titlesourcecmtcount模板代码
xxxxxxxxxx<!-- 定义模板 --><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> <span>{{$value.time | dateFormat}}</span> </div> <span>评论数:{{$value.cmtcount}}</span> </div> </div> </div> {{/each}}</script>js代码
xxxxxxxxxx$(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() 函数用于 检索字符串 中的正在表达式的匹配
如果字符串中又匹配的值,则返回该匹配值,否则返回 null

示例代码如下:

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

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

示例代码:


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


定义模板结构

预调用模板引擎

封装 template 函数

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