Ajax笔记
1. Ajax简介
- AJAX 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML)。
- AJAX不是一种新的编程语言,而是一种使用现有标准的新方法。它是一种用于从网页访问Web服务器的技术。
- AJAX允许您在不重新加载页面的情况下向服务器发出请求。
- AJAX可以与服务器通信,交换数据和更新页面,而无需刷新页面。
- AJAX可以发送和接收各种格式的信息,包括JSON,XML,HTML和文本文件。
- 使用ajax技术的网页,通过在后台服务器进行少量的数据交换,就可以实现异步局部更新。
简而言之,就是使用XMLHttpRequest对象与服务器进行通信。
AJAX的两个主要功能使您可以执行以下操作:
- 向服务器发出请求,而无需重新加载页面
- 从服务器接收和处理数据
2. AJAX如何工作?
为了执行AJAX通信,JavaScript使用一个XMLHttpRequest对象向服务器发出HTTP请求并作为响应接收数据。所有现代浏览器都支持该XMLHttpRequest对象。
AJAX通信原理图:
3. AJAX操作步骤
- 网页中发生了一个事件(即页面已加载或单击了按钮)
- XMLHttpRequest对象由JavaScript创建
- XMLHttpRequest对象将请求发送到Web服务器
- 服务器处理请求
- 服务器将响应发送回网页
- 响应由JavaScript读取
- HTML DOM由JavaScript更新
总结:以上都是原生AJAX介绍
4、jQuery AJAX 方法
常用的jQuery AJAX 方法列表
方法 | 描述 |
---|---|
$.ajax() | 执行异步 AJAX 请求 |
$.post() | 使用 AJAX 的 HTTP POST 请求从服务器加载数据 |
$.get() | 使用 AJAX 的 HTTP GET 请求从服务器加载数据 |
load() | 从服务器加载数据,并把返回的数据放置到指定的元素中 |
4.1、$.ajax()方法
jQuery.ajax(...)
部分参数:
url:请求地址,
type:请求方式,GET、POST(1.9.0之后用method),
data:要发送的数据,
success:成功之后执行的回调函数(全局),
headers:请求头,
contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www-form-urlencoded; charset=UTF-8"),
async:是否异步,
timeout:设置请求超时时间(毫秒),
beforeSend:发送请求前执行的函数(全局),
complete:完成之后执行的回调函数(全局),
error:失败之后执行的回调函数(全局),
accepts:通过请求头发送给服务器,告诉服务器当前客户端可接受的数据类型,
dataType:将服务器端返回的数据转换成指定类型,
"xml": 将服务器端返回的内容转换成xml格式,
"text": 将服务器端返回的内容转换成普通文本格式,
"html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行,
"script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式,
"json": 将服务器端返回的内容转换成相应的JavaScript对象,
"jsonp": JSONP 格式使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数,
4.2、$.post()方法
$.post(url, [data], [successs], [type])
- url:请求的URL地址
- data:请求携带的参数
- successs:载入成功时回调函数
- type:设置返回内容格式,xml, html, script, json, text,_default
4.3、$.get()方法
$.get(url, [data], [successs], [type])
- url:请求的URL地址
- data:请求携带的参数
- successs:载入成功时回调函数
- type:设置返回内容格式,xml, html, script, json, text,_default
4.4、通用方法
-
html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>jQuery 发送 AJAX 请求</title> <link crossorigin="anonymous" href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> </head> <body> <div class="container"> <h2 class="page-header">jQuery发送AJAX请求 </h2> <button class="btn btn-primary">GET</button> <button class="btn btn-danger">POST</button> <button class="btn btn-info">通用型方法ajax</button> </div> <script> $('button').eq(0).click(function(){ $.get('http://127.0.0.1:8000/jquery-server', {a:100, b:200}, function(data){ console.log(data); },'json'); }); $('button').eq(1).click(function(){ $.post('http://127.0.0.1:8000/jquery-server', {a:100, b:200}, function(data){ console.log(data); }); }); $('button').eq(2).click(function(){ $.ajax({ //url url: 'http://127.0.0.1:8000/jquery-server', //参数 data: {a:100, b:200}, //请求类型 type: 'GET', //响应体结果 dataType: 'json', //成功的回调 success: function(data){ console.log(data); }, //超时时间 timeout: 2000, //失败的回调 error: function(){ console.log('出错啦!!'); }, //头信息 headers: { c:300, d:400 } }); }); </script> </body> </html>
-
js文件
//jQuery 服务 app.all('/jquery-server', (request, response) => { //设置响应头 设置允许跨域 response.setHeader('Access-Control-Allow-Origin', '*'); response.setHeader('Access-Control-Allow-Headers', '*'); // response.send('Hello jQuery AJAX'); const data = {name:'尚硅谷'}; response.send(JSON.stringify(data)); });
5、实例
案例一:鼠标离开输入框的时候,可以看到发出了一个ajax的请求
使用最原始的HttpServletResponse处理
-
编译一个html文件
<html> <head lang="en"> <meta charset="UTF-8"> <title>test_ajax01</title> </head> <body> <script type="text/javascript"> <!-- 获取时间戳 --> window.onload = function(){ var myDate = new Date(); document.getElementById('currentTime').innerText = myDate.getTime(); }; <!-- 获取地址 --> function LoadPage(){ var targetUrl = document.getElementById('url').value; console.log(targetUrl); document.getElementById("iframePosition").src = targetUrl; } </script> <div> <p>请输入要加载的地址:<span id="currentTime"></span></p> <p> <input id="url" type="text" value="https://www.baidu.com/"/> <input type="button" value="提交" onclick="LoadPage()"> </p> </div> <div> <h3>加载页面位置:</h3> <iframe id="iframePosition" style="width: 100%;height: 500px;"></iframe> </div> </body> </html>
-
编写一个AjaxController
@Controller public class AjaxController { @RequestMapping("/a1") public void ajax1(String name , HttpServletResponse response) throws IOException { if ("admin".equals(name)){ response.getWriter().print("true"); }else{ response.getWriter().print("false"); } } }
-
导入jquery,编写index.jsp测试
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> <%-- 导入jquery --%> <%--<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>--%> <%-- 本地导入 --%> <script src="${pageContext.request.contextPath}/statics/js/jquery-3.1.1.min.js"></script> <script> function a1(){ $.post({ url:"${pageContext.request.contextPath}/a1", data:{'name':$("#txtName").val()}, success:function (data,status) { alert(data); alert(status); } }); } </script> </head> <body> <%--onblur:失去焦点触发事件--%> 用户名:<input type="text" id="txtName" onblur="a1()"/> </body> </html>
-
启动tomcat测试!打开浏览器的控制台,当我们鼠标离开输入框的时候,可以看到发出了一个ajax的请求!是后台返回给我们的结果!测试成功!
案例二:获取一个集合对象,展示到前端页面
-
创建实体类user.java
@Data @AllArgsConstructor @NoArgsConstructor public class User { private String name; private int age; private String sex; }
-
创建一个集合对象
@RequestMapping("/a2") public List<User> ajax2(){ List<User> list = new ArrayList<User>(); list.add(new User("秦疆1号",3,"男")); list.add(new User("秦疆2号",3,"男")); list.add(new User("秦疆3号",3,"男")); return list; //由于@RestController注解,将list转成json格式返回 }
-
创建一个前端页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>test_ajax02</title> </head> <body> <!-- 创建一个按钮 --> <input type="button" id="btn" value="获取数据"/> <!-- 创建一个由姓名、年龄和性别组成的表格 --> <table width="80%" align="center"> <tr> <td>姓名</td> <td>年龄</td> <td>性别</td> </tr> <!-- 通过tbody定义一个id选择器,用来展示数据--> <tbody id="content"> </tbody> </table> <!-- 导入jquery --> <script src="${pageContext.request.contextPath}/statics/js/jquery-3.1.1.min.js"></script> <script> <!-- 通过鼠标点击事件,发送post请求 --> $(function () { <!--点击事件--> $("#btn").click(function () { <!-- 发送post请求 --> $.post("${pageContext.request.contextPath}/a2",function (data) { console.log(data) var html=""; for (var i = 0; i <data.length ; i++) { html+= "<tr>" + "<td>" + data[i].name + "</td>" + "<td>" + data[i].age + "</td>" + "<td>" + data[i].sex + "</td>" + "</tr>" } $("#content").html(html); }); }) }) </script> </body> </html>
成功实现了数据回显!
案例三:输入框后面存在实时提示
-
编译一个Controller
@RequestMapping("/a3") public String ajax3(String name,String pwd){ String msg = ""; //模拟数据库中存在数据 if (name!=null){ if ("admin".equals(name)){ msg = "OK"; }else { msg = "用户名输入错误"; } } if (pwd!=null){ if ("123456".equals(pwd)){ msg = "OK"; }else { msg = "密码输入有误"; } } return msg; //由于@RestController注解,将msg转成json格式返回 }
-
编译写一个前端页面 login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>test_ajax03</title> <script src="${pageContext.request.contextPath}/statics/js/jquery-3.1.1.min.js"></script> <script> function a1(){ $.post({ url:"${pageContext.request.contextPath}/a3", data:{'name':$("#name").val()}, success:function (data) { if (data.toString()=='OK'){ $("#userInfo").css("color","green"); }else { $("#userInfo").css("color","red"); } $("#userInfo").html(data); } }); } function a2(){ $.post({ url:"${pageContext.request.contextPath}/a3", data:{'pwd':$("#pwd").val()}, success:function (data) { if (data.toString()=='OK'){ $("#pwdInfo").css("color","green"); }else { $("#pwdInfo").css("color","red"); } $("#pwdInfo").html(data); } }); } </script> </head> <body> <p> 用户名:<input type="text" id="name" onblur="a1()"/> <span id="userInfo"></span> </p> <p> 密码:<input type="text" id="pwd" onblur="a2()"/> <span id="pwdInfo"></span> </p> </body> </html>
测试一下效果,动态请求响应,局部刷新
案例四:获取百度接口的小Demo
-
编写一个HTML文件
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>JSONP百度搜索</title> <!-- CSS样式 --> <style> #q{ width: 500px; height: 30px; border:1px solid #ddd; line-height: 30px; display: block; margin: 0 auto; padding: 0 10px; font-size: 14px; } #ul{ width: 520px; list-style: none; margin: 0 auto; padding: 0; border:1px solid #ddd; margin-top: -1px; display: none; } #ul li{ line-height: 30px; padding: 0 10px; } #ul li:hover{ background-color: #f60; color: #fff; } </style> <script> // 2.步骤二 // 定义demo函数 (分析接口、数据) function demo(data){ var Ul = document.getElementById('ul'); var html = ''; // 如果搜索数据存在 把内容添加进去 if (data.s.length) { // 隐藏掉的ul显示出来 Ul.style.display = 'block'; // 搜索到的数据循环追加到li里 for(var i = 0;i<data.s.length;i++){ html += '<li>'+data.s[i]+'</li>'; } // 循环的li写入ul Ul.innerHTML = html; } } // 1.步骤一 window.onload = function(){ // 获取输入框和ul var Q = document.getElementById('q'); var Ul = document.getElementById('ul'); // 事件鼠标抬起时候 Q.onkeyup = function(){ // 如果输入框不等于空 if (this.value != '') { // ☆☆☆☆☆JSONPz重点☆☆☆☆☆☆☆☆ // 创建标签 var script = document.createElement('script'); //给定要跨域的地址 赋值给src //这里是要请求的跨域的地址 我写的是百度搜索的跨域地址 script.src = 'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd='+this.value+'&cb=demo'; // 将组合好的带src的script标签追加到body里 document.body.appendChild(script); } } } </script> </head> <body> <input type="text" id="q" /> <ul id="ul"> </ul> </body> </html>