现在最流行的获取后端的(浏览器从服务器)数据的方式就是通过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. .net 导出Excel

    CreateExcel(ExcelDs, ", f); void CreateExcel(DataSet ds, string typeid, string FileName) { Http ...

  2. 编译时:virtual memory exhausted: Cannot allocate memory,常见于VPS

    原文链接:http://blog.csdn.net/taiyang1987912/article/details/41695895 一.问题 当安装虚拟机时系统时没有设置swap大小或设置内存太小,编 ...

  3. bzoj1242(弦图判定)

    cdqppt地址:https://wenku.baidu.com/view/a2bf4ad9ad51f01dc281f1df.html: 代码实现参考的http://blog.csdn.net/u01 ...

  4. java基础知识-数据类型及转换

    1.java中的常量大体分为两种: <1>字面量常量 <2>自定义常量 2.java中常量(字面量)的分类:<1>,整数常量:直接出现的整数<2>,小数 ...

  5. Elasticsearch 系列2 --- 安装elasticsearch-head管理工具

    elasticsearch-head是elasticsearch的一个管理页面,它的官网是https://github.com/mobz/elasticsearch-head 通过官网我们得知,ES5 ...

  6. Kali Linux渗透测试实战 1.3 渗透测试的一般化流程

    1.3 渗透测试的一般化流程 凡事预则立,不预则废,做任何事情都要有一个预先的计划.渗透测试作为测试学科的一个分支,早已形成了完整的方法论.在正式开始本书的实践教学章节之前,我也想谈一谈使用Kali ...

  7. Windows核心编程:第2章 字符和字符串处理

    Github https://github.com/gongluck/Windows-Core-Program.git //第2章 字符和字符串处理.cpp: 定义应用程序的入口点. // #incl ...

  8. C#调用接口注意要点

    在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存cookie值,再进行其他接 ...

  9. 定时任务 Wpf.Quartz.Demo.1

    Quartz 是个开源的作业调度框架. 安装:Install-Package Quartz 官网文档地址:https://www.quartz-scheduler.net/documentation/ ...

  10. Resolving SharePoint Application Authentication Error: Login Failed

    Check event viewer log Click Start, click Run, type eventvwr, and then click OK. Click on Security u ...