第 1 章:原生 AJAX

1.1 AJAX 简介

AJAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求,
最大的优势:无刷新获取数据。
AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。

1.2 XML 简介

XML 可扩展标记语言。 XML 被设计用来传输和存储数据。 XML 和 HTML 类似,不同的是 HTML 中都是预定义标签,而 XML 中没有预定义标签, 全都是自定义标签,用来表示一些数据.

比如说我有一个学生数据: name = "孙悟空" ; age = 18 ; gender = "男" ; 用 XML 表示:
<student> <name>孙悟空</name> <age>18</age> <gender>男</gender>
</student>

现在已经被 JSON 取代了。

1.3 AJAX 的特点

1.3.1 AJAX 的优点
  1. 可以无需刷新页面而与服务器端进行通信。
  2. 允许你根据用户事件来更新部分页面内容。
1.3.2 AJAX 的缺点
  1. 没有浏览历史,不能回退
  2. 存在跨域问题(同源)
  3. SEO 不友好

1.4 AJAX 的使用

1.4.1 核心对象

XMLHttpRequest,AJAX 的所有操作都是通过该对象进行的。

1.4.2 使用步骤
  1. 创建 XMLHttpRequest 对象 var xhr = new XMLHttpRequest();
  2. 设置请求信息 xhr.open(method, url); //可以设置请求头,一般不设置
    xhr.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);
  3. 发送请求 xhr.send(body) //get 请求不传 body 参数,只有 post 请求使用
  4. 接收响应 //xhr.responseXML 接收 xml 格式的响应数据 //xhr.responseText 接收文本格式的响应数据
xhr.onreadystatechange = function (){ if(xhr.readyState == 4 && xhr.status == 200){ var text = xhr.responseText; console.log(text); }
}
1.4.3 解决 IE 缓存问题

问题:在一些浏览器中(IE),由于缓存机制的存在,ajax 只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。

解决方式:浏览器的缓存是根据 url 地址来记录的,所以我们只需要修改 url 地址 即可避免缓存问题

  xhr.open("get","/testAJAX?t="+Date.now());
1.4.4 AJAX 请求状态

xhr.readyState 可以用来查看请求当前的状态
0: 表示 XMLHttpRequest 实例已经生成,但是 open()方法还没有被调用。
1: 表示 send()方法还没有被调用,仍然可以使用 setRequestHeader(),设定 HTTP请求的头信息。
2: 表示 send()方法已经执行,并且头信息和状态码已经收到。
3: 表示正在接收服务器传来的 body 部分的数据。
4: 表示服务器数据已经完全接收,或者本次接收已经失败了

代码演示:

1. ajax发送GET请求

get.html:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>AJAX GET 请求</title><style type="text/css">#result {width: 200px;height: 100px;border: 1px solid pink;}</style></head><body><button>点击发送请求</button><div id="result"></div><script>// 获取button元素const btn = document.getElementsByTagName('button')[0];const result = document.getElementById('result');// 绑定事件btn.onclick = function() {// 1.创建对象const xhr = new XMLHttpRequest();// 2.初始化 设置请求方法 和 urlxhr.open('GET', 'http://127.0.0.1:8000/server?a=100&b=200');// 3.发送xhr.send();// 4.事件绑定,处理服务端返回的结果xhr.onreadystatechange = function() {// 判断 (服务端返回了所有的结果)if (xhr.readyState === 4) {// 判断响应状态码 200 404 403 500if (xhr.status >= 200 && xhr.status < 300) {// 处理服务端响应结果 行 头 空行 体// 1.响应行console.log(xhr.status); // 状态码console.log(xhr.statusText); // 状态状态字符串console.log(xhr.getAllResponseHeaders()); // 所有的响应头信息console.log(xhr.response); // 响应体信息  // 设置result的文本  result.innerHTML = xhr.response;} else {}}}}</script></body>
</html>

server.js:

// 1. 引入express
const express = require('express')// 2. 创建应用对象
const app = express()// 3. 创建路由规则
app.get('/server', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// response.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');// 设置响应体response.send('hello ajax')
})// 4. 监听端口 启动服务
app.listen(8000, () => {console.log('服务已经启动,8000端口监听中...')
})

2. ajax发送POST请求

server.js :

// 1. 引入express
const express = require('express')// 2. 创建应用对象
const app = express()// 3. 创建路由规则
app.get('/server', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// response.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');// 设置响应体response.send('hello ajax')
})app.post('/server', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// response.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');// 设置响应体response.send('hello ajax post')
})// 4. 监听端口 启动服务
app.listen(8000, () => {console.log('服务已经启动,8000端口监听中...')
})

post.html:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>AJAX POST 请求</title><style type="text/css">#result {width: 200px;height: 100px;border: 1px solid pink;}</style></head><body><p>当鼠标悬浮在div上时发送请求</p><div id="result"></div><script>const result = document.getElementById('result');// 绑定事件result.addEventListener('mouseover', function() {// console.log('test')// 1. 创建对象const xhr = new XMLHttpRequest();// 2. 初始化 设置请求类型 和 urlxhr.open('POST', 'http://127.0.0.1:8000/server')// 3. 发送xhr.send('aaa=100&bbb=200')// 4. 事件绑定xhr.onreadystatechange = function() {// 判断if(xhr.readyState === 4) {if(xhr.status >= 200 && xhr.status < 300) {// 处理服务器返回的结果result.innerHTML = xhr.response} else {}}}}) </script></body>
</html>



ajax服务端响应json数据

json.html:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>JSON</title><style type="text/css">#result {width: 200px;height: 100px;border: 1px solid pink;}</style></head><body><p>当按下键盘时发送请求</p><div id="result"></div><script>const result = document.getElementById('result');// 绑定键盘按下事件window.onkeydown = function () {// console.log('test')// 发送请求const xhr = new XMLHttpRequest();// 设置响应体数据类型xhr.responseType = 'json'// 初始化xhr.open('GET', 'http://127.0.0.1:8000/json-server')// 发送xhr.send()// 事件绑定xhr.onreadystatechange = function () {if(xhr.readyState === 4) {if(xhr.status >= 200 && xhr.status<300) {// 处理服务端返回结果// console.log(xhr.response)// result.innerHTML = xhr.response// 手动对服务器返回的数据进行转化/* let data = JSON.parse(xhr.response)console.log(data)result.innerHTML = data.name */// 自动转换 ,通过设置响应体数据类型xhr.responseType = 'json'console.log(xhr.response)result.innerHTML = xhr.response.name}}}}</script></body>
</html>

server.js:

// 1. 引入express
const express = require('express')// 2. 创建应用对象
const app = express()// 3. 创建路由规则
app.get('/server', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 设置响应体response.send('hello ajax')
})// all 可以接收任意类型的请求
app.all('/server', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 允许前端post请求 自定义请求头名称response.header('Access-Control-Allow-Headers', '*');// 设置响应体response.send('hello ajax post')
})app.all('/json-server', (request, response) => {// 设置响应头 设置允许跨域response.setHeader('Access-Control-Allow-Origin', '*')// 允许前端post请求 自定义请求头名称response.header('Access-Control-Allow-Headers', '*');// 响应一个数据const data = {name: 'zep'};// 对 对象进行字符串转换let str = JSON.stringify(data)// 设置响应体,send方法只接收字符串类型的参数response.send(str)
})// 4. 监听端口 启动服务
app.listen(8000, () => {console.log('服务已经启动,8000端口监听中...')
})
手动对服务端返回的字符串数据进行转换,把字符串转成对象:

自动转换,通过设置响应体数据类型xhr.responseType = ‘json’

一、AJAX学习笔记——原生AJAX (ajax简介、XML简介、ajax优缺点、ajax的使用)相关推荐

  1. Ajax学习笔记-动力节点-王鹤老师

    Ajax学习笔记-动力节点-王鹤老师 视频教程来自:https://www.bilibili.com/video/BV15k4y167XM?spm_id_from=333.999.0.0 第一节 全局 ...

  2. IOS学习笔记02---语言发展概述,计算机语言简介.

    IOS学习笔记02---语言发展概述,计算机语言简介. ------------------------------------------------------------------------ ...

  3. P4学习笔记(三)P4编程语言简介

    文章目录 P4学习笔记(三)P4编程语言简介 基本数据类型 Typedef 声明和初始化变量 元数据 参考资料 P4学习笔记(三)P4编程语言简介 上图展示了P4语言主要结构,下面简单讲解一下P4的基 ...

  4. SW2017学习笔记(三)草图的简介、绘制

    SW2017学习笔记(三)草图的简介.绘制 草图的简介 如何快速进入草图环境 草图的绘制 绘制直线 绘制矩形 绘制圆与圆弧 直线与圆弧的快速切换 绘制多边形(正多边形) 绘制槽口 椭圆 样条曲线 文本 ...

  5. D3D角色动画学习笔记(一)——角色动画简介与初步规划

    D3D角色动画学习笔记(一)--角色动画简介与初步规划 写这个系列是基于自己学习角色动画之后,相对自己的成果做一个整理,还可以给大家做一个角色动画的预览,可能会节省大家的一点时间,同时也希望各位大神能 ...

  6. OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作

    OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作 一.Write_XML_and_YAML_File(写入XML) #include <opencv2/opencv ...

  7. Ajax学习笔记--- 【xmind 详细展示 浏览器与 服务器端通信,请求与响应报文】

    php和express用来做后端,还是express强大和方便!!! 翻看笔记才知道自己当时下载Fiddler,Wampserver,phpstudy_pro是为了什么,实在不敢说自己学过php 文章 ...

  8. 阿瑶的ajax学习笔记

    1.AJAX简介 AJAX全称为Asynchronous JavaScript And XML,就是异步的 JS 和 XML. 通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势: 无刷新获取 ...

  9. 黑马ajax学习笔记02--art-template模板,自动提示,防抖,三级联动,fromData传参及传文件,同源,jsonp,天气预报,CROS,服务器桥接,withCredential跨域登录

    1.模板引擎概述 作用:使用模板引擎提供的模板语法,可以将数据和HTML拼接起来 实际上是实现在客户端做数据拼接 art-template模板引擎 官网:http://aui.github.io/ar ...

最新文章

  1. Linux sed 打印模式空间p命令使用案例
  2. 记录java应用部署到k8s中
  3. apache lucene_Apache Lucene基础教程
  4. 论文浅尝 - AAAI2020 | 多模态基准指导的多模态自动文摘
  5. mysql jquery tree_php mysql js实现树形菜单代码
  6. 【Flink】Flink 控制台能消费 但是 Flink 任务不能消费 内置topic 导致问题
  7. mvn 汇编_【答疑解惑】艺术生留学小白问题答疑汇编之精华
  8. win7+ubuntu双系统干净删除ubuntu
  9. gzp解压命令 linux_Linux-压缩解压命令(gzip,zip,tar,bzip)
  10. 如何在Rancher 2.0上快速部署Datadog
  11. DBCC CHECKIDENT 和SET IDENTITY_INSERT table OFF
  12. Hadoop开发环境搭建之Eclipse配置
  13. 安装vs遇到 不受信任的证书或者 时间戳签名和/或证书无法验证或已损坏 解决方案
  14. 怀念张孝祥,张老师一路走好
  15. WIN10桌面任务栏消失变黑色的解决方法
  16. JavaScript判断输入的数是不是素数
  17. 判断质数和合数python代码_质数,非质数之Python
  18. 模型部署入门教程(一):模型部署简介
  19. 华三模拟器完成交换机堆叠IRF实验
  20. 新开的淘宝店铺要怎么操作才能排名靠前?

热门文章

  1. 学成在线--18.新增课程(课程分类查询)
  2. Diango博客--15.通过 Django Pagination 实现简单分页(一)
  3. ubuntu java classpath 设置_在Ubuntu中正确设置java classpath和java_home
  4. java 子类 父类 转换_Java子类与父类之间的类型转换
  5. TensorFlow 实例一:线性回归模型
  6. modbus从站模拟软件_作为工控电气人,你知道我们必备的软件有哪些吗?
  7. 机器学习之凸优化原理推导及相关知识总结
  8. 利用Sqoop在数据库和Hive、HDFS之间做ETL操作
  9. Linux中的crontab详解
  10. Vim的基本操作总结