简介

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

优点

  • 无需刷新页面即可与服务器进行通信。
  • 允许根据用户事件来更新部分页面内容。

缺点

  • 没有浏览历史,不能回退
  • 存在跨域问题,ajax默认是遵循同源策略,跨域请求是无法通过ajax请求的
  • seo不友好,无法通过爬虫获取到ajax请求的数据,也无法在浏览器的源代码选项中获取到相关的源码

总而言之:ajax不是什么新鲜的对象,我们把它当作是在一个已有的网页中,我们可以通过它请求后端的数据来显示在之前的网页中。

AJAX的使用

  • GET请求
btn.onclick = function(){//1. 创建对象const xhr = new XMLHttpRequest();//浏览器开发者选项中的xhr里面的信息就是该页面的ajax请求//2. 初始化 设置请求方法和 urlxhr.open('GET', 'http://127.0.0.1:8000/server?a=100&b=200&c=300');//3. 发送xhr.send();//4. 事件绑定 处理服务端返回的结果xhr.onreadystatechange = function(){//判断 (服务端返回了所有的结果)if(xhr.readyState === 4){// 2xx 成功if(xhr.status >= 200 && xhr.status < 300){//响应// console.log(xhr.status);//状态码// console.log(xhr.statusText);//状态字符串// console.log(xhr.getAllResponseHeaders());//所有响应头// console.log(xhr.response);//响应体//设置 result 的文本result.innerHTML = xhr.response;}else{}}}}
  • POST请求
result.addEventListener("mouseover", function(){//1. 创建对象const xhr = new XMLHttpRequest();xhr.responseType='json'//2. 初始化 设置类型与 URLxhr.open('POST', 'http://127.0.0.1:8000/server');//有时候ie浏览器会有缓存问题,因此通常情况下最好给每个url拼接上一个时间戳参数//设置请求头xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.setRequestHeader('name','xxx');//自定义的请求头需要在后端中设置Access-Control-Allow-Headers响应头//3. 发送xhr.send('a=100&b=200&c=300');// xhr.send('a:100&b:200&c:300');// xhr.send('1233211234567');//4. 事件绑定xhr.onreadystatechange = function(){//判断if(xhr.readyState === 4){if(xhr.status >= 200 && xhr.status < 300){//处理服务端返回的结果result.innerHTML = xhr.response;}}}});
  • 超时与网络异常问题
btn.addEventListener('click', function(){const xhr = new XMLHttpRequest();//超时设置 2s 设置xhr.timeout = 2000;//超时回调xhr.ontimeout = function(){alert("网络异常, 请稍后重试!!");}//网络异常回调xhr.onerror = function(){alert("你的网络似乎出了一些问题!");}xhr.open("GET",'http://127.0.0.1:8000/delay');xhr.send();xhr.onreadystatechange = function(){if(xhr.readyState === 4){if(xhr.status >= 200 && xhr.status< 300){result.innerHTML = xhr.response;}}}})
  • 重复请求问题——关键在于设置一个标志位
    <script>//获取元素对象const btns = document.querySelectorAll('button');let x = null;//标识变量let isSending = false; // 是否正在发送AJAX请求btns[0].onclick = function(){//判断标识变量if(isSending) x.abort();// 如果正在发送, 则取消该请求, 创建一个新的请求x = new XMLHttpRequest();//修改 标识变量的值isSending = true;x.open("GET",'http://127.0.0.1:8000/delay');x.send();x.onreadystatechange = function(){if(x.readyState === 4){//修改标识变量isSending = false;}}}// abortbtns[1].onclick = function(){x.abort();}</script>
  • 使用express框架搭建一个后端
//1. 引入express
const express = require('express');//2. 创建应用对象
const app = express();//3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装
//all方法表示所有类型的请求都可以,get、post、delete。。。
app.all('/server', (request, response)=>{//设置响应//response.set("Access-Control-Allow-Origin","http://127.0.0.1:3000");//只对http://127.0.0.1:3000这个url的请求允许跨域response.setHeader("Access-Control-Allow-Origin","*")//对所有请求允许跨域response.setHeader("Access-Control-Allow-Headers","*")//允许各种请求头,包括自定义的和http已经定义的请求头response.send('HELLO EXPRESS');
});//4. 监听端口启动服务
app.listen(8000, ()=>{console.log("服务已经启动, 8000 端口监听中....");
});

AJAX的请求状态

xhr.readyState 可以用来查看请求当前的状态

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

跨域问题

  • 同源策略
    同源策略是浏览器的一种安全策略。所谓的同源是指:协议、域名】端口号必须完全相同,而违背同源策略就是跨域。
    如果违背同源策略,浏览器的开发者工具就会报如下错误,该网页是从5500端口获取的,但是ajax的请求却是8000端口。

    解决跨域问题有两种方式:

  • CORS

    1. CORS(Cross-Origin Resource Sharing),跨域资源共享。CORS 是官方的跨域解决方案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持get 和 post 请求。跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源
    2. CORS 怎么工作的?
      CORS 是通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应以后就会对响应放行。
  • JSONP
    JSONP(JSON with Padding),是一个非官方的跨域解决方案,只支持 get 请求。在网页有一些标签天生具有跨域能力,比如:img link iframe script。JSONP 就是利用 script 标签的跨域能力来发送请求的。

    案例如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>案例</title>
</head>
<body>用户名: <input type="text" id="username"><p></p><script>//获取 input 元素const input = document.querySelector('input');const p = document.querySelector('p');//声明 handle 函数function handle(data){input.style.border = "solid 1px #f00";//修改 p 标签的提示文本console.log(data)p.innerHTML = data.name;}//绑定事件input.onblur = function(){//获取用户的输入值let username = this.value;//向服务器端发送请求 检测用户名是否存在//1. 创建 script 标签const script = document.createElement('script');//2. 设置标签的 src 属性script.src = 'http://127.0.0.1:8000/server';//3. 将 script 插入到文档中document.body.appendChild(script);}</script>
</body>
</html>
//1. 引入express
const express = require('express');//2. 创建应用对象
const app = express();//3. 创建路由规则
// request 是对请求报文的封装
// response 是对响应报文的封装
app.all('/server', (request, response)=>{//设置响应// response.setHeader("Access-Control-Allow-Origin","*")// response.setHeader("Access-Control-Allow-Headers","*")const data = {name: 'sdsdsd'};response.end(`handle(${JSON.stringify(data)})`);//这样就会回调到html中的handle方法
});//4. 监听端口启动服务
app.listen(8000, ()=>{console.log("服务已经启动, 8000 端口监听中....");
});

最后

除了前面介绍的几个字ajax的请求之外,fetch函数也是可以用来进行ajax请求的
https://developer.mozilla.org/zh-CN/docs/Web/API/fetch

前端必备技术之——AJAX相关推荐

  1. web前端开发三个阶段和三要素,学前端必备基础知识

    web前端开发三个阶段和三要素是什么?下面就跟着小编一起来看看吧! Web前端市场前景广阔,吸引了很多人涌入学习,但无论是零基础小白,亦或是想要进阶深造的程序员,前端开发三个阶段和三要素都是他们必学的 ...

  2. Web前端开发工程师必备技术列表

    WEB标准,Web前端开发工程师必备技术列表 想要打造并拥有一流的Web产品开发团队,在团队成员基础能力上一定要下功夫.对于Web前端产品开发来说,仅仅掌握Web1.0时代简单的"网页套接& ...

  3. SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板)

    SSI技术的前端动态实现(AJAX+SSI,适用于任何系统,包括搭载嵌入式RTOS的STM32系列开发板) 前言 RTOS简述及开发困难所在 开发环境 详细的解决方案 SSI初加载 基础的动态操作 伪 ...

  4. HTML5前端入门教程:Ajax 异步请求技术

    AJAX的全称是Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). ✦ajax不是新的编程语言,而是一种使用现有标准的新方法.ajax是与服务 ...

  5. 前端技术之Ajax(一)

    前端技术之Ajax 同步交互 异步交互 AJAX 异步验证用户名占用问题 同步交互 首先用户向HTTP服务器提交一个处理请求.接着服务器端接收到请求后,按照预先编写好的程序中的业务逻辑进行处理,比如和 ...

  6. 前端必备:Javascript 3种书写格式详细介绍

    在网页中编写JavaScript代码时,有3种书写位置,分别是行内式.内嵌式(也称为嵌人式)和外部式(也称为外链式),下面分别进行讲解. 1.行内式 行内式是指将单行或少量的JavaScript代码写 ...

  7. html 表单自动数值,web前端学习技术之对HTML5 智能表单的理解

    原标题:web前端学习技术之对HTML5 智能表单的理解 Html5新增input的form属性,用于指向特定form表单的id,实现input无需放在form标签之中,即可通过表单进行提交. - t ...

  8. 前端必备,JavaScript面试问题及答案

    前端必备,JavaScript面试问题及答案 1.使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?如何避免这个陷阱? 尽管 typ ...

  9. 推荐 12 个学习前端必备的神仙级工具类项目与网站

    大家好,我是你们的 猫哥,一个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ 前言 猫哥是一个常年混迹在 GitHub 上的猫星人,所以发现了不少好的前端开源项目.常用技巧,在此分享给大家. 公众号:前端Git ...

最新文章

  1. Creating Lists
  2. jdbc就是这么简单
  3. Debian系列软件管理(第二版)
  4. java并发编程之美-阅读记录4
  5. CodeForces - 86D Powerful array(莫队)
  6. 百度贴吧10亿量级LAMP架构分享
  7. python mpi开销_GitHub - hustpython/MPIK-Means
  8. SAP License:再谈SAP系统发票校验的”事后借记”
  9. OCI runtime create failed: container_linux.go:370: starting container process caused: process_linux.
  10. POST的Response数据问题
  11. 文本地址智能识别组件(一)
  12. MQX4.0:MK60DZ10.h头文件GPIO模块…
  13. 动态密码算法介绍与实现
  14. 注册时要求获取手机短信码的实现(java)
  15. 成语归类大全(留着,孩子有用的)
  16. Hive基础知识及底层架构
  17. zero(全志V3S)-32MB Flash移植
  18. 互联网是如何组建的,为什么需要IP地址和MAC地址?
  19. ISO26262解析(一)——概述
  20. macbook上好用的解压软件_macbook上怎么用解压软件解压?用什么解压软件好?

热门文章

  1. KL3611 型号 7脚多位数码管驱动方法
  2. NRF24L01多通道无线病房呼叫系统
  3. (转)通天塔导游讲述C,C++,Lisp,Java,Perl,(我们在亚马逊用到的所有语言),Ruby (我就是喜欢),和Python...
  4. 现代科技概论_现代科技概论课程:力与运动3
  5. Openjudge1388 Lake Counting【DFS/Flood Fill】
  6. linux skype安装路径,如何在Ubuntu 20.04上安装Skype
  7. Win10家庭版任务管理器被禁用,解除方法
  8. VB 隐藏任务栏和显示任务栏
  9. 炒股票新手入门基础知识 跟桥博士炒股票入门课程认识MSCI和纳斯达克指数
  10. Quartz Cron表达式 每周、每月执行一次