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){ |
| |
| } |
| }) |
| $(".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.ontimeout=function(){ |
| |
| } |
| |
| |
| |
| |
| 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) { |
| |
| // 创建FormData对象 |
| |
| var fd = new FormData(); |
| // 将文件加入fd中 |
| fd.append("avatar", select.files[0]); |
| |
| // 创建xhr对象 |
| |
| var xhr = new XMLHttpRequest(); |
| |
| // 监听文件上传的进度 |
| |
| xhr.upload.onprogress = function(e) { |
| // 判断当前资源是否具有可计算的长度 |
| if (e.lengthComputable) { |
| // e.loaded 已经上传的字节数 |
| // e.total 上传的总字节数 |
| |
| 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); |
| // 将服务器返回的url地址获取 |
| |
| 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) |
| }) |
| }) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!