AJAX
AJAX= Asynchronous JavaScript and XML(异步的JavaScript和XML)
同步与异步的区别
同步的理解:
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
同步就相当于是当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。这样的话客户端需要一直等待。用户使用起来会有不友好。
异步的理解:
异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理。这样可以提高执行的效率。
异步就相当于当客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。
同步是阻塞模式,异步是非阻塞模式。
AJAX是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用AJAX)如果需要更新内容,必需重载整个网页面。
XML可扩展标记语言。XML被设计用来传输和存储数据。XML和HTML类似,不同的是HTML中都是预定义标签,而XML中没有预定义标签,全都是自定义标签,用来表示一些数据。
以前Ajax是用XML格式的字符串进行数据交换,现在已经被JSON取代了。
Ajax特点:
优点:
- 可以无需刷新页面,与服务器进行通信
- 允许依据用户事件来更新部分页面内容
缺点:
- 没有浏览历史,不能回退
- 存在跨域问题((同源)
- SEO不友好(搜索引擎优化,对爬虫不友好)
AJAX原理
客户端发送请求,请求交给XMLHttpRequest,XMLHttpRequest 把请求提交给服务,服务器进行业务处理,服务器响应数据交给XMLHttpRequest对象,XMLHttpRequest对象接收数据,由javascript把数据写到页面上。
原生AJAX
创建一个XMLHttpRequest对象
var xmlhttp = new XMLHttpRequest()
告诉浏览器请求的方式是什么,以及请求发送到那儿
//xmlhttp.open("get", "url", true)
xmlhttp.open("get", "http://127.0.0.1:8090", true)
(3)获得响应
如需获得来自服务器的响应,请使用XMLHttpRequest对象的responseText或 responseXML属性。
属性 | 描述 |
responseText | 获得字符串形式的响应数据。 |
responseXML | 获得XML形式的响应数据。 |
xmlhttp.onreadystatechange = function() {
// 做数据处理
// console.log(xmlhttp.responseText)
document.getElementById("div1").innerHTML = xmlhttp.responseText
}
onreadystatechange事件
当请求被发送到服务器时。我们需要执行一些基于响应的任务。每当readyState改变时。就会触发onreadystatechange事件。readyState属性存有XMLHtpRequest的状态信息。
下面是XMLHttpRequest对象的三个重要的属性:
属性 | 描述 |
onreadystatechange | 存储函数(或函数名),每当readyState属性改变时,就会调用该函数。 |
reagyState | 存有XMLHttpRequest的状态。<br/> 从0到4发生变化。<br/> 0:请求未初始化<br/> 1:服务器连接已建立<br/> 2:请求已接收<br/> 3:请求处理中<br/> 4:请求已完成,且响应已就绪 |
status | 200: "OK" <br/> 404:未找到页面 |
在onreadystatechange事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。
当readyState等于4且状态为200时,表示响应已就绪。
html代码:
<!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=""></script>
</head>
<body>
点击按钮,显示对应的内容
<hr>
<input type="button" name="btn1" id="btn1" value="发送">
<div id="div1"></div>
<script>
document.querySelector("#btn1").onclick = function() {
// 第一步:创建一个XMLHttpRequest对象
var xmlhttp = new XMLHttpRequest()
// 第二步:告诉浏览器请求的方式是什么,以及请求发送到那儿
xmlhttp.open("get", "http://127.0.0.1:8090", true)
// 第三部:设置响应服务器端数据处理
xmlhttp.onreadystatechange = function() {
// 做数据处理
// console.log(xmlhttp.responseText)
document.getElementById("div1").innerHTML = xmlhttp.responseText
}
// 第四步:发送请求
xmlhttp.send()
xmlhttp.onload
}
</script>
</body>
</html>
web.js代码
var http = require("http");
http.createServer(function(req, res) {
//实现跨域
res.writeHead(200, { "Access-Control-Allow-Origin": "*" });
res.write("<head><meta charset='utf-8'/></head>");
res.write("第一个web服务器");
res.write("<h1>Hello Ajax</h1>");
res.end();
}).listen(8090);
XML简介:
Xml_又叫可扩展标记语言,主要用来传输和存储数据。
Xml和html类似一都是使用标签;不同的时html_中都是预定义标签,而 xml中没有预定义标签,全都是自定义标签,用来表示一些数据。
JSON
JSON: JavaScript Object Notation, JS对象简谱,是一种轻量级的数据交换格式,javascript对象表示法。
作用:JSON是一种轻量级的文本数据交换格式,在作用上类似于XML,专门用于存储和传输数据,但是jSON比XML更小、更快、更易解析。.
现状:JSON是在2001年开始被推广和使用的数据格式。到现在为止,JSON已经成为了主流的数据交换格式。
JSON的两种结构:
JSON就是用于字符串来表示JavaScript的对象和数组,所以,JSON中包含对象和数组两种结构,通过这两种结构的相互嵌套,可以表示各种复杂的数据结构。
对象结构:
对象结构在[SON中表示为{ )括起来的内容。数据结构为{(key-value,key'value...的键值对结构。其中,key必须是使用英文的双引号包裹的字符串,value的数据类型可以是数字、字符串、布尔值、null、数组、对象6种类型。
数组结构:
数组结构在JSON中表示为[ ]括起来的内容。数组结构为["java" "javascript",30,true...]。数组中数据的类型可以是数字、字符串、布尔值、null、数组、对象6种类型。
JSON语法注意事项:
- 属性名必须使用双引号包裹
- 字符串类型的值必须使用双引号包裹
- JSON中不允许使用单引号表示字符串
- JSON中不能写注释
- JSON的最外层必须是对象或数组格式。
- 不能使用undefined或函数作为JSON的值
JSON和JS对象的关系:
JSON是JS对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串。
//这是一个对象
var obj={a: 'He11o',b : ' wor1d'}
//这是一个3sON字符串,本质是一个字符串
var json="{"a" : "He11o", "b" : "wor1d"}'
JSON和JS对象的相互转换:要实现从]SON字符串转换为JS对象,使用JSON.parse(方法;
var obj = JSON.parse(" {"a" : "he11o" , "b" : "wor1d"');
//结果为{a : " He11o' ,b : ' wor1d'}
要实斑从|s对象转换为JSON字符串,使用lSON.stringify()方法。
var obj = 3SON . stringify(a : 'He11o' , b : ' wor1d');
//结果为'{"a" : "he11o", "b" : "wor1d"}"
序列化与反序列化:
把数据对象转换为字符串的过程,叫做序列化,例如:调用JSON.stringify0)函数的操作,叫做JSON序列化。因此JSON.stringify(函数就叫做序列化函数。
把字符串转换为数据对象的过程,叫做反序列化,例如:调用|SON.parse()函数的操作,叫做JSON反序列化。因此JSON.parse()函数就叫做反序列化函数。
工作中常用json还是xml作为传输的格式?
json是最常用的方式:
1、解析简单2、结构清晰xml
缺点:
1、内容比json大,传输比json占用更多的带宽
2、解析很麻烦,需要借助解析框架。门槛高
<!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>
</head>
<body>
点击按钮,显示对应的内容
<hr>
<input type="button" value="显示" id="btn">
<div id="div1"></div>
</body>
<script>
var btn = document.getElementById("btn")
btn.onclick = function() {
//创建XMLHttpRequest
var xmlhttp = new XMLHttpRequest()
//请求方式。地址
xmlhttp.open("get", "data/student.json", true)
//第三部:设置响应服务器端数据处理
xmlhttp.onreadystatechange = function() {
// 做数据处理
// /需要将json字符串转换成js对象,JSON.parse()实现反序列化
var students = JSON.parse(xmlhttp.responseText)
// console.log(students[0].stuID)
var table = "<table border='1' bordercolor='red'><tr><th>学号</th><th>姓名</th><th>年龄</th></tr>";
for (var i = 0; i < students.length; i++) {
// console.log(students[i])
var stuid = students[i].stuID
var stuname = students[i].stuName
var stuage = students[i].stuAge
table += "<tr><td>" + stuid + "</td><td>" + stuname + "</td><td>" + stuage + "</td></tr>"
}
table += "</table>"
document.querySelector("#div1").innerHTML = table
}
//成功
xmlhttp.send()
// xmlhttp.onload
}
</script>
</html>
student.json文件:
[{
"stuID": "1001",
"stuName": "张三",
"stuAge": 20
}, {
"stuID": "1002",
"stuName": "李四",
"stuAge": 19
}, {
"stuID": "1003",
"stuName": "李梅",
"stuAge": 21
}, {
"stuID": "1004",
"stuName": "Rose",
"stuAge": 19
}, {
"stuID": "1005",
"stuName": "Tom",
"stuAge": 20
}]
$ajax():
执行异步AJAX请求。
定义和用法:
ajax()方法用于执行AJAX(异步HTTP)请求。
所有的jQuery AJAX方法都使用ajax()方法。该方法通常用于其他方法不能完成的请求。
语法:
$.ajax({name : value,name : value,...}
该参数规定AJAX请求的一个或多个名称/值对。
下面的表格中列出了可能的名称/值:
名称 | 值/描述 |
async | 布尔值,表示请求是否异步处理。默认是true。 |
type | 规定请求的类型(GET 或 POST) . |
url | 规定发送请求的URL。默认是当前页面。 |
success(result,status,xhr) | 当请求成功时运行的函数。 |
dataType | 预期的服务器响应的数据类型。 |
beforeSend(xhr) | 发送请求前运行的函数。 |
complete(xhr,status) | 请求完成时运行的函数(在请求成功或失败之后均调用,即在success和error函数之后)。 |
data | 规定要发送到服务器的数据。 |
error(xhr,status,error) | 如果请求失败要运行的函数。 |
<!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="js/jquery-3.6.0.min.js"></script>
</head>
<body>
点击按钮,显示对应的内容
<hr>
<input type="button" value="显示" id="btn">
<div id="div1"></div>
</body>
<script>
$(function() {
$("#btn").click(function() {
$.ajax({
type: "get", //请求方式
url: "data/student.json", //请求的url
async: true, //异步
dataType: "text", //响应的数据类型
success: function(data) {
// console.log(typeof data)
var students = JSON.parse(data)
for (var i = 0; i < students.length; i++) {
console.log(students[i].stuID)
}
}
})
})
})
</script>
</html>
student.json文件:
[{
"stuID": "1001",
"stuName": "张三",
"stuAge": 20
}, {
"stuID": "1002",
"stuName": "李四",
"stuAge": 19
}, {
"stuID": "1003",
"stuName": "李梅",
"stuAge": 21
}, {
"stuID": "1004",
"stuName": "Rose",
"stuAge": 19
}, {
"stuID": "1005",
"stuName": "Tom",
"stuAge": 20
}]
$.get()和$.plost()
jQuery get()和post()方法用于通过HTTP GET或POST请求从服务器请求数据。
HTTP请求:GET vs POST:
两种在客户端和服务器端进行请求-响应的常用方法是:GET和POST。
- GET-从指定的资源请求数据
- POST -向指定的资源提交要处理的数据
- GET基本上用于从服务器获得(取回)数据。注释:GET方法可能返回缓存数据。
- POST也可用于从服务器获取数据。不过,POST方法不会缓存数据,并且常用于连同请求一起发送数据。
$.get()方法:
$.get()方法通过HTTP GET请求从服务器上请求数据。
语法:
$.get(URL,ca11back);
或
$.get( URL [,data ] l,ca7lback ] [,dataType ] )
- URL:发送请求的URL字符串。
- -data:可选的,发送给服务器的字符串或key/value键值对。
- callback:可选的,请求成功后执行的回调函数。
- data:可选的,发送给服务器的字符串或key/value键值对。
- callback:可选的,请求成功后执行的回调函数。
- dataType:可选的,从服务器返回的数据类型。默认︰智能猜测(可以是xml, json, script,或 html)。
$(""#btn1").c1ick(function(){
$.get("demo01.txt" , function(data,status){
alert("返回内容:"+ data + "n状态:”+ status) ;
});
})
- $.get()的第一个参数是我们希望请求的URL ("demo.txt")
- 第二个参数是回调函数。第一个回调参数存有被请求页面的内容,第二个回调参数存有请求的状态。
<!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="js/jquery-3.6.0.min.js"></script> </head> <body> 点击按钮,显示对应的内容 <hr> <input type="button" value="显示" id="btn"> <div id="div1"></div> </body> <script> $.get("data/student.json", function(data) { // console.log(typeof data) var table = "<table border='1' bordercolor='red'><tr><th>学号</th><th>姓名</th><th>年龄</th></tr>"; for (var i = 0; i < data.length; i++) { console.log(data[i]) var stuid = data[i].stuID var stuname = data[i].stuName var stuage = data[i].stuAge table += "<tr><td>" + stuid + "</td><td>" + stuname + "</td><td>" + stuage + "</td></tr>" } table += "</table>" $("#div1").html(table) }) </script> </html>
student.json文件:
[{
"stuID": "1001",
"stuName": "张三",
"stuAge": 20
}, {
"stuID": "1002",
"stuName": "李四",
"stuAge": 19
}, {
"stuID": "1003",
"stuName": "李梅",
"stuAge": 21
}, {
"stuID": "1004",
"stuName": "Rose",
"stuAge": 19
}, {
"stuID": "1005",
"stuName": "Tom",
"stuAge": 20
}]