ajax 运行原理及实现 onload/onreadystatechange 错误处理

Ajax实现步骤

  1. 创建ajax对象
let xhr = new XMLHttpRequest()

兼容ie写法

// ActiveXObject('Microsoft.XMLHTTP') IE
// new XMLHttpRequest() 非IE
let xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP')
  1. 设置 请求方式 请求地址
// 请求方式 GET POST ...
// 请求地址 http://xxx.xx/xx
xhr.open("GET",'http://xxx.xx/xx')
  1. 发送请求
xhr.send()
// post 参数传递 xhr.send(参数)
  1. 获取响应数据
xhr.onload = function(){  // 接收到响应触发
	console.log(xhr.responseText)
}

或者

// 每当 readyState 改变时,就会触发 onreadystatechange 事件。
xhr.onreadystatechange = function(){
// xhr.readyState 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接收 3: 请求处理中 4: 请求已完成,且响应已就绪
// xhr.status 响应状态码
	if(xhr.readyState = 4 && xhr.status = 200){		
	}
}

get请求是不能提交json对象格式数据的,传统网站的表单提交也是不支持json对象格式数据的

get请求示例
// 创建ajax对象
let xhr = new XMLHttpRequest()
// 设置请求方式 和 请求地址  参数age=18&name=xx   async 是否异步 默认true
xhr.open('GET','http://localhost:3000/first?&age=18&name=xx',true)
// 发送请求
xhr.send()
// 监听响应 获取响应数据
xhr.onload = function(){
    console.log('res',xhr.responseText)
}
post请求示例
// 创建ajax对象
let xhr = new XMLHttpRequest()
// 设置请求方式 和 请求地址  
xhr.open('POST','http://localhost:3000/first')
// 设置请求头
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
// 发送请求
xhr.send('age=18&name=xx') // 参数
// 监听响应 获取响应数据
xhr.onload = function(){
    console.log('res',xhr.responseText)
}
post请求参数格式

urlencoded格式参数

'age=18&name=xx'
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
xhr.send('age=18&name=xx') 

json格式参数

{name:'张三'}
xhr.setRequestHeader('Content-Type','application/json')
xhr.send(JSON.stringify({name:'张三'})) 

图片
文件

ajax状态码 onreadystatechange

表示ajax请求的过程,ajax对象返回的
在创建ajax对象,配置ajax对象,以及接收完服务端响应数据,这个过程中的每一个步骤都会对应一个数值,这个数值就是ajax状态码。
0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪

xhr.readyState // 获取状态码

监听 状态码 变化

xhr.onreadystatechange = function(){}

示例

let xhr = new XMLHttpRequest()
console.log(xhr.readyState,"已经创建了ajax对象 还未配置") // 0 已经创建了ajax对象 还未配置

xhr.open('POST','http://localhost:3000/first')
console.log(xhr.readyState," 已经配置 还未发送请求") // 1 已经配置 还未发送请求

xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded') 

xhr.onreadystatechange = function(){
   // 2 已经发送请求 
   // 3 已经接收到服务端部分响应数据
   // 4 数据接收完成 请求完成
   console.log(xhr.readyState) 
   
   if(xhr.readyState == 4){
       console.log(xhr.responseText)
   }
}
xhr.send('age=18&name=xx') // 参数
onload/onreadystatechange兼容性

在这里插入图片描述

Ajax错误处理

网络畅通,服务器能接收请求,服务端返回的结果不是预期结果。xhr.status

http状态码:表示请求的处理结果,服务器返回的
可以判断服务端返回的响应状态码,分别进行处理。xhr.status获取http状态码

xhr.status 
// 成功 200

http状态码文档

网络畅通,服务器没有接收请求, 服务端返回404

检查请求地址是否错误。

网络畅通,服务器能接收请求,服务端返回500

服务端错误

网络中断,请求无法发送到服务器

网络中断无法触发 onload 事件
会触发xhr对象的onerror事件,在onerror事件处理函数中对错误进行处理
在这里插入图片描述

xhr.onerror = function(){
	console.log('网络中断,无法发送')
}

低版本IE浏览器的缓存问题

问题:在低版本IE浏览器中,Ajax请求有严重的缓存问题,即在请求地址不发生变化的情况下,只有第一次请求会真正发送到服务器端。后续的请求都会从浏览器的缓存中获取结果,即使服务器的数据更新了,客户端依然拿到的是缓存中的旧数据。
解决:在请求地址后面加上参数,保证每一次请求参数的值不同。

xhr.open("GET","http://xxx.xx?t="+Math.random())
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AJAX (Asynchronous JavaScript and XML) 是一种在网页中进行异步数据交互的技术。当使用 AJAX 发送请求并接收到响应时,我们可以利用 `onload` 事件来处理返回的数据。 `onload` 是一个事件处理函数,它在 AJAX 请求成功完成并且返回数据时触发。我们可以通过指定一个函数来处理这个事件,以便在数据加载完成后执行相应的操作。 以下是一个简单的示例代码,展示了如何使用 `onload` 处理 AJAX 请求的返回数据: ```javascript // 创建 XMLHttpRequest 对象 var xhr = new XMLHttpRequest(); // 监听 onload 事件 xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 400) { // 请求成功 var response = xhr.responseText; // 获取返回的数据 // 执行相应的操作,比如更新页面内容 console.log(response); } else { // 请求失败 console.error('请求失败!'); } }; // 发送 AJAX 请求 xhr.open('GET', 'example.com/data', true); xhr.send(); ``` 在上面的示例中,我们创建了一个 `XMLHttpRequest` 对象并指定了 `onload` 事件处理函数。当 AJAX 请求成功返回时,`onload` 函数会被触发,我们可以在其中获取返回的数据并执行相应的操作。请注意,我们需要使用 `open` 方法指定请求的方法、URL 和是否异步发送请求,并使用 `send` 方法发送请求。 这只是一个简单的示例,实际使用中可能需要根据具体需求进行更多的处理和错误处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值