1. 引言
经过两个半星期的学习,也算是给ajax结了个尾。总之自己的学习速度和其他人相比,仅仅是差不多,并没有快出来,所以仍需要继续加把劲。
下面是我的学习过程中的二维表和思维导图以及一个简单的案例,希望大家能够获得自己想要的内容。
2.二维表
ajax、axios、jquery
AJAX |
axios |
JQuery |
|
what |
Asynchronous JavaScript And XML.是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,使网页实现异步更新。 AJAX 仅仅组合了:
|
是一个基于Promise的HTTP客户端,可以运行在浏览器和node.js环境中。它支持发送各种类型的HTTP请求,如GET、POST、PUT、DELETE等,并提供了丰富的配置选项。 |
是一个快速、简洁的JavaScript库,极大地简化了HTML文档遍历、事件处理、动画和Ajax交互。它提供了一套完整的工具链,使得开发者能够轻松地操作DOM元素、处理事件、制作动画效果以及进行Ajax请求等。 |
where |
适用于需要局部刷新网页内容的场景,如表单提交后不刷新页面即可显示结果、动态加载数据等。它广泛应用于需要提升用户体验和减少服务器负载的Web应用中。 |
适用于需要进行复杂HTTP请求操作的场景,如前后端分离的项目、需要跨域请求的项目等。 |
适用于需要快速构建交互式Web应用的场景。 |
why |
由于不需要重新加载整个网页,因此可以减少服务器负载和带宽消耗。 |
支持并发请求和取消请求功能,可以避免不必要的网络请求和资源浪费。 |
通过优化选择器和事件处理机制、使用CDN加速静态资源加载等方式可以提高性能。 |
how |
|
|
$ 1、Selector,查找元素。这个查找不但包含基于CSS1~CSS3的CSS Selector功能,还包含其对直接查找或间接查找而扩展的一些功能。 2、Dom元素的属性操作。Dom元素可以看作html的标签,对于属性的操作就是对于标签的属性进行操作。这个属性操作包含增加,修改,删除,取值等。 3、Dom元素的CSS样式的操作。CSS是控制页面的显示的效果。对CSS的操作那就得包含高度,宽度,display等这些常用的CSS的功能。 4、Ajax的操作。Ajax的功能就是异步从服务器取数据然后进行相关操作。 5、Event的操作。对Event的兼容做了统一的处理。 6、动画(Fx)的操作。可以看作是CSS样式上的扩展。 |
四种请求方式
POST(添加) |
GET(查询) |
DELETE(删除) |
PUT(修改) |
|
what |
请求用于向指定资源提交数据,通常会导致服务器端的状态发生变化。 |
请求用于向指定资源发出请求,请求中包含了资源的 URL 和请求参数。 |
用于请求服务器删除指定的资源,可以理解为对服务器上的资源进行删除操作。 |
请求用于向服务器更新指定资源,可以理解为对服务器上的资源进行修改操作。 |
where |
|
|
|
|
why |
|
|
|
|
how |
|
|
|
|
XHR对象和Promise对象
XHR对象 |
Promise对象 |
|
what |
XMLHttpRequest对象 |
Promise对象用于表示一个异步操作的最终完成(或失败)及其结果值 |
where |
XMLHttpRequest 对象可用于在后台与 Web 服务器交换数据。 |
|
why |
这意味着可以更新网页的部分内容,而无需重新加载整个页面。 |
Promise对象是JavaScript中进行异步编程的重要工具,它提供了一种简洁、清晰且易于维护的方式来处理异步操作的结果和异常。 |
How |
XMLHttpRequest 对象是 AJAX 的基石。
|
|
同步异步
同步 |
异步 |
|
what |
同步代码按照代码的顺序逐行执行,每行代码必须等待前一行代码完成后才能继续执行。 |
异步代码允许程序在等待某些任务(如I/O操作)完成的同时继续执行其他任务。任务完成后,通过回调函数或事件循环机制通知程序。 |
where |
适用于逻辑简单、不需要等待外部资源的场景。 |
适用于需要等待外部资源(如网络请求、文件读写)的场景,可以提高程序的响应速度和用户体验。 |
why |
|
|
how |
调用栈 |
事件循环 |
是否堵塞代码 |
是,按顺序执行 |
否 |
响应时间 |
时间相对较长 |
时间相对较短 |
资源使用 |
在执行过程中可能会占用较多的CPU资源,特别是在等待I/O操作时。 |
由于非阻塞特性,异步代码在等待I/O操作时可以释放CPU资源,让其他任务得以执行,从而提高了资源利用率。 |
错误处理 |
错误处理相对简单,通常使用try...catch语句捕获异常。 |
错误处理较为复杂,需要在每个回调函数中处理可能出现的错误,或者使用Promise的catch方法来捕获错误。 |
可读性 |
由于按顺序执行,同步代码的逻辑通常比较直观,易于理解和调试。 |
异步代码由于涉及回调函数、Promise链或async/await语法,可能会使逻辑变得复杂,降低代码的可读性和可维护性。 |
宏任务、微任务
宏任务 |
微任务 |
|
what |
由浏览器环境执行的异步代码 |
由js引擎执行的异步代码 |
where |
由浏览器或Node.js环境发起,如定时器、I/O操作、UI渲染等。 |
由JavaScript引擎自身发起,如Promise回调函数、MutationObserver等。 |
why |
|
|
how |
定时器、I/O操作、UI渲染、事件监听器 |
Promise、MutationObserve、process.nextTick(Node.js) |
How |
宏任务队列 |
微任务队列 |
优先级 |
优先级较低,需等待当前事件循环的所有微任务执行完毕才能开始执行。 |
优先级较高,会在当前事件循环的末尾立即执行。 |
浏览器环境 和 js引擎环境
浏览器环境 |
js引擎环境 |
|
运行平台 |
|
|
API提供API提供 |
|
|
全局对象 |
全局对象是 |
在浏览器中,全局对象同样是 |
模块系统 |
通常使用 |
Node.js使用CommonJS模块规范,可以通过 |
浏览器环境 |
由于安全限制,对本地文件系统和某些敏感操作的访问受限。 |
Node.js允许访问文件系统、执行系统命令等,更加灵活。 |
JS引擎环境 |
现代浏览器的JS引擎(如V8)具有高度优化的JIT编译器,能够显著提高JavaScript代码的执行效率。 |
同样具备高效的执行性能,Node.js利用V8引擎在服务器端也能高效地运行JavaScript代码。 |
3.思维导图
按照358原则,一步步抽象
第一版思维导图
只是简单的将黑马的课和AR的课都罗列了一遍
第二版
将两个课融合了一下
第三zz
第四版
4.四种请求方式
4.1原生ajax的XHR
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>原生Ajax实现前后端交互</title>
</head>
<body>
<h1>原生Ajax实现前后端交互</h1>
用户名<input type="text" id="name" placeholder="请输入用户名" /><br>
评论<input type="text" id="text1" placeholder="请输入评论" /><br>
<button type="submit" onclick="doAjax()">提交</button>
<div id="dynamicContainer"></div>
<script type="text/javascript">
function doAjax() {
let ajax = new XMLHttpRequest();
let name = document.getElementById("name").value
let text1 = document.getElementById("text1").value
// 将接口参数传入
let url = "http://localhost:8080/getAjaxTest?name=" + encodeURIComponent(name) + "&text1=" + encodeURIComponent(
text1);
ajax.onreadystatechange = function() {
if (ajax.readyState == 4 && ajax.status == 200) {
var datal = ajax.responseText;
console.log(datal)
let newTag = document.createElement("p");
newTag.textContent = datal;
let container = document.getElementById("dynamicContainer");
container.appendChild(newTag);
}
}
ajax.open("GET", url, true)
ajax.send();
}
</script>
</body>
</html>
4.2JQuery的Ajax以Get方式请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JQuery以Get请求方法实现前后端交互</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h1>JQuery以Get请求方法实现前后端交互</h1>
用户名<input type="text" id="name" placeholder="请输入用户名" /><br>
评论<input type="text" id="text1" placeholder="请输入评论" /><br>
<button type="submit" onclick="doAjax2()">提交</button>
<div id="dynamicContainer"></div>
<script>
function doAjax2() {
let ajax = new XMLHttpRequest();
let name = $("#name").val();
let text1 = $("#text1").val();
$.get(
'http://localhost:8080/getAjaxTest',
{ name: name, text1: text1 },
function(datal) {
let newTag = document.createElement("p");
newTag.textContent = datal;
let container = document.getElementById("dynamicContainer");
container.appendChild(newTag);
}
).fail(function() {
console.error("An error occurred");
});
}
</script>
</body>
</html>
4.3JQuery的Ajax以Post方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JQuery以Get请求方法实现前后端交互</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h1>JQuery以Get请求方法实现前后端交互</h1>
用户名<input type="text" id="name" placeholder="请输入用户名" /><br>
评论<input type="text" id="text1" placeholder="请输入评论" /><br>
<button type="submit" onclick="doAjax2()">提交</button>
<div id="dynamicContainer"></div>
<script>
function doAjax2() {
let ajax = new XMLHttpRequest();
let name = $("#name").val();
let text1 = $("#text1").val();
$.get(
'http://localhost:8080/getAjaxTest',
{ name: name, text1: text1 },
function(datal) {
let newTag = document.createElement("p");
newTag.textContent = datal;
let container = document.getElementById("dynamicContainer");
container.appendChild(newTag);
}
).fail(function() {
console.error("An error occurred");
});
}
</script>
</body>
</html>
4.4JQuery的纯Ajax方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是个纯Ajax方式进行提交</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h1>这是个纯Ajax方式进行提交</h1>
用户名<input type="text" id="name" placeholder="请输入用户名" /><br>
评论<input type="text" id="text1" placeholder="请输入评论" /><br>
<button type="submit" onclick="doAjax2()">提交</button>
<div id="dynamicContainer"></div>
<script>
function doAjax2() {
let ajax = new XMLHttpRequest();
let name = $("#name").val();
let text1 = $("#text1").val();
$.ajax({
url: 'http://localhost:8080/postAjaxTest',
method: 'POST',
data: {name: name,text1: text1},
success: function(datal) {
let newTag = document.createElement("p");
newTag.textContent = datal;
let container = document.getElementById("dynamicContainer");
container.appendChild(newTag);
},
error: function(jqXHR, textStatus, errorThrown) {
console.error("An error occurred: " + textStatus,
errorThrown); // Handle any errors that occur during the request
}
});
}
</script>
</body>
</html>
总结
仍需要加倍努力。