现在最流行的获取后端的(浏览器从服务器)数据的方式就是通过Ajax了吧。今天就来详细的来学习下这个知识吧。如果使用ajax来访问后段的数据,浏览器和浏览器端的js做了那些工作呢?我做了一个图,请大家看一下:

1.原生js的Ajax请求的方式

由上面的图我们大致的知道了ajax访问后端数据的一个过程。最重要的就是检测浏览器,创建XMLHttpRequest对象的过程:

代码如下:

/*
判断是否支持XMLHttpRequest
*/
function createXHR() {
if (typeof XMLHttpRequest != "undefined") {
return new XMLHttpRequest();
}
else if (typeof ActiveXobject != "undefined") {
if (typeof arguments.callee.activeXString != 'string') {
var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"], i, len;
for (i = 0, len = versions.length; i < len; i++) {
try {
new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
break;
}
catch (ex) {
console.log(ex);
}
}
}
return new ActiveXObject(arguments.callee.activeXString());
}
else {
throw new Error('no XHR')
}
}

此处分别是根据浏览器是否支持XMLHttpRequest对象来判断是否是IE还是非IE,然后来创建响应的对象。

当XHR对象open()的时候,此时并没有向Web服务器发送HTTP请求,而是当send()的时候,XHR对象才向Web服务器发送请求。

xhr.send('');

这里有一个非常重要的地方,就是send的参数为null

send()方法接收一个参数,需要作为请求主体发送的数据。如果不需要作为请求主体发送数据,则必须传入null,因为这个参数对于某些浏览器是必须的。

当浏览器接收到Web服务器的响应后,会开始填充XHR对象的属性,主要的如下:

  • responseText作为响应的主体被返回的文本
  • responseXML如果响应的内容类型为text/xml或者application/xml这个属性中将包含着响应数据的XML DOM文档
  • status响应的HTTP状态
  • statusTextHTTP状态的说明

    一般通过XHR.status属性值为200表示成功的标志。此时可以获取responseTextresponseXML的值。当XHR.status==304响应是有效的)的时候,说明文件没有被修改,可以直接使用浏览器缓存的版本。

检测的代码如下:

if (xhr.status >= 200 && xhr.status <= 300 || xhr.status == 304) {
console.log(xhr.responseText);
}
else {
console.log(xhr.responseText);
}

不要依赖responseText,因为在跨浏览器处理的时候这个属性获取的值是不可靠的。

上面的代码在同步发送请求验证和获取返会的数据是没有任何问题的。但是当我们发送异步请求的时候确实会出现问题,因为我们不知道服务端的Response在什么时候反回。那么我们该怎么办呢?

其实在ajax在向Web服务器发送请求的时候,会有一个readyState属性来检测XHR对象的请求/响应过程的当前活动阶段,值的列表如下:

  • 0未初始化。尚未调用open()方法
  • 1启动。已经调用open()方法,但是尚未调用send()方法
  • 2发送。已经调用send()方法。但是还没有接收到响应。
  • 3接收。已经接收到部分的响应数据。
  • 4完成。已经接收到全部的响应数据,而且已经在客户端可以使用了。

    每当XHR.readyState的属性值发生变化,都会触发一次onreadystatechange事件。通常我们只对XHR.readyState==4的时候感兴趣(这时数据已经全部就绪)。

必须在调用open()之前指定onreadystatechange事件处理程序才能够保证夸浏览器的兼容性。

实例代码如下:

var xhr = new createXHR();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status >= 200 && xhr.status <= 300 || xhr.status == 304) {
console.log(xhr.responseText);
//console.log(xhr.)
//document.createElement()
creatNode('script');
creatNode('img');
}
else {
console.log(xhr.responseText);
}
}
}
xhr.open('GET', 'test.js', true);
xhr.send('');

2.jQuery发送Ajax的方式

参考jquery的文档,使用jquery来发送ajax请求比原生的js简单很多。如下代码:

2.1GET方式

$.ajax({
type: "GET",
url: "test.js",
dataType: "script"
});

2.2POST方式

$.ajax({
type: "POST",
url: "some.php",
data: "name=John&location=Boston",
success: function(msg){
alert( "Data Saved: " + msg );
}
});

这里也只是简单的实例,如果想要详细的了解jQuery中ajax的使用。可以参考Jquery的官方文档。

中文文档(点击转到

英文文档(点击转到

版权声明:本文为博主原创文章,未经博主允许不得转载。

【从0到1学Web前端】javascript中的ajax对象(一) 分类: JavaScript 2015-06-24 10:18 754人阅读 评论(1) 收藏的更多相关文章

  1. 【从0到1学Web前端】CSS定位问题三(相对定位,绝对定位) 分类: HTML+CSS 2015-05-29 23:01 842人阅读 评论(0) 收藏

    引子: 开始的时候我想先要解决一个问题,怎么设置一个div盒子撑满整个屏幕? 看下面的html代码: <body> <div id="father-body"&g ...

  2. C#中的线程(上)-入门 分类: C# 线程 2015-03-09 10:56 53人阅读 评论(0) 收藏

    1.     概述与概念 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为"主线 ...

  3. Poj 1029 分类: Translation Mode 2014-04-04 10:18 112人阅读 评论(0) 收藏

    False coin Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16418   Accepted: 4583 Descr ...

  4. C#多线程(上) 分类: C# 线程 2015-03-09 10:35 174人阅读 评论(0) 收藏

    一.多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行 ...

  5. iOS开发:创建真机调试证书 分类: ios相关 2015-04-10 10:22 149人阅读 评论(0) 收藏

    关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架发布问题.今天就着重说一下关于针对于苹果 ...

  6. 【从0到1学Web前端】CSS定位问题二(float和display的使用) 分类: HTML+CSS 2015-05-28 22:03 812人阅读 评论(1) 收藏

    display 属性规定元素应该生成的框的类型. 这个属性用于定义建立布局时元素生成的显示框类型.对于 HTML 等文档类型,如果使用 display 不谨慎会很危险,因为可能违反 HTML 中已经定 ...

  7. 网站通用登录模块代码 分类: ASP.NET 2014-12-06 10:49 615人阅读 评论(0) 收藏

    1.HTML部分:     <form id="form1" runat="server">     <script src=".. ...

  8. 说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 分类: JavaScript 2014-09-23 10:41 218人阅读 评论(1) 收藏

    前言: 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Sock ...

  9. 使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象 分类: JSON 前端 2014-11-10 10:20 97人阅读 评论(1) 收藏

    一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大 ...

随机推荐

  1. C++二级指针第一种内存模型(指针数组)

    二级指针第一种内存模型(指针数组) 指针的输入特性:在主调函数里面分配内存,在被调用函数里面使用指针的输出特性:在被调用函数里面分配内存,主要是把运算结果甩出来 指针数组 在C语言和C++语言中,数组 ...

  2. (概率 01背包) Just another Robbery -- LightOJ -- 1079

    http://lightoj.com/volume_showproblem.php?problem=1079 Just another Robbery As Harry Potter series i ...

  3. ES版本控制

    版本控制 ElasticSearch采用了乐观锁来保证数据的一致性,也就是说,当用户对document进行操作时,并不需要对该doucument作加锁和解锁的操作,只需要指定要操作的版本即可.当版本号 ...

  4. AngularJS config run 及区别和例子

    一.config方法 在模块加载阶段,对模块进行自定义配置 config可以注入$stateProvider, $urlRouterProvider, $controllerProvider, $pr ...

  5. asp.net core 使用identityServer4的密码模式来进行身份认证(2) 认证授权原理

    前言:本文将会结合asp.net core 认证源码来分析起认证的原理与流程.asp.net core版本2.2 对于大部分使用asp.net core开发的人来说. 下面这几行代码应该很熟悉了. s ...

  6. 在WPF中将图片转换成3D图像并可以旋转

    时光偷走的,永远都是我们眼皮底下看不见的珍贵. https://pan.baidu.com/s/14dk-OU2SR0nxXj2bL4bVpQ 源码网站https://www.codeproject. ...

  7. 【BZOJ2328】 [HNOI2011]赛车游戏

    BZOJ2328 [HNOI2011]赛车游戏 前言 这道题目我真的佛了,卡精度+卡时间这就是下一个聊天鬼才. Solution 首先可以二分出最大速度,然后考虑下坡的话可能有更好的解,然后这样子算一 ...

  8. 简单线性回归问题的优化(SGD)R语言

    本编博客继续分享简单的机器学习的R语言实现. 今天是关于简单的线性回归方程问题的优化问题 常用方法,我们会考虑随机梯度递降,好处是,我们不需要遍历数据集中的所有元素,这样可以大幅度的减少运算量. 具体 ...

  9. GoLang学习之Golang数组

    Go语言数组 数组是Go语言编程中最常用的数据结构之一.顾名思义,数组就是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素( element),一个数组包含的元素个数被称为数组的长度.需 ...

  10. [Vue] vue-cli3.0安装

    1. node.js安装https://nodejs.org/en/download/ 2.npm的安装 由于新版的nodejs已经集成了npm,所以之前npm也一并安装好了.同样可以通过输入 &qu ...