Ajax 是什么?

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML)是指一种创建交互式网页应用的网页开发技术。
它由以下几种技术组合而成,包括:

  • HTML/XHTML——主要的内容表示语言。
  • CSS——为XHTML提供文本格式定义。
  • DOM——对已载入的页面进行动态更新。
  • XML——数据交换格式。
  • XSLT——将XML转换为XHTML(用CSS修饰样式)。
  • XMLHttp——用XMLHttpRequest来和服务器进行异步通信,是主要的通信代理。
  • JavaScript——用来编写Ajax引擎的脚本语言。

在Ajax解决方案中,HTML/XHTML、DOM以及JavaScript是必须的。大概分为三个过程:

  • 使用XMLHttpRequest发请求
  • 服务器返回XML格式字符串
  • JS解析XML并更新局部变量

XMLHttpRequest对象

当需要异步与服务器交换数据时,需要XMLHttpRequest对象来异步交换。XMLHttpRequest对象的主要属性有:

  • onreadystatechange——每次状态改变所触发事件的事件处理程序。
  • responseText——从服务器进程返回数据的字符串形式。
  • responseXML——从服务器进程返回的DOM兼容的文档数据对象。
  • status——从服务器返回的数字代码,状态码如404(未找到)和200(已就绪)。
  • status Text——伴随状态码的字符串信息。
  • readyState——对象状态值。对象状态值有以下几个:
    0 - (未初始化)还没有调用send()方法
    1 - (载入)已调用send()方法,正在发送请求
    2 - (载入完成)send()方法执行完成
    3 - (交互)正在解析响应内容
    4 - (完成)响应内容解析完成,可以在客户端调用了
    对于readyState的状态值,其中“0”状态是默认状态值,而对于成功访问的状态(得到信息)我们大多数采用“4”进行判断

Ajax的核心就是是JavaScript对象XmlHttpRequest,这个对象为向服务器发送请求和解析服务器响应提供了流畅的接口。XmlHttpRequest可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。


XMLHttpRequest对象用法

XMLHttpRequest对象有两个重要方法 open与send

 let request = new XMLHttpRequest()
request.open('GET','/xxx') // 配置request
request.send()

open方法:

URL是相对于当前页面的路径,也可以似乎用绝对路径。open方法不会向服务器发送真正请求,它相当于初始化请求并准备发送。只能向同一个域中使用相同协议和端口的URL发送请求,否则会因为安全原因报错。

在发送同步请求的时候没问题,只有得到响应后才会执行检查status语句,但是在异步请求时,JavaScript会继续执行,不等生成响应就检查状态码,这样我们不能保证检查状态码语句是在得到响应后执行,这时候我们可以检查request对象的readyState属性,该属性表示请求/响应过程中的当前活动阶段,每当readyState值改变的时候都会触发一次onreadystatechange事件。

  request.onreadystatechange = function(){
if(request.readyState===4){
if(request.status>=200 && request.status<300){
let string = request.responseText
// 把符合 JSON 语法的字符串转换成 JS 对应的值
let object = window.JSON.parse(string)
}else if(request.status >= 400){
console.log('说明请求失败')
}
}
}

CORS(跨源资源共享)

CORS(Cross-Origin Resource Sharing)允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
同源策略 : 只有协议+端口+域名 一模一样的才允许发AJAX请求。AJAX可以读取响应内容。
突破同源策略 === 跨域
CORS将导致跨域访问的请求分为三种:Simple Request(请求没有包含任何自定义请求头),Preflighted Request(请求包含了任何自定义请求头)以及Requests with Credential(跨域请求包含了当前页面的用户凭证)。

//响应头用来记录可以访问该资源的域 ,它的值要么是请求时Origin字段的具体值,要么是一个*,表示接受任意域名的请求。
('Access-Control-Allow-Origin':,'*')



原生 JS 写出AJAX 请求

  let request = new XMLHttpRequest()
request.open('get','/xxx')
request.send() request.onreadystatechange = function(){
if(request.readyState===4){
if(request.status>=200 && request.status<300){
let string = request.responseText
let object = window.JSON.parse(string)
}else if(request.status >= 400){
console.log('说明请求失败')
}
}
}

jQuery.ajax封装代码链接

window.jQuery = function(nodeOrSelector){
let nodes = {}
nodes.addClass = function(){}
nodes.html = function(){}
return nodes
}
window.$ = window.jQuery
window.jQuery.ajax = function({url,method,body,headers}){
return new Promise(function(resolve,reject){
let request = new XMLHttpRequest()
request.open(method,url)
for(let key in headers){
let value = headers[key]
requeq.setRequestHeader(key,value)
}
request.onreadystatechange = ()=>{
if(request.readyState===4){
if(request.status >=200 && request.status <300){
resolve.call(undefined,request.responseText)
}else if(request.status >= 400){
reject.call(undefined,request)
}
}
}
request.send(body)
})
} myButton.addEventListener('click',(e)=>{
window.jQuery.ajax({
url: '/xxx',
method: 'get',
headers:{
'content-type':'application/x-www-form-urlencoded',
'frank': '18'
},
}).then(
(text)=>{console.log(text)},
(request)=>{console.log(request)},
)
})

Ajax 详解及CORS的更多相关文章

  1. Cross-Origin Resource Sharing(CORS)详解,CORS详解,CORS原理分析

    Keywords CORS, 跨域,JS跨域调用,Ajax CORS 跨域,跨域详解,CORS跨域原理 Cross-Origin Resource Sharing详解 Cross-Origin Res ...

  2. $.ajax()方法所有参数详解;$.get(),$.post(),$.getJSON(),$.ajax()详解

    [一]$.ajax()所有参数详解 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注 ...

  3. Ajax详解及使用Ajax时的返回值类型有哪些?

    Ajax详解 Ajax = 异步 JavaScript 和 XML. Ajax 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以在 ...

  4. $.ajax()详解

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  5. jQuery中$.ajax()详解(转)

    JQuery中$.ajax()方法参数详解     url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get) ...

  6. 解决ajax跨域的方法原理详解之Cors方法

    1.神马是跨域(Cross Domain)   对于端口和协议的不同,只能通过后台来解决.   一句话:同一个ip.同一个网络协议.同一个端口,三者都满足就是同一个域,否则就是 跨域问题了.而为什么开 ...

  7. Ajax详解

    一:什么是Ajax AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法 ...

  8. AJAX 详解注释很全来自互联网

    1: //用户名校验的方法 2: //这个方法使用XMLHTTPRequest对象进行AJAX的异步数据交互 3: var xmlhttp; 4: function verify(){ 5: //1. ...

  9. jquery ajax详解

    详细参数列表url:发送请求的连接地址type:请求方式 get:获取 post:发送 put和deletetimeout:设置请求超时时间async:默认true为异步请求,false同步请求锁住浏 ...

随机推荐

  1. 文艺splay,占坑等着填

    昨天CF上去就A了前三道题,然后自闭罚坐一个小时什么也没写出来23333.似乎D题人均wa3发就很烦.还是肤浅了 今天精神状态不太好,可能是晚睡的缘故,那不如明天一起写了算了 蹲一波大选结果,蹲一波s ...

  2. PyQt(Python+Qt)学习随笔:QTableWidget的findItems和selectedItems搜索项和访问选中项方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.搜索项 在表格部件中,可以根据文本以及匹配模式来搜索满足条件的项,调用语法: list[QTab ...

  3. 第11.27节 Python正则小结:正则静,静则明,明则虚,虚则无为而无不为也

    正则表达式的章节到此就结束了,老猿现在觉得对我们这些身具程序猿基因特色的人来说,正则表达式应该是蛮可口的开胃小菜. 在写标题时,本来想写"正则表达式小结",后来想了想,百度了一下, ...

  4. 第十六章、Model/View开发:QColumnView的作用及对应Model

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在Qt Designer的Item Views(Model-based)部件中,Colum ...

  5. 性能测试学习之路 (一)认识jmeter(性能测试流程 && 性能测试通过标准 &&jmeter体系结构)

    性能测试是通过自动化的测试工具模拟多种正常.峰值以及异常负载条件来对系统的各项性能指标进行测试. 1 性能测试技能树 性能测试是一项综合性的工作,致力于暴露性能问题,评估系统性能趋势.性能测试工作实质 ...

  6. hihocoder 1489(微软2017, 数学,模拟)

    题目链接:http://hihocoder.com/problemset/problem/1489?sid=1587434 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 ...

  7. Go微服务实践之增删改查

    从此篇文章开始,我们来陆续介绍 go-zero 开发一个项目所需要的组件和开发实践. 首先我们从 model 层开始,来说说go-zero 的API以及封装细节.首先 model 层连接的API集中在 ...

  8. Springboot集成xxl-Job

    一.前言 xxl-job一个轻量级的分布的调度中间件,详情介绍自己到官网看:https://www.xuxueli.com/xxl-job/ 二.客户端(执行器) 引入依赖compile group: ...

  9. Day2 Scrum 冲刺博客

    线上会议: 昨天已完成的工作与今天计划完成的工作及工作中遇到的困难: 成员姓名 昨天完成工作 今天计划完成的工作 工作中遇到的困难 纪昂学 总结会议内容,思考自己所分配到的任务 创建一个Cell类,用 ...

  10. Vue 的响应式原理中 Object.defineProperty 有什么缺陷?为什么在 Vue3.0 采用了 Proxy,抛弃了 Object.defineProperty?

    Object.defineProperty无法监控到数组下标的变化,导致通过数组下标添加元素,不能实时响应: Object.defineProperty只能劫持对象的属性,从而需要对每个对象,每个属性 ...