XMLHttpRequest分析

之前分析面试常被问的跨域问题,另一个面试难题就是ajax原理相关的问题了,今天我们就来solve它。

开篇先来介绍一个之前看过的一篇文章,讲的是如何回答面试中的原理题,我们也可以把以下的这种方法运用到学习前端知识上面。如果是英文词汇就先翻译成中文

一句话描述该技术的用途

描述该技术的核心概念或运作流程

口述该技术的代码书写思路

该技术的优点

该技术的缺点

如何弥补缺点

现在我们正式开始了解XMLHTTPRequest对象,顾名思义:是基于XML的HTTP请求。XMLHttpRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通信。自从浏览器提供有了XMLHTTPRequest这个接口之后,ajax操作就此诞生。

我们再来说说什么是AJAX,AJAX = Asynchronous JavaScript and XML,翻译为:异步的 JavaScript 和 XML。ajax就是基于浏览器提供的XMLHttpRequest对象来实现的。这下明白他们的关系了吧。

传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。自从有了ajax之后,我们就可以实现异步的加载网页。

什么叫异步?

异步,异嘛,不同的意思,这里也就是指不跟浏览器加载执行网页代码的步伐一致,也就是说在一个网页中需要用户操作来触发执行代码,而不是整个网页代码一次性执行完毕。(这里的用户操作是指在同一个网页下面请求代码执行渲染,而不是让浏览器直接跳转渲染另一个页面)

AJAX 工作原理:

这里面都提到了一个概念XML,那什么是XML呢?

XML 指可扩展标记语言(eXtensible Markup Language)。

我们在浏览器中使用XMLHTTPRequest对象在服务器之间通信,传输的数据是使用XML的方式,但最终还是会被转换成json数据格式来被我们使用。

我们再来看看XHR的使用流程:首先我们需要新建一个XMLHttpRequest实例

var xhr = new XMLHttpRequest();然后,向远程主机发出一个HTTP请求

xhr.open('GET', 'example.php');

xhr.send();接着,就等待远程主机做出回应。这时需要监控XMLHttpRequest对象的状态变化,指定回调函数

xhr.onreadystatechange = function(){

if ( xhr.readyState == 4 && xhr.status == 200 ) {

alert( xhr.responseText );

} else {

alert( xhr.statusText );

}

};上面的代码包含了老版本XMLHttpRequest对象的主要属性:

* xhr.readyState:XMLHttpRequest对象的状态,等于4表示数据已经接收完毕。

* xhr.status:服务器返回的状态码,等于200表示一切正常。

* xhr.responseText:服务器返回的文本数据

* xhr.responseXML:服务器返回的XML格式的数据

* xhr.statusText:服务器返回的状态文本。

老版本的XMLHttpRequest对象有以下几个缺点:* 只支持文本数据的传送,无法用来读取和上传二进制文件。

* 传送和接收数据时,没有进度信息,只能提示有没有完成。

* 受到"同域限制"(Same Origin Policy),只能向同一域名的服务器请求数据。

以上都是2010年以前使用的出来的过时的XMLHttpRequest对象了,现在我们都基本上使用的是HTML5中的新版本XMLHttpRequest对象。

新版本的功能:

新版本的XMLHttpRequest对象,针对老版本的缺点,做出了大幅改进。* 可以设置HTTP请求的时限。

* 可以使用FormData对象管理表单数据。

* 可以上传文件。

* 可以请求不同域名下的数据(跨域请求),CORS。

* 可以获取服务器端的二进制数据。

* 可以获得数据传输的进度信息。

1】HTTP请求的时限

xhr.timeout = 3000;

xhr.ontimeout = function(event){

alert('请求超时!');

}

上面的语句,将最长等待时间设为3000毫秒。过了这个时限,就自动停止HTTP请求。与之配套的还有一个timeout事件,用来指定回调函数。

2】FormData对象

ajax操作往往用来传递表单数据。为了方便表单处理,HTML 5新增了一个FormData对象,可以模拟表单。

//首先,新建一个FormData对象。var formData = new FormData();

//然后,为它添加表单项。formData.append('username', '张三');

formData.append('id', 123456);

//最后,直接传送这个FormData对象。这与提交网页表单的效果,完全一样。xhr.send(formData);

FormData对象也可以用来获取网页表单的值:

var form = document.getElementById('myform');

var formData = new FormData(form);

formData.append('secret', '123456'); // 添加一个表单项xhr.open('POST', form.action);

xhr.send(formData);

3】上传文件

新版XMLHttpRequest对象,不仅可以发送文本信息,还可以上传文件。

假定files是一个"选择文件"的表单元素(input[type="file"]),我们将它装入FormData对象。

var formData = new FormData();

for (var i = 0; i < files.length;i++) {

formData.append('files[]', files[i]);

}

xhr.send(formData);

4】跨域资源共享(CORS)

新版本的XMLHttpRequest对象,可以向不同域名的服务器发出HTTP请求。这叫做"跨域资源共享"(Cross-origin resource sharing,简称CORS)。

使用"跨域资源共享"的前提,是浏览器必须支持这个功能,而且服务器端必须同意这种"跨域"。如果能够满足上面的条件,则代码的写法与不跨域的请求完全一样。

跨域之前我们都讲过了,这里就不多提了,其他的新XMLHttpRequest对象的功能,个人觉得日常开发中可能遇到很少,就不去总结了。

浏览器中xhr选项是做什么用的呢_XHR和AJAX终于搞懂了!!相关推荐

  1. cad中tk什么意思_原来CAD里的这些缩写是这个意思!终于搞懂了对象捕捉这个玩意儿...

    对象捕捉是我们在使用CAD绘图的时候经常要用到的一个操作,对象捕捉的方法有很多,在一些CAD的编辑器里也有很多设置的方式,今天小编就来讲解一下关于CAD的对象捕捉设置和一些常用捕捉选项的缩写及作用!正 ...

  2. 终于搞懂Word中如何插入特殊符号了!带圈序号、勾叉不在话下!

    我们在写word文档时,经常会被一些特殊符号所难倒,例如带圈的序号.方框中的勾叉.人名币符号等等.这些符号经常被我们用到,而且也很重要.如果你还不知道的话,那就赶紧学起来吧! 1. 带框.不带框勾叉 ...

  3. H5+在浏览器中打开相机扫描二维码

    刚开始提出要在手机浏览器中的HTML页面做扫描是有点懵的,一顿百度后搜到两种方法: 方案一,浏览器中打开相机navigator.mediaDevices.getUserMedia 自带浏览器不支持该属 ...

  4. JS动态修改单网页web应用在微信浏览器中的title

    利用JS动态修改单网页web应用在微信浏览器中的title 最近做一个微信端项目,主要内容都是采用单页面web,之前做微信端,以营销H5居多,绝大多数也都是单网页,营销H5一般一个标题通吃,修改分享标 ...

  5. 浏览器中的js不能同步更新的解决方案

    解决方案有三种,分别是: 1.清浏览器缓存 2.清服务器缓存 3.更改项目中对应的js文件名(大招) 在项目的整合过程出现了浏览器中的js和项目里面的js不是同步的.起初,由于需求变动,需要前端多传三 ...

  6. java 自旋锁_搞懂Java中的自旋锁

    轻松搞懂Java中的自旋锁 前言 在之前的文章<一文彻底搞懂面试中常问的各种"锁">中介绍了Java中的各种"锁",可能对于不是很了解这些概念的同学 ...

  7. 淘宝特价版拉新赚钱的页面怎么做?我终于弄懂了

    淘宝的同胞兄弟特价版,虽然长的朴实无华以至于经常被人问起淘宝特价版靠谱吗?2021年淘宝特价版可谓大火了一把,阿里巴巴不计成本的大力推广淘宝特价版,目的也非常明确要把拼多多占领的市场掠夺回来.最近还传 ...

  8. 一次搞懂 CSS3 animation动画中forwards和both的区别

    平时会用 animation 实现动画效果,之前一直没有留意 animation-fill-mode 中 forwards 和 both 动画的区别,今天自己动手实现了一下,终于搞懂了. animat ...

  9. Deskreen – 将电脑屏幕共享到浏览器中,做第二块屏幕[Win/macOS/Linux]

    介绍: Deskreen 是一款非常实用的开源项目,它可以将你的电脑屏幕共享到浏览器中,做第二块屏幕.支持 Windows.macOS.Linux,可分享整块屏幕,或只分享某一个应用界面,支持多个浏览 ...

最新文章

  1. centos7添加运行终端快键键
  2. SQLite 数据类型(http://www.w3cschool.cc/sqlite/sqlite-data-types.html)
  3. idea没有git选项
  4. 程序员,这600单词你知道吗?
  5. c# mysql 连接类_c#中连接数据库的类怎么写呀?
  6. 大端模式和小端模式的再理解
  7. day09面向对象+
  8. python包裹和运费_使用shopifyapipython,添加新产品并注明价格和“需要运费”:Fals...
  9. Visual Graph图形控件的高级应用
  10. Java国密算法加密
  11. 爬取CSDN博客文章,统计文章历史数据
  12. JSP实战项目教程|基于JSP的学生请假系统开发视频教程
  13. datax底层原理_Datax 任务分配原理
  14. ONOS架构中的YANG、P4 Runtime
  15. 解决阿里云域名解析失败的问题 - 总结篇
  16. “Ubuntu 18.04.2 LTS _Bionic Beaver_ - Release amd64 (20190210)” 的盘片插入驱动器“/cdrom/”再按「回车」键
  17. 【archlinux】安装系统
  18. 以太坊君士坦丁堡:是利好?-千氪
  19. Android/iOS视频编辑SDK开发记
  20. 【大咖有约】1号店周航:1号店搜索实时更新架构实践

热门文章

  1. android 起动APP时锁住(Lock apps)
  2. python实现websocket服务端
  3. Linux程序编译速度提高方法
  4. IIS不支持apk文件下载问题
  5. java判断回文数代码实例
  6. linux管理用户和文件权限
  7. mongodb 导出 带条件_将 MongoDB 导出成 csv
  8. c# mysql 管理员权限_C# winform 权限管理系统完整源码下载(含数据库)
  9. python中csv文件通过什么表示字符_python – 如果行包含CSV文件中的字符串,则删除该行...
  10. 【转载】SAP表修改概览