update: Ajax

This commit is contained in:
qianguyihao 2021-05-19 00:10:08 +08:00
parent 1e775ba3e7
commit 050ff8ae45
3 changed files with 509 additions and 497 deletions

View File

@ -1,10 +1,7 @@
## 同步和异步回顾 ## 同步和异步回顾
### 同步和异步的简单理解 ### 同步和异步的简单理解
- 同步必须等待前面的任务完成才能继续后面的任务 - 同步必须等待前面的任务完成才能继续后面的任务
- 异步不受当前任务的影响 - 异步不受当前任务的影响
@ -27,8 +24,6 @@ web前端里的异步更新就要用到 Ajax。很多人说如果没有 Aj
关于同步和异步的更详细介绍可以参考本项目的另外一篇文章05-JavaScript 基础异步编程和 Ajax/01-单线程和异步 关于同步和异步的更详细介绍可以参考本项目的另外一篇文章05-JavaScript 基础异步编程和 Ajax/01-单线程和异步
## Ajax ## Ajax
### Ajax 的概念 ### Ajax 的概念
@ -53,7 +48,7 @@ AjaxAsynchronous Javascript And XML异步 JavaScript 和 XML。它并
1创建异步对象 XMLHttpRequest 对象 1创建异步对象 XMLHttpRequest 对象
2使用open方法设置请求参数`open(method, url, async)`参数解释请求的方法请求的url是否异步 2使用 open 方法设置请求参数`open(method, url, async)`参数解释请求的方法请求的 url是否异步第三个参数如果不写则默认为 true
3发送请求`send()` 3发送请求`send()`
@ -63,26 +58,14 @@ AjaxAsynchronous Javascript And XML异步 JavaScript 和 XML。它并
5服务端响应获取返回的数据 5服务端响应获取返回的数据
### Ajax 请求get 请求举例 ## 手写 Ajax
1index.html ### 手写第一个 Ajax 请求
```html get 请求
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>Ajax 发送 get 请求</h1>
<input type="button" value="发送get_ajax请求" id='btnAjax'>
<script type="text/javascript">
// 绑定点击事件
document.querySelector('#btnAjax').onclick = function () {
// 发送ajax 请求 需要 五步
```js
//【发送ajax请求需要五步】
//1创建XMLHttpRequest对象 //1创建XMLHttpRequest对象
var xmlhttp = new XMLHttpRequest(); var xmlhttp = new XMLHttpRequest();
@ -98,17 +81,76 @@ AjaxAsynchronous Javascript And XML异步 JavaScript 和 XML。它并
// 为了保证 数据 完整返回,我们一般会判断 两个值 // 为了保证 数据 完整返回,我们一般会判断 两个值
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
// 如果能够进入这个判断,说明数据请求成功了 // 如果能够进入这个判断,说明数据请求成功了
// 5在注册的事件中获取返回的内容并显示在页面上 //5服务端相应:在注册的事件中,获取返回的内容,并显示在页面上
console.log('数据返回成功'); console.log('数据返回成功');
// 数据是保存在 异步对象的 属性中 // 数据是保存在 异步对象的 属性中
console.log(xmlhttp.responseText); console.log(JSON.stringify(xmlhttp.responseText));
}
};
```
post 请求
```js
//1异步对象
var xmlhttp = new XMLHttpRequest();
//2设置请求参数。包括请求的方法、请求的url。
xmlhttp.open('post', '02.post.php');
// 如果想要使用post提交数据,必须添加此行
xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
//3发送请求
xmlhttp.send('name=fox&age=18');
//4注册事件
xmlhttp.onreadystatechange = function () {
//5服务端相应
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
alert(xmlhttp.responseText);
}
};
```
### 封装Ajax请求重要
todo
## Ajax 请求举例
### Ajax 请求get 请求举例
1index.html
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<h1>Ajax 发送 get 请求</h1>
<input type="button" value="发送get_ajax请求" id="btnAjax" />
<script type="text/javascript">
// 绑定点击事件
document.querySelector('#btnAjax').onclick = function () {
// 发送ajax 请求需要五步
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('get', '02-ajax.php');
xmlhttp.send();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
console.log('数据返回成功');
console.log(xmlhttp.responseText);
// 显示在页面上 // 显示在页面上
document.querySelector('h1').innerHTML = xmlhttp.responseText; document.querySelector('h1').innerHTML = xmlhttp.responseText;
} }
} };
} };
</script> </script>
</body> </body>
</html> </html>
@ -134,27 +176,19 @@ index.html
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8" />
<title>Document</title> <title>Document</title>
</head> </head>
<body> <body>
<h1>Ajax 发送 get 请求</h1> <h1>Ajax 发送 get 请求</h1>
<input type="button" value="发送put_ajax请求" id='btnAjax'> <input type="button" value="发送put_ajax请求" id="btnAjax" />
<script type="text/javascript"> <script type="text/javascript">
// 发送ajax 请求需要五步
// 异步对象
var xhr = new XMLHttpRequest(); var xhr = new XMLHttpRequest();
// 设置属性
xhr.open('post', '02.post.php'); xhr.open('post', '02.post.php');
// 如果想要使用post提交数据,必须添加此行 // 如果想要使用post提交数据,必须添加此行
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
// 将数据通过send方法传递
xhr.send('name=fox&age=18'); xhr.send('name=fox&age=18');
// 发送并接受返回值
xhr.onreadystatechange = function () { xhr.onreadystatechange = function () {
// 这步为判断服务器是否正确响应 // 这步为判断服务器是否正确响应
if (xhr.readyState == 4 && xhr.status == 200) { if (xhr.readyState == 4 && xhr.status == 200) {
@ -197,11 +231,11 @@ index.html
如果想让 form 表单提交数据那样使用 POST 请求就需要使用 XMLHttpRequest 对象的 setRequestHeader()方法 来添加 HTTP 然后在 send() 方法中添加想要发送的数据 如果想让 form 表单提交数据那样使用 POST 请求就需要使用 XMLHttpRequest 对象的 setRequestHeader()方法 来添加 HTTP 然后在 send() 方法中添加想要发送的数据
```javascript ```javascript
xmlhttp.open("POST","ajax_test.php", true); xmlhttp.open('POST', 'ajax_test.php', true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xmlhttp.send("name=smyhvae&age=27"); xmlhttp.send('name=smyhvae&age=27');
``` ```
### onreadystatechange 事件 ### onreadystatechange 事件
@ -236,342 +270,9 @@ status
如果响应的是普通字符串就使用 responseText如果响应的是 XML使用 responseXML 如果响应的是普通字符串就使用 responseText如果响应的是 XML使用 responseXML
## Ajax 传输 XML
### XML 语法
XMLExtensible Markup Language可扩展标记语言详细语法可以查看[#](http://www.w3school.com.cn/xml/index.asp)。
**1XML声明**
```xml
<?xml version="1.0" encoding="UTF-8"?>
```
第一行的声明指定了XML版本(1.0)以及使用的编码
**2自定义标签**
XML中没有默认的标签所有的标签都是我们自己已定义的例如
```xml
<fox></fox>
<name></name>
```
XML中没有单标签都是双标签
**3根节点**
XML中必须要有一个根节点所有的子节点都放置在根节点下例如
```xml
<root1>
<name></name>
</root1>
```
### XML 解析
因为 XML 就是标签所以我们可以直接用**解析Dom元素**的方法解析 XML
**解析过程**
1html 部分包含 xml
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<person id='personXML'>
<name>fox</name>
<age>18</age>
<skill>小花花</skill>
</person>
</body>
</html>
```
2解析 xml
```html
<script type="text/javascript">
var xmlObj = document.getElementById("personXML");
var name = xmlObj.getElementsByTagName('name')[0].innerHTML;
console.log(name);
</script>
```
### ajax 请求解析xml举例
1get_xml.php里面包含了xml文件
```php
<?php
// 设置 返回的为 xml
header('content-type:text/xml; charset= utf-8');
// 读取xml文件 并返回
echo file_get_contents('info/star.xml');
?>
```
上方代码解释
- php 自带了 读取 xml 文件的方法
- php 如果要使用xml传输数据则需要使用header()设置返回的内容为xml
2get_xml.htmlAjax 请求获取并解析xml
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<input type="button" value="获取XMl数据" id='getXML'>
</body>
</html>
<script type="text/javascript">
document.querySelector('#getXML').onclick = function () {
var ajax = new XMLHttpRequest();
ajax.open('get','get_XMl.php');
ajax.send();
ajax.onreadystatechange = function () {
if (ajax.readyState == 4 && ajax.status==200) {
// 如果 返回的是 xml文件
console.log(ajax.responseText);
// 异步 对象中 有另外一个属性 用来专门获取 xml
// xml对象 在浏览器段 就是一个 document对象
// 解析时 可以直接使用 querySelector 或者 getElementById等等 document对象 有的语法
console.log(ajax.responseXML);
console.log(ajax.responseXML.querySelector('kuzi').innerHTML);
// 下面这个 页面文档对象 如果要获取某个标签
console.log(window.document);
}
}
}
</script>
```
## Ajax 传输 JSON
### JSON 的语法
JSON(JavaScript Object Notation)是ECMAScript的子集作用是进行数据的交换语法更为简洁网络传输机器解析都更为迅速
语法规则
- 数据在键值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
数据类型
- 数字整数或浮点数
- 字符串在双引号中
- 逻辑值true false
- 数组在方括号中
- 对象在花括号中
- null
示例
```json
// 对象
{
"name":"fox",
"age":"18",
"sex":"true",
"car":null
}
// 数组
[
{
"name":"小小胡",
"age":"1"
},
{
"name":"小二胡",
"age":"2"
}
]
```
### JavaScript中json 字符串 <--> js 对象
基本上所有的语言都有** json 字符串转化为该语言对象**的语法
比如在 js中
- JSON.parse()将JSON字符串转化为 js 对象例如
```javascript
// 将 JSON 字符串格式化为 js 对象
var jsObj = JSON.parse(ajax.responseText);
```
- JSON.stringify() JS 对象转化为JSON字符串例如
```javascript
var Obj = {
name: "fox",
age: 18,
skill: "撩妹"
};
console.log(Obj);
// 将 js 对象格式化为 JSON 字符串
var jsonStr = JSON.stringify(Obj);
```
### PHP中json 字符串 <--> js 对象
- **json_decode()**方法`json`字符串转化为变量
- **json_encode()**方法将变量转化为`json`字符串
代码举例
```php
<?php
header("Content-Type:text/html;charset=utf-8");
// json字符串
$jsonStr = '{"name":"itcast","age":54,"skill":"歌神"}';
// 字符串转化为 php对象
print_r(json_decode($jsonStr));
echo "<br>";
// php数组
$arrayName = array('name' =>'littleFox' ,'age' => 13 );
// php对象 转化为 json字符串
print_r(json_encode($arrayName));
?>
```
输出结果
```bash
stdClass Object ( [name] => itcast [age] => 54 [skill] => 歌神 )
{"name":"littleFox","age":13}
```
### ajax 请求解析 json举例
1Person.json:
```json
{
"name":"小强",
"skill":"砍树",
"friend":"老板"
}
```
2myJson.php
```php
<?php
// 读取json文件 并返回即可
echo file_get_contents('info/Person.json');
?>
```
3getJson.html
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>获取 json 数据</h1>
<input type="button" value="获取json" id='btnJson'>
</body>
</html>
<script type="text/javascript">
// 获取的是一个 如果要获取多个
// document.querySelectorAll(selector)
document.querySelector("#btnJson").onclick = function () {
var ajax = new XMLHttpRequest();
ajax.open('get','myJson.php');
ajax.send();
ajax.onreadystatechange = function () {
if (ajax.readyState==4&&ajax.status==200) {
// json 字符串 是字符串 所以我们可以 通过 responseText获取
console.log(ajax.responseText);
// 转化为 js对象
var jsObj = JSON.parse(ajax.responseText);
console.log(jsObj);
// 拼接ul s
var str = '';
str+='<ul>';
str+='<li>'+jsObj.name+'</li>';
str+='<li>'+jsObj.skill+'</li>';
str+='<li>'+jsObj.friend+'</li>';
str+='</ul>';
// 设置到界面上
document.body.innerHTML = str;
}
}
}
</script>
```
演示效果
![](http://img.smyhvae.com/20180228_1740.gif)
## jQuery 中的 Ajax ## jQuery 中的 Ajax
JQuery 作为最受欢迎的 js 框架之一常见的 Ajax 已经帮助我们封装好了只需要调用即可更为详细的 api 文档可以查阅[w3cSchool_JQueryAjax](http://www.w3school.com.cn/jquery/jquery_ref_ajax.asp) JQuery 作为最受欢迎的 js 框架之一常见的 Ajax 已经帮助我们封装好了只需要调用即可更为详细的 api 文档可以查阅[w3cSchool_JQueryAjax](http://www.w3school.com.cn/jquery/jquery_ref_ajax.asp)
格式举例 格式举例
@ -583,49 +284,44 @@ $.ajax({
type: 'GET', //请求的方式 type: 'GET', //请求的方式
success: function (argument) {}, // 请求成功执行的方法 success: function (argument) {}, // 请求成功执行的方法
beforeSend: function (argument) {}, // 在发送请求之前调用,可以做一些验证之类的处理 beforeSend: function (argument) {}, // 在发送请求之前调用,可以做一些验证之类的处理
error:function (argument) {console.log(argument);},//请求失败调用 error: function (argument) {
}) console.log(argument);
}, //请求失败调用
});
``` ```
代码举例 代码举例
1index.html 1index.html
```html ```html
<!doctype html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8" />
<title>jquery-ajax</title> <title>jquery-ajax</title>
</head> </head>
<body> <body>
<input type="button" value="点击" id="btn"> <input type="button" value="点击" id="btn" />
<div id="showInfo"></div> <div id="showInfo"></div>
<script type="text/javascript" src="jquery-1.11.2.js"></script> <script type="text/javascript" src="jquery-1.11.2.js"></script>
<script type="text/javascript"> <script type="text/javascript">
$(function () { $(function () {
$('#btn').click(function () {
$("#btn").click(function(){
$.ajax({ $.ajax({
url:"data.php", url: 'data.php',
dataType:"text", dataType: 'text',
type:"get", type: 'get',
success: function (data) { success: function (data) {
alert(data); alert(data);
//$("#showInfo").html(data); //$("#showInfo").html(data);
}, },
error: function (e) { error: function (e) {
console.log(e); console.log(e);
} },
}); });
}); });
}); });
</script> </script>
</body> </body>
</html> </html>
@ -644,15 +340,10 @@ echo $text;
``` ```
## 创作不易赞赏作者 ## 创作不易赞赏作者
如果你觉得本教程对你有帮助或者你想催更不妨赞赏一下 如果你觉得本教程对你有帮助或者你想催更不妨赞赏一下
你的赞赏和认可是我最大的动力 你的赞赏和认可是我最大的动力
![](http://img.smyhvae.com/20210510_2100.jpg) ![](http://img.smyhvae.com/20210510_2100.jpg)

View File

@ -0,0 +1,326 @@
## Ajax 传输 JSON
### JSON 的语法
JSON(JavaScript Object Notation) ECMAScript 的子集作用是进行数据的交换语法更为简洁网络传输机器解析都更为迅速
语法规则
- 数据在键值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
数据类型
- 数字整数或浮点数
- 字符串在双引号中
- 逻辑值true false
- 数组在方括号中
- 对象在花括号中
- null
示例
```json
// 对象
{
"name":"fox",
"age":"18",
"sex":"true",
"car":null
}
// 数组
[
{
"name":"小小胡",
"age":"1"
},
{
"name":"小二胡",
"age":"2"
}
]
```
### JavaScript json 字符串 <--> js 对象
基本上所有的语言都有** json 字符串转化为该语言对象**的语法
比如在 js
- JSON.parse() JSON 字符串转化为 js 对象例如
```javascript
// 将 JSON 字符串格式化为 js 对象
var jsObj = JSON.parse(ajax.responseText);
```
- JSON.stringify() JS 对象转化为 JSON 字符串例如
```javascript
var Obj = {
name: 'fox',
age: 18,
skill: '撩妹',
};
console.log(Obj);
// 将 js 对象格式化为 JSON 字符串
var jsonStr = JSON.stringify(Obj);
```
### PHP json 字符串 <--> js 对象
- **json_decode()**方法`json`字符串转化为变量
- **json_encode()**方法将变量转化为`json`字符串
代码举例
```php
<?php
header("Content-Type:text/html;charset=utf-8");
// json字符串
$jsonStr = '{"name":"itcast","age":54,"skill":"歌神"}';
// 字符串转化为 php对象
print_r(json_decode($jsonStr));
echo "<br>";
// php数组
$arrayName = array('name' =>'littleFox' ,'age' => 13 );
// php对象 转化为 json字符串
print_r(json_encode($arrayName));
?>
```
输出结果
```bash
stdClass Object ( [name] => itcast [age] => 54 [skill] => 歌神 )
{"name":"littleFox","age":13}
```
### ajax 请求解析 json举例
1Person.json:
```json
{
"name": "小强",
"skill": "砍树",
"friend": "老板"
}
```
2myJson.php
```php
<?php
// 读取json文件 并返回即可
echo file_get_contents('info/Person.json');
?>
```
3getJson.html
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<h1>获取 json 数据</h1>
<input type="button" value="获取json" id="btnJson" />
</body>
</html>
<script type="text/javascript">
// 获取的是一个 如果要获取多个
// document.querySelectorAll(selector)
document.querySelector('#btnJson').onclick = function () {
var ajax = new XMLHttpRequest();
ajax.open('get', 'myJson.php');
ajax.send();
ajax.onreadystatechange = function () {
if (ajax.readyState == 4 && ajax.status == 200) {
// json 字符串 是字符串 所以我们可以 通过 responseText获取
console.log(ajax.responseText);
// 转化为 js对象
var jsObj = JSON.parse(ajax.responseText);
console.log(jsObj);
// 拼接ul s
var str = '';
str += '<ul>';
str += '<li>' + jsObj.name + '</li>';
str += '<li>' + jsObj.skill + '</li>';
str += '<li>' + jsObj.friend + '</li>';
str += '</ul>';
// 设置到界面上
document.body.innerHTML = str;
}
};
};
</script>
```
演示效果
![](http://img.smyhvae.com/20180228_1740.gif)
## Ajax 传输 XML
### XML 语法
XMLExtensible Markup Language可扩展标记语言详细语法可以查看[#](http://www.w3school.com.cn/xml/index.asp)。
**1XML 声明**
```xml
<?xml version="1.0" encoding="UTF-8"?>
```
第一行的声明指定了 XML 版本(1.0)以及使用的编码
**2自定义标签**
XML 中没有默认的标签所有的标签都是我们自己已定义的例如
```xml
<fox></fox>
<name></name>
```
XML 中没有单标签都是双标签
**3根节点**
XML 中必须要有一个根节点所有的子节点都放置在根节点下例如
```xml
<root1>
<name></name>
</root1>
```
### XML 解析
因为 XML 就是标签所以我们可以直接用**解析 Dom 元素**的方法解析 XML
**解析过程**
1html 部分包含 xml
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<person id="personXML">
<name>fox</name>
<age>18</age>
<skill>小花花</skill>
</person>
</body>
</html>
```
2解析 xml
```html
<script type="text/javascript">
var xmlObj = document.getElementById('personXML');
var name = xmlObj.getElementsByTagName('name')[0].innerHTML;
console.log(name);
</script>
```
### ajax 请求解析 xml举例
1get_xml.php里面包含了 xml 文件
```php
<?php
// 设置 返回的为 xml
header('content-type:text/xml; charset= utf-8');
// 读取xml文件 并返回
echo file_get_contents('info/star.xml');
?>
```
上方代码解释
- php 自带了 读取 xml 文件的方法
- php 如果要使用 xml 传输数据则需要使用 header()设置返回的内容为 xml
2get_xml.htmlAjax 请求获取并解析 xml
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<input type="button" value="获取XMl数据" id="getXML" />
</body>
</html>
<script type="text/javascript">
document.querySelector('#getXML').onclick = function () {
var ajax = new XMLHttpRequest();
ajax.open('get', 'get_XMl.php');
ajax.send();
ajax.onreadystatechange = function () {
if (ajax.readyState == 4 && ajax.status == 200) {
// 如果 返回的是 xml文件
console.log(ajax.responseText);
// 异步 对象中 有另外一个属性 用来专门获取 xml
// xml对象 在浏览器段 就是一个 document对象
// 解析时 可以直接使用 querySelector 或者 getElementById等等 document对象 有的语法
console.log(ajax.responseXML);
console.log(ajax.responseXML.querySelector('kuzi').innerHTML);
// 下面这个 页面文档对象 如果要获取某个标签
console.log(window.document);
}
};
};
</script>
```

View File

@ -1,7 +1,6 @@
## 函数封装 ## 函数封装
ajax_tool.js ajax_tool.js
@ -234,7 +233,3 @@ test_post.php
?> ?>
``` ```
工程文件
- 2018-02-28-Ajax请求封装.rar