ajax复习
1. 为什么叫ajax
- async JavaScript and XML
- 异步JavaScript和XML
2. jQuery发起ajax请求
$(function() {
$("button").on("click", function() {
$.get("http://www.liulongbin.top:3006/api/getbooks", {
id: 1
}, function(res) {
console.log(res);
});
})
})
$(function() {
$.post("http://www.liulongbin.top:3006/api/addbook", {
bookname: '斗破苍穹',
author: '天蚕土豆',
publisher: '上海图书出版社'
}, function(res) {
console.log(res);
})
})
$.ajax({
type:"请求方式",
url:"请求地址",
data:{
携带的数据
},
success:function(res){
}
})
3. jquery中获取form表单所有书籍
$(".form1").on("submit", function(e) {
e.preventDefault();
var data = $(this).serialize();
console.log(data);
})
- data数据为username=xxx&age=xxx格式
4. art-template
5. 使用xhr发起http请求
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://www.liulongbin.top:3006/api/getbooks?id=1");
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}
var xhr = new XMLHttpRequest();
xhr.open('post', 'http://www.liulongbin.top:3006/api/addbook');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('bookname=一念永恒&author=耳根&publisher=上海图书出版社');
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
}
6. XML与HTML的区别
- HTML用于描述网页上的内容,是网页内容的载体
- XML被设计用于传输和存储数据,是数据的载体
7 . JSON
- 为何加JSON
- JavaScript object Notation:JavaScript对象表示法
- 就是JavaScript对象和数组的字符串表示法
- 本质字符串
8. XMLHttpRequest Level2的新特性
8.1 旧版xhr的缺点
- 只支持文本数据的传输,无法用来读取和上传文件
- 传输和接收数据时,没有进度信息,只能提示有没有完成
8.2 xhr 2的新功能
- 可以设置HTTP请求的时限
- 可以使用FormData对象管理表单数据
- 可以上传文件
- 可以获得数据传输的进度信息
8.3 xhr设置HTTP请求时限
xhr.timeout=300
xhr.ontimeout=function(){
}
8.4 xhr2 的formData对象
e.preventDefault();
var fd = new FormData();
fd.append("id", "2");
var xhr = new XMLHttpRequest();
xhr.open("post", "http://www.liulongbin.top:3006/api/formdata");
xhr.send(fd);
8.5 xhr实现文件上传
<!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>
<link rel="stylesheet" href="./lib/bootstrap.css">
<script src="./lib/jquery.js"></script>
</head>
<body>
<!-- 选择文件按钮 -->
<input type="file" id="select">
<!-- 上传文件到服务器的按钮 -->
<button id="upload">上传文件</button>
<!-- 显示上传给服务器的图片 -->
<img src="" alt="">
<!-- 进度条效果 -->
<div class="progress" style="width:300px">
<div class="progress-bar progress-bar-striped active" style="width: 0">
0%
</div>
</div>
<script>
var upload = document.querySelector("#upload");
var select = document.querySelector("#select");
upload.addEventListener("click", function() {
if (select.files.length > 0) {
var fd = new FormData();
fd.append("avatar", select.files[0]);
var xhr = new XMLHttpRequest();
xhr.upload.onprogress = function(e) {
if (e.lengthComputable) {
console.log(Math.ceil(e.loaded / e.total * 100));
$(".progress .progress-bar").css({
width: Math.ceil(e.loaded / e.total * 100) + '%'
}).html(Math.ceil(e.loaded / e.total * 100) + '%');
}
}
xhr.open("post", 'http://www.liulongbin.top:3006/api/upload/avatar');
xhr.send(fd);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var res = JSON.parse(xhr.responseText);
if (res.status === 200) {
console.log(res);
document.querySelector("img").src = 'http://www.liulongbin.top:3006' + res.url;
} else {
alert("文件上传失败");
}
}
}
} else {
return alert("请选择要上传的文件");
}
})
</script>
</body>
</html>
8.8 监听文件上传成功
xhr.upload.onload = function() {
$(".progress .progress-bar").removeClass().addClass("progress-bar progress-bar-success");
}
9. jQuery实现文件上传
$(function() {
$("#upload").on("click", function() {
if ($("#select")[0].files.length > 0) {
var fd = new FormData();
fd.append("avatar", $("#select")[0].files[0]);
$(document).ajaxStart(function() {
$("#loading").show();
})
$(document).ajaxComplete(function() {
$("#loading").hide();
})
$.ajax({
method: "post",
url: 'http://www.liulongbin.top:3006/api/upload/avatar',
data: fd,
contentType: false,
processData: false,
success: function(res) {
console.log(res);
$("#pic").attr("src", 'http://www.liulongbin.top:3006' + res.url)
}
})
} else {
return alert("请先选择文件");
}
})
})
</script>
10 axios
axios.get('url',{params:{参数}}).then(回调函数)
axios.post('url',{参数}).then(回调函数)
axios({
method:'请求类型',
url:'请求地址',
data:{
post请求的参数
},
params:{
get请求参数
}
}).then(回调函数)
11 JSONP突破跨域
<!-- 在一个script标签中定义一个函数 -->
<script>
function success(data) {
console.log("返回数据是:");
console.log(data);
}
</script>
<!-- 让服务器调用上述的函数-->
<script src="http://www.liulongbin.top:3006/api/jsonp?callback=success&name=k&age=30">
</script>
12 JSONP的缺点
- 原理是通过script标签的src属性,来实现跨域数据获取的,本质是js脚本请求,只能是get请求
- JSONP 与ajax没有任何关系,ajax使用了xhr对象,而JSONP是js脚本请求
13 jQuery中的JSONP
<!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>
<script src="./lib/jquery.js"></script>
</head>
<body>
<script>
$(function() {
$.ajax({
url: "http://www.liulongbin.top:3006/api/jsonp?name=k&age=30",
dataType: 'jsonp',
success: function(res) {
console.log(res);
}
})
})
</script>
</body>
</html>
14 防抖
- 当事件被触发后,延迟n秒后再执行回调函数,如果在这n秒内事件又被触发,则重计时
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link rel="stylesheet" href="./css/search.css" />
<script src="./lib/jquery.js"></script>
<script src="./lib/template-web.js"></script>
</head>
<body>
<div class="container">
<img src="./images/taobao_logo.png" alt="" class="logo" />
<div class="box">
<div class="tabs">
<div class="tab-active">宝贝</div>
<div>店铺</div>
</div>
<div class="search-box">
<input type="text" class="ipt" placeholder="请输入要搜索的内容" /><button class="btnSearch">
搜索
</button>
</div>
<div class="tips">
</div>
</div>
</div>
<script type="text/html" id="tep-getTips">
{{each result}}
<div class="tips-item">{{$value[0]}}</div>
{{/each}}
</script>
<script>
$(function() {
var timer = null;
var cache = {};
$(".ipt").on("keyup", function() {
clearTimeout(timer);
var text = $(this).val().trim();
if (text.length > 0) {
if (cache[text]) {
var htmlstr = template('tep-getTips', cache[text]);
$(".tips").html(htmlstr).show();
return false;
}
debounceSearch(text);
} else {
return $(".tips").html("").hide();
}
})
function getTips(text) {
$.ajax({
url: "https://suggest.taobao.com/sug?q=" + text,
dataType: "jsonp",
success: function(res) {
console.log(res);
if (res.result.length < 0) {
return $(".tips").html("").hide();
}
var htmlstr = template('tep-getTips', res);
$(".tips").html(htmlstr).show();
cache[$(".ipt").val().trim()] = res;
}
})
}
function debounceSearch(text) {
timer = setTimeout(function() {
getTips(text);
}, 500)
}
})
</script>
</body>
</html>
15 节流
$(function() {
var timer = null;
$(document).on("mousemove", function(e) {
if (timer) {
return;
}
timer = setTimeout(function() {
$("img").css({
left: e.pageX,
top: e.pageY
})
console.log('ok');
timer = null;
}, 16)
})
})