【从0到1学Web前端】javascript中的ajax对象(一) 分类: JavaScript 2015-06-24 10:18 754人阅读 评论(1) 收藏
现在最流行的获取后端的(浏览器从服务器)数据的方式就是通过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这个属性中将包含着响应数据的XMLDOM文档status响应的HTTP状态statusTextHTTP状态的说明一般通过
XHR.status属性值为200表示成功的标志。此时可以获取responseText和responseXML的值。当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) 收藏的更多相关文章
- 【从0到1学Web前端】CSS定位问题三(相对定位,绝对定位) 分类: HTML+CSS 2015-05-29 23:01 842人阅读 评论(0) 收藏
引子: 开始的时候我想先要解决一个问题,怎么设置一个div盒子撑满整个屏幕? 看下面的html代码: <body> <div id="father-body"&g ...
- C#中的线程(上)-入门 分类: C# 线程 2015-03-09 10:56 53人阅读 评论(0) 收藏
1. 概述与概念 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为"主线 ...
- 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 ...
- C#多线程(上) 分类: C# 线程 2015-03-09 10:35 174人阅读 评论(0) 收藏
一.多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行 ...
- iOS开发:创建真机调试证书 分类: ios相关 2015-04-10 10:22 149人阅读 评论(0) 收藏
关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架发布问题.今天就着重说一下关于针对于苹果 ...
- 【从0到1学Web前端】CSS定位问题二(float和display的使用) 分类: HTML+CSS 2015-05-28 22:03 812人阅读 评论(1) 收藏
display 属性规定元素应该生成的框的类型. 这个属性用于定义建立布局时元素生成的显示框类型.对于 HTML 等文档类型,如果使用 display 不谨慎会很危险,因为可能违反 HTML 中已经定 ...
- 网站通用登录模块代码 分类: ASP.NET 2014-12-06 10:49 615人阅读 评论(0) 收藏
1.HTML部分: <form id="form1" runat="server"> <script src=".. ...
- 说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 分类: JavaScript 2014-09-23 10:41 218人阅读 评论(1) 收藏
前言: 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Sock ...
- 使用DataContractJsonSerializer类将类型实例序列化为JSON字符串和反序列化为实例对象 分类: JSON 前端 2014-11-10 10:20 97人阅读 评论(1) 收藏
一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大 ...
随机推荐
- CodeForces 235E Number Challenge (莫比乌斯反演)
题意:求,其中d(x) 表示 x 的约数个数. 析:其实是一个公式题,要知道一个结论 知道这个结论就好办了. 然后就可以解决这个问题了,优化就是记忆化gcd. 代码如下: #pragma commen ...
- Struts2之ModelDriven和Preparable拦截器
首先struts.xml文件配置如下 默认拦截器设置为paramsPrepareParamsStack <package name="default" namespace=& ...
- 【应用】for:批量修改文件名
## @echo off setlocal EnableDelayedExpansion rem set string=suffix for %%i in (*.txt) do ( set name= ...
- mysql问题处理记录
1.使用 navicate 导出 csv 文件用 excel 打开乱码 由于excel默认编码是gbk,而navicate导出数据默认编码是utf-8,因此... 解决办法: 使用WPS打开文件,然后 ...
- 【python】鼠标操作
[python]鼠标操作 推荐地址:http://www.cnblogs.com/fnng/p/3288444.html --------------------------------------- ...
- noip第18课作业
1. 银行取款 [题目描述] 在现代文明社会中,大家在诸如银行办理业务.车站买票等活动时都很文明没有插队的现象,本着“先来先服务”的规矩. 新年马上到了,明明的爸爸打算上银行去取点钱,带着一向表现很好 ...
- Android 批量打包利器
因为添加了渠道号,对应不同的渠道包,此时,动不动就几十个包,实在让人头疼,此时,需要引入自动打包功能. 首先,列举出援引的博客内容 美团Android自动化之旅—生成渠道包 http://tech.m ...
- POJ3046选蚂蚁创建集合_线性DP
POJ3046选蚂蚁创建集合 一个人的精力是有限的呢,如果一直做一件事迟早会疲惫,所以自己要把握好,不要一直埋头于一件事,否则效率低下还浪费时间 题目大意:一共有T(1,2...n为其种类)种蚂蚁,A ...
- [javascript-code-snippet]javascript代码段
<ul> <li>Picture 1</li> <li>Picture 2</li> <li>Picture 3</li& ...
- poj1321 DFS
棋盘问题 Time Limit: 1000 MS Memory Limit: 10000 KB 64-bit integer IO format: %I64d , %I64u Java class n ...