目录
一、模板引擎
根据程序员指定的模板结构和数据,自动生成一个完整的HTML页面
①减少了字符串的拼接操作
②代码结构更加清晰
③使代码更易于阅读与维护
Ⅰ.art-template模板引擎的使用
①导入art-template
②定义数据
③定义模板
④调用template函数
⑤渲染HTML结构
<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">
<!-- 1.导入模板引擎 -->
<script src="./lib/template-web.js"></script>
<!-- 导入模板引擎后,window全局就会多一个函数叫做template('模板的id','需要渲染的数据对象') -->
<script src="./lib/jquery.js"></script>
<title>Document</title>
</head>
<body>
<div id="container"></div>
<!-- 3.定义模板 -->
<!-- 3.1模板的html结构,必须定义到script标签中 -->
<script type="text/html" id="tpl-user">
<h1>{{name}}-----{{age}}</h1>
</script>
<script>
// 2.定义需要渲染的数据
var data = {
name: '张三',
age: 20,
}
// 4.调用template函数
var htmlStr = template('tpl-user', data)
// 5.渲染html结构
$('#container').html(htmlStr);
</script>
</body>
Ⅱ.标准语法{{}}
输出: 变量输出、对象输出、三元表达式输出、逻辑或输出、加减乘除等表达式输出
原文输出:{{@ value}}
如果要输出的value值中包含了html标签结构,则需要使用原文输出语法,才能保证html标签被正常渲染
条件输出:{{}}中使用if...else if.../if
{{if value}} 按需输出的内容{{/if}}
{{if value1}}按需输出的内容{{else if value2}}按需输出的内容{{/if}}
循环输出:{{}}中使用each循环数组
当前循环的索引使用$index进行访问,当前循环项使用$value进行访问
{{each arr}}
{{$index}} {{$value}}
{{/each}}
过滤器 本质就是一个function处理函数
调用过滤器函数:
{{value | filterName}}
类似管道操作符。它的上一个输出作为下一个输入
定义过滤器:
template.defaults.imports.filterName=function(value){
/*return 处理结果*/}
过滤器的应用----格式化时间
<!-- 1.导入模板引擎 -->
<script src="./lib/template-web.js"></script>
<div id="container"></div>
<!-- 3.定义模板 -->
<script type="text/html" id="tpl-user">
<h3>{{regTime | dataFormat}}</h3>
</script>
<script>
template.defaults.imports.dataFormat = function(date) {
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
return year + '-' + month + '-' + day;
}
// 2.定义需要渲染的数据
var data = {
regTime: new Date()
}
// 4.调用template函数
var htmlStr = template('tpl-user', data)
// 5.渲染html结构
$('#container').html(htmlStr);
</script>
封装简易的模板引擎:点击查看代码
二、正则表达式与字符串操作
exec()用于检测字符串中的正则表达式的匹配
如果字符串中有匹配的值,则返回该匹配的值,否则返回null
正则表达式中()包起来的内容表示一个分组,可以通过分组来提取自己想要的内容
提取分组
var str='<div>我是{{name}}</div>';
var pattern =/{{([a-zA-Z]+)}}/;
var result=pattern.exec(str);
console.log(result);
//得到name相关的分组信息
// [
// '{{name}}',
// 'name',
// index: 7,
// input: '<div>我是{{name}}</div>',
// groups: undefined
// ]
字符串的replace函数
用于在字符串中用一些字符替换另一些字符
var str='<div>我是{{name}}</div>';
var pattern =/{{([a-zA-Z]+)}}/;
var result=pattern.exec(str);
str=str.replace(result[0],result[1]);
console.log(str);
//<div>我是name</div>
while循环与多次replace
var str='<div>{{name}}今年{{ age }}岁</div>';
var pattern=/{{\s*([a-zA-Z]+)\s*}}/;
while(pattern.exec(str)){
str=str.replace(pattern.exec(str)[0],pattern.exec(str)[1]);
}
console.log(str); //<div>name今年age岁</div>
replace替换为真值
var data={
name:'张三',
age:18
};
var str='<div>{{name}}今年{{ age }}岁</div>';
var pattern=/{{\s*([a-zA-Z]+)\s*}}/;
while(pattern.exec(str)){
str=str.replace(pattern.exec(str)[0],data[pattern.exec(str)[1]]);
};
console.log(str); //<div>张三今年18岁</div>
三、XMLHttpRequest基本使用
XMLHttpRequest简称xhr,是浏览器提供的javascript对象,请求服务器上的数据资源.
jquery中的ajax函数,就是基于xhr对象封装出来的,如下图所示
Ⅰ.使用xhr发起GET请求
①创建xhr对象
②调用xhr.open(‘请求方式’,’url地址’)
③调用xhr.send()
④监听xhr.onreadystatechange事件
xhr的readyState属性
表示当前Ajax请求所处的状态,每个Ajax请求必然处于一下状态中的一个:
0: xhr对象已经被创建,但尚未调用open()方法
1: open()方法已经被调用
2: send()方法已经被调用,响应头也已经被接收
3: 数据接收中此时response属性中已经包含部分数据
4: Ajax请求成功,这意味着数据传输已经彻底完成或失败
查询字符串
在url的末尾加上用于向服务器发送信息的字符串(变量)
格式:将英文的?放在url的末尾,然后再加上参数=值,想加上对个参数的话,使用&符号进行分隔,以这个形式,可以将想要发送给服务器的数据添加到url中。
get请求携带参数的本质
直接将参数以查询字符串的形式,追加到url地址的后面,发送到服务器
url地址中,只允许出现英文相关的字母、标点符号、数字,因此,在url地址中不允许出现中文字符,如果需要包含中文的字符,就必须对中文字符进行编码(转义)
url编码
原则:使用安全的字符去表示不安全的字符
使用三组%表示一个中文字符
encodeURI()编码函数
decodeURI()解码函数
var str='上海出版社';
var str2=encodeURI(str);
console.log(str2); //%E4%B8%8A%E6%B5%B7%E5%87%BA%E7%89%88%E7%A4%BE
var str3=decodeURI(str2);
console.log(str3); //上海出版社
注意:浏览器会自动对URL地址进行编码操作
使用xhr发起不带参数的GET请求
//1.创建xhr对象
var xhr=new XMLHttpRequest();
//2.调用open函数,指定请求方式与url地址
xhr.open('GET','http://www.liulongbin.top:3006/api/getbooks');
//3.调用send函数,发起Ajax请求
xhr.send();
//4.监听onreadystatechange事件
xhr.onreadystatechange=function(){
//4.1监听xhr对象的请求状态readyState,与服务器响应的状态status
if(xhr.readyState===4&&xhr.status===200){ //表示数据请求成功
//4.2打印服务器响应回来的数据
console.log(xhr.responseText);
}
}
使用xhr发起带参数GET的请求
在调用在open期间为url地址指定参数即可
这种在url地址后面拼接的参数,叫做查询字符串
//1.创建xhr对象
var xhr=new XMLHttpRequest();
//2.调用open函数,指定请求方式与url地址
xhr.open('GET','http://www.liulongbin.top:3006/api/getbooks?id=1');
//3.调用send函数,发起Ajax请求
xhr.send();
//4.监听onreadystatechange事件
xhr.onreadystatechange=function(){
//4.1监听xhr对象的请求状态readyState,与服务器响应的状态status
if(xhr.readyState===4&&xhr.status===200){ //表示数据请求成功
//4.2打印服务器响应回来的数据
console.log(xhr.responseText);
}
}
Ⅱ.使用xhr发起post请求
①创建xhr对象
②调用xhr.open(‘请求方式’,’url地址’)
③设置Content-Type属性
xhr.setRequestHeader(‘Content-Type’,’application/x-www-form-urlencoded’)
④调用xhr.send(),同时指定发送的数据,数据以查询字符串形式提交给服务器
⑤调用xhr.onreadystatechange事件
//1.创建xhr对象
var xhr=new XMLHttpRequest();
//2.调用open()
xhr.open('POST','http://www.liulongbin.top:3006/api/addbook');
//3.设置Content-Type属性
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
//4.调用send(),同时将数据以查询字符串的形式,提交给服务器
xhr.send('bookname=水浒传&author=施耐庵&publisher=上海图书出版社');
//5.监听onreadystatechange事件
xhr.onreadystatechange=function(){
//5.1监听xhr对象的请求状态readyState,与服务器响应的状态status
if(xhr.readyState===4&&xhr.status===200){ //表示数据请求成功
//5.2打印服务器响应回来的数据
console.log(xhr.responseText);
}
}
数据交换格式
服务器端与客户端之间数据传输与交换的格式 XML和JSON
网页内容载体 html
数据载体 xml
四、JSON
本质:用字符串表示js对象数据或数组数据
作用:在计算机与网络之间存储和传输数据
注意事项:
①属性名必须使用双引号包裹
②字符串类型的值必须使用双引号包裹
③JSON中不允许使用单引号表示字符串
④JSON不能写注释
⑤JSON最外层必须是对象或数组类型
⑥不能使用undefined或函数表示JSON的值
Ⅰ.JSON对象结构
表示为{}括起来的内容,数据结构为{key:value,key:value,...}的键值对结构
所有字符串必须是使用英文双引号包裹的字符串
Key必须是使用英文双引号包裹的字符串
Value的数据类型可以是数字、字符串、布尔值、null、数组、对象、
Ⅱ.JSON数组结构
表示为[]括起来的内容,数据格式为[value,value,value,...]
所有字符串必须是使用英文双引号包裹的字符串
数据类型可以是数字、字符串、布尔值,null、数组、对象
Ⅲ.JSON和JS对象互换
转换为js对象(反序列化): 字符串转换为数据对象 JSON.parse()
转换为JSON字符串(序列化: 数据对象转换为字符串 JSON.stringify()
jquery中ajax请求的回调函数控制台输出是服务器返回的数据是js对象格式
XMLHttpRequest的监听函数的xhr.responseText是JSON字符串格式
封装属于自己的Ajax函数 :点击查看代码
五、XMLHttpRequest Level2新特性
①可以设置HTTP请求的时限
②可以使用FormData对象管理表单数据
③可以上传文件
④可以获取数据传输的进度信息
Ⅰ.设置HTTP请求时限
xhr.timeout=3000//将最长等待时间设为3000毫秒,过了这个时间,就自动停止HTTP请求
xhr.ontimeout=function(e){ //超时就触发这个函数
alert('请求超时')
}
Ⅱ.FormData对象管理表单数据
提交表单数据
//1.新建FormData对象
var fd=new FormData();
//2.为FormData添加表单项
fd.append('uname','zhangsan');
fd.append('upwd','123456');
//3.创建XHR对象
var xhr=new XMLHttpRequest();
//4.指定请求类型与url地址
xhr.open('POST','http://www.liulongbin.top:3006/api/formdata');
//5.直接提交FormData对象,这与提交网页表单数据的效果,完全一样
xhr.send(fd);
xhr.onreadystatechange=function(){
if(xhr.readyState===4&&xhr.status===200){
console.log(xhr.responseText);
}
}
获取表单数据
<form id="form1">
<!-- autocomplete="off阻止自动填充行为 -->
账号:<input type="text" name="uname" autocomplete="off">
密码:<input type="password" name="upwd" >
<button type="submit">提交</button>
</form>
//1.获取表单元素
var form=document.querySelector('#form1');
//2.监听表单元素的submit事件
form.addEventListener('submit',function(e){
e.preventDefault();
//3.根据form表单创建FormData对象,会自动将表单数据填充到FormData对象中
var fd=new FormData(form);
var xhr=new XMLHttpRequest();
xhr.open('POST','http://www.liulongbin.top:3006/api/formdata');
xhr.send(fd);
xhr.onreadystatechange=function(){
if(xhr.readyState===4&&xhr.status===200){
console.log(JSON.parse(xhr.responseText));
}
}
})
Ⅲ.上传文件
步骤:
①定义UI结构
②验证是否选择文件
③向FormData中追加文件
④使用xhr发起上传文件的请求
⑤监听onreadystatechange事件
<body>
<!-- 1.定义UI结构 -->
<!-- 文件选择框 -->
<input type="file"id="file1">
<!-- 长传文件的按钮 -->
<button id="btnUpload">上传文件</button>
<br/>
<!-- img标签,来显示上传成功以后的图片 -->
<img src="" alt="" id="img" width="800">
<script>
//2.验证是否选择了文件
//2.1获取长传文件的按钮
var btnUpload=document.querySelector('#btnUpload')
//2.2为按钮添加click事件监听
btnUpload.addEventListener('click',function(){
//2.3获取到选择的文件列表
var files=document.querySelector('#file1').files;
if(files.length<=0){
return alert('请选择要上传的文件');
}
//3.向FormData中追加文件
//3.1创建FormData对象
var fd=new FormData();
//3.2向FormData中追加文件
fd.append('avatar',files[0])//追加一个头像的文件
})
//4.使用xhr发起上传文件的请求
//4.1创建xhr对象
var xhr=new XMLHttpRequest();
//4.2调用open函数,指定请求的类型和url地址,其中,请求类型必须为POST
xhr.open('POST','http://www.liulongbin.top:3006/api/upload/avatar');
//4.3发起请求
xhr.send(fd)
//5.监听onreadystatechange事件
xhr.onreadystatechange=function(){
if(xhr.readyState===4&&xhr.status===200){
var data=JSON.parse(xhr.responseText);
if(data.status===200){ //上传成功
//将服务器返回的图片地址,设置为img标签的src属性值
document.querySelector('#img').src='http://www/liulongbin.top:3006'+data.url;
}else{ //上传文件失败
console.log(data.message);
}
}
}
</script>
</body>
Ⅳ.显示文件上传进度
通过监听xhr.upload.onprogress事件,来获取文件的上传进度
//创建xhr对象
var xhr=new XMLHttpRequest();
xhr.upload.onprogress=function(e){
//e.lengthComputable是一个布尔值,表示当前上传的资源是否具有可计算的长度
if(e.lengthComputable){
//e.loaded已上传的字节
//e.total 需传输的字节
var percentComplete=Math.ceil((e.loaded/e.total)*100)
}
}
通过监听xhr.upload.onload事件,监听上传完成的事件
六、jQuery高级用法
Ⅰ.实现文件上传
<!-- 1.定义UI结构 -->
<!-- 1.1导入jQuery -->
<script src="./lib/jquery.js"></script>
<body>
<!-- 1.2文件选择框 -->
<input type="file"id="file1">
<!-- 1.3上传文件按钮 -->
<button id="btnUpload">上传文件</button>
<script>
//2.验证是否选择了文件
$('#btnUpload').on('click',function(){
//2.1将jQuery对象转换为DOM对象,并获取选中的文件列表
var files=$('#file1')[0].files;
//2.2判断是否选择了文件
if(files.length<=0){
return alert('请选择要上传的文件');
}
//3.向FormData中追加文件
var fd=new FormData();
fd.append('avatar',files[0]);
//4.使用jQuery发起上传文件的请求
$.ajax({
method:'POST',
url:'http://www.liulongbin.top:3006/api/upload/avatar',
data:fd,
//不修改Content-Type属性,使用FormData默认的Content-Type值
contentType:false,
//不对FormData中的数据进行url编码,而是将FormData数据原样发送到服务器
processData:false,
success:function(res){
console.log(res);
}
})
})
</script>
</body>
Ⅱ.实现loading效果
1.ajaxStart(callback)
Ajax请求开始时,执行ajaxStart函数,可以在ajaxStart的callback中显示loading效果
//自jQuery版本1.8起,该方法只能被附加到文档
$(document).ajaxStart(function(){
$('#loading').show();
})
注意:$(document).ajaxStart()函数会监听当前文档内所有Ajax请求
2.ajaxStop(callback)
Ajax请求结束时,执行ajaxStop函数,可以在ajaxStop的callback中隐藏loading效果
//自jQuery版本1.8起,该方法只能被附加到文档
$(document).ajaxStop(function(){
$('#loading').hide();
})
七、Axios
专注于网络数据请求的库
发起GET请求
axios.get('url',{ params:{/*参数*/} }).then(callback)
var url='http://www.liulongbin.top:3006/api/get';
var paramsObj={
name:'zhangsan',
age:20
};
axios.get(url,{ params:{paramsObj} }).then(function(res){
var result=res.data;
console.log(result);
})
发起POST请求
axios.post('url',{/*参数*/}).then(callback)
var url='http://www.liulongbin.top:3006/api/post';
var params={
address:'北京',
location:'顺义区'
};
axios.post(url,params).then(function(res){
var result=res.data;
console.log(result);
})
使用axios发起请求
axios({
method:'请求类型',
url:'请求的url地址',
data:{/*post数据*/},
params:{/*get参数*/}
}).then(callback)
使用axios发起GET请求
axios({
method:'GET',
url:'http://www.liulongbin.top:3006/api/get',
params:{
name:'zhangsan',
age:20
}
}).then(function(res){
console.log(res.data);
})
使用axios发起POST请求
axios({
method:'POST',
url:'http://www.liulongbin.top:3006/api/post',
data:{
address:'北京',
location:'顺义区'
}
}).then(function(res){
console.log(res.data);
})