1.大家眼中的Ajax

说到Ajax,只要有过前端开发经验的童鞋一定都不陌生,大都知道它就是一种与后端之间的通信技术,通过这个神奇的家伙,我们不用像传统表单那样填完信息一点提交就呼啦呼啦跳转了。Ajax最大的一个优势就是通过异步请求达到局部刷新的目的,这样就大大提高了用户体验。可是Ajax就是我们平时使用得最多的jQuery中的$.ajax()吗?答案肯定不是的,那我们就来一起看看原生的Ajax究竟长啥样把!

2.获取XMLHttpRequest

  • 2.1 为什么要获取XMLHttpRequest对象

Ajax技术的核心是XMLHttpRequest对象(简称XHR)

  • 2.2 如何获取XMLHttpRequest对象
    • 由于IE5是第一款引入XHR对象的浏览器,所以在IE7之前其实都不是叫XMLHttpRequest,具体要兼容IE7之前浏览器的话可以查阅一下《高级程序设计》本文重点是讨论如何实现Ajax请求,所以,默认在内置了XHR的IE7+和其他现代浏览器下,所以:
    function getXhr(){
    if (typeof XMLHttpRequest != 'undefined') {
    return new XMLHttpRequest();
    }
    }
    • 这样就得到了一个XHR的实例对象

3.大体的流程

  • 3.1 初始化请求
    • 使用XHR对象时,使用的第一个方法就是open(),这个方法不会发送请求,但会初始化一个请求准备发送,第三个参数默认是true,也就是异步的
    xhr.open('get', 'example.php', false);
  • 3.2 发送请求
    • GET请求:发送的值为空,一般写上null,适配有些浏览器
    xhr.open('GET', url);
    xhr.send(null);
    • POST请求,要模拟表单提交请求的话就将Content-type头部信息设置为application/x-www-form-urlencoded,并且发送的是一个经过序列化之后的字符串
    xhr.open('POST', url);
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr.send(stringData);
  • 3.3 监控请求状态,处理请求数据
    • xhr对象有且仅有一个事件onreadystatechange,注意所有字母都是小写的,javascript和Java一样都是区分大小写的。
    • 每一次xhr对象的readyState状态值改变都会触发该事件,但是该方法不能为单独的一个xhr对象绑定多个事件处理逻辑,即onreadystatechange只能绑定一个事件处理的function,如果你想处理多件事情,那么只能在绑定的function中进行多事件处理的逻辑调用。
    xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
    if(xhr.status == 200){
    document.getElementById("unInfo").innerHTML = xhr.responseText;
    }
    }
    }

4.重要属性

  • 4.1 readyState属性,这个属性可能的取值如下:
    • 0:未初始化,尚未调用open()方法
    • 1:启动。已经调用open()方法,但尚未调用send()方法
    • 2:发送:已经调用send()方法,但尚未收到响应
    • 3:接收。已经接收到部分响应数据。
    • 4:完成。已经接收到全部响应数据,而且已经可以在客户端使用了。
  • 4.2 响应的数据会自动填充XHR对象的属性,包含以下属性
    • responseText:作为响应主题被放回的文本
    • responseXML:如果响应的内容类型是"text/xml"或"application/xml",这个属性中将保存包含着响应数据的XMLDOM文档
    • status:响应的HTTP状态
    • statusText:HTTP状态的说明

5.一次完整的XHR请求

  • GET
function getXhr(){
if (typeof XMLHttpRequest != 'undefined') {
return new XMLHttpRequest();
}
}
var xhr = getXhr();
//GET请求
xhr.open('GET', '/user/checkLogin');
xhr.send(null);
xhr.onreadystatechange = function(res) {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
console.log(JSON.parse(xhr.responseText))
}
}
}
  • POST
  function getXhr(){
if (typeof XMLHttpRequest != 'undefined') {
return new XMLHttpRequest();
}
}
var xhr = getXhr();
var stringData = {
uname: '123',
password: '123',
code: ''
}
stringData = JSON.stringify(stringData);
//POST请求
xhr.open('POST', '/user/login');
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(stringData)
xhr.onreadystatechange = function(res) {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
console.log(JSON.parse(xhr.responseText))
}
}
}

参考文章:

使用XMLHttpRequest对象完成原生的AJAX请求的更多相关文章

  1. 原生js ajax请求

    什么是ajax AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新. 这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新, ...

  2. H5 FormData对象的使用——进行Ajax请求并上传文件

    XMLHttpRequest Level2 添加了一个新的接口——FormData .[ 主要用于发送表单数据,但也可以独立使用于传输键控数据.与普通的Ajax相比,它能异步上传二进制文件 ] 利用F ...

  3. PHP. 02®. Ajax异步处理、常见的响应状态、XMLHttpRequest对象及API、ajax的get/post方法、

    异步对象 a)创建异步对象 b)设置请求的url等参数 c)  发送请求 d)注册时间 e)在注册的事件中获取返回的内容并修改页面显示的内容 布尔类型不能直接用echo输出 常见的响应状态 Ajax概 ...

  4. 原生的ajax请求

    原生ajax请求的步骤: get 请求: 1,创建一个xhr变量 var xhr=new XMhttpRequest(); 2,设置请求方式和请求地址 xhr.open('url','http//19 ...

  5. 原生的ajax请求----(播放托管到爱奇艺上的视频)

    播放视频 $(function(){ //视频播放 $('.play-icon').click(function () { $.ajax({ type:"get", url: &q ...

  6. 原生JS Ajax 请求

    var username = document.getElementById('username').value; var password = document.getElementById('pa ...

  7. 【转】分享JavaScript监听全部Ajax请求事件的方法

    若Ajax请求是由jQuery的$.ajax发起的,默认情况下可以使用 jQuery的Global Ajax Event Handlers监听到Ajax事件,然而我遇到的却是用原生JavaScript ...

  8. XMLHttpRequest对象解读

    <!DOCTYPE html> <html> <body> <script> function reqListener () { console.log ...

  9. js ajax 请求

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 搜狗员工用百度算什么,谷歌员工当着老板的面用bing,结果悲剧了!

    之前看到一篇文章,写的是搜狗的员工遇到问题时,用百度,结果网友的评论真是亮瞎眼.今天,W3Cschool小师妹将为大家分享一个类似的故事,那就是谷歌员工当着老板的面,竟然用BING. 这位谷歌员工称, ...

  2. maven tomcat7-maven-plugin配置及背景

    背景: 在研发阶段,想让一个服务通过tomcat启动起来有很多的方法,常用的idea都有这样的支持,那么如果我们没有tomcat,能不能让服务通过tomcat启动起来呢?maven就提供了这样的支持. ...

  3. 2017 Multi-University Training Contest - Team 4 hdu6070 Dirt Ratio

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6070 题面: Dirt Ratio Time Limit: 18000/9000 MS (Ja ...

  4. DOM—节点

    节点的相关属性 1.nodeType:节点类型.返回的是一个数字,这个数字代表节点类型,只读. 节点类型: 1 — 元素类型:元素节点(标签) 节点类型: 2 — 元素类型:属性节点 节点类型: 3 ...

  5. SqlHelper简单实现(通过Expression和反射)9.Sql表述对象SqlSession

    此类是整个SqlHelper的另一个核心,基本思想就是通过EntityHelper,ObjectHelper和ExpressionHelper获取拼接Select语句的全部元素,拼接出完整Select ...

  6. javascript对象继承

    一.实例化和继承的区别 构造函数.原型和实例的关系:每 个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型 对象的内部指针. 类(Class)和实例(Insta ...

  7. VSYNC与HSYNC与PCLK与什么有关系

    在手机平台,LCD,Camera,TV的接线上,都会用到PCLK,VSYNC和HSYNC这三个信号.可见这三个信号和显示关系非常大.首先我们先看这三个信号的作用: PCLK:有些方案给他起名字叫:Do ...

  8. 20145312 《Java程序设计》第六周学习总结

    20145312 <Java程序设计>第六周学习总结 学习笔记 Chapter10 输入 /输出 10.1InputStream 与 OutputStream 10.1.1 串流设计的概念 ...

  9. 20145328 《Java程序设计》第7周学习总结

    20145328 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 Lambda 12.1 认识Lambda语法 Lambda 教材的引入循序渐近.深入浅出 Lambda去重 ...

  10. zip unzip tar 压缩解压

    yum install -y unzip zip    yum安装zip -r mydata.zip mydata    mydata目录压缩为mydata.zipunzip mydata.zip - ...