ajax-原理分析
createTime--2016年9月19日13:59:11
Author:Marydon
参考链接
http://blog.csdn.net/csh624366188/article/details/7670500
Ajax(Asynchronous JavaScript and XML),异步的JavaScript与XML 。所谓同步,就是在进行一个操作之前必须要等到上一个操作返回操作结果才能进行这个操作,而异步则是在进行一个操作时可以不受上一个操作的影响,上一个操作是否返回操作都可以执行这个操作,各个操作可以同时进行,对用户来说,不用等待了,不用等待上一个操作就可以执行新的操作了。给用户的体验增强了。异步传输是面向字符的传输,它的单位是字符;而同步传输是面向比特的传输,它的单位是桢,它传输的时候要求接受方和发送方的时钟是保持一致的。 其实ajax并不是什么新技术,而是一些技术的组装。Ajax给我们的网络带来了很大的好处,假如我们只是简单的提交一个表单,我们就没必要刷新整个页面,只需要局部表单提交,刷新局部就可以了,这将大大减少了网络流量。有优点的同时他也有缺点,缺点就是我们浏览器上的后退和前进按钮就失效了。假如我们页面有三个异步ajax操作,浏览器并不把他当作三个请求操作,后退的时候也不会后退三次回到原始页面
Ajax的工作原理相当于在用户和服务器之间加了—个中间层,使用户操作与服务器响应异步化。并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给Ajax引擎自己来做, 只有确定需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。
Ajax中最重要的一个对象就是XMLHttpRequest,这个对象最早是由微软在IE中以插件的形式提供的,但微软只是简单的提出这么一个对象,并没有真正的去实用它,后来其他浏览器也给出了这个对象,但他们都是提供的内置对象,而不是简单的插件的形式了。所以在获得这个对象的时候就避免不了要用if。。Else判断了、判断是否为IE浏览器,我们使用判断一个对象是否存在来判断,这个对象是IE所特有的,他就是active控件的对象。通过window.ActiveXObject,在if语句中写这么语句,因为在javascript中,如果不是undefined或者false他就是为true,所以,只要这个active空间存在,if条件就为真。也就是说就是IE浏览器。IE获得XMLHttpRequest对象是一个固定形式:xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");这是IE特有的获得XMLHttpRequest对象的方式,其他浏览要想获得XMLHttpRequest对象直接new就可以,也就是xmlHttpRequest =new XMLHttpRequest();虽然IE和其他浏览器获得XMLHttpRequest对象的方式是不同的,但是XMLHttpRequest的使用方式是一样的。
好了,判断完浏览器之后,我们就开始准备向服务器发送请求了,准备发送请求我们用:xmlHttpRequest.open("POST", "AjaxServlet", true);这里的三个参数我们有必要说一下,第一个参数是表示我们的请求是以什么形式发送,第二个参数是我们请求的地址,这里我们的地址是一个servlet,第三个参数指明是否为以异步的形式发送请求,一般我们都会设置为true。
准备好发送以后,我们要给他接收做一下准,ajax接收数据是以一个回调函数的形式接收数据的。也就是说我们注册好这个回调函数后,当达到某一要求时他会自动调用这个回调函数,然后去执行回调函数的内容,注册回调函数:xmlHttpRequest.onreadystatechange = ajaxCallback;注意这个回调函数ajaxCallback不要带括号。这个回调函数注册点我们从字面上也可以看出,他是在准备状态改变的时候调用这个函数。
一切准备好之后我们就要进行真正的发送请求了,发送请求是调用的xmlHttpRequest对象的send方法,这个方法里面当以post的形式发送请求,这里的方法的参数,就是我们请求的地址的参数,这个地址的参数是以键值对的形式传参的,如果是以get的形式请求时,我们可以把send方法的参数设置为null。,假如我们是以get的请求方式,发送代码即为了:xmlHttpRequest.send(null);,我们在来说说以post的请求方式请求时。xmlHttpRequest.send(null),null可以传参数(即send(“v1="+v1));并且在真正发送之前(xmlHttpRequest.send(null))之前必须设置xmlHttpRequest.setRequestHeader("content-type","application/x-www-form-urlencoded");这一点一定要注意。
OK,请求发送出去了之后,我们下面来看一下我们怎么来接受请求返回的数据。根据HTTP协议我们应该知道,我们的一个请求应该分为四个步骤,也就是说一个请求有四个状态,他的状态即为xmlHttpRequest对象的readstate属性。我们来看一下这五个状态的具体内容:
从上边可以看出我们上边注册的回调函数将会被执行四次,但是我们其实就只在请求完成时执行我们回调函数的内容就OK,所以在回调函数里面我们可以进行一下判断
if (xmlHttpRequest.readyState == 4) { //请求完成}。
虽然我们判断了请求是否完成,但我们不知道这个请求是否成功,在我们http协议中,请求成功的状态码是200,所以我们如下判断一下状态码是否为200就可以了。
if (xmlHttpRequest.status == 200) {}
演示
见web项目demo-ajax
ajax-原理分析的更多相关文章
- OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法
OAuth有什么用?为什么要使用OAuth? twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,这种网站就是这个效果 ...
- Servlet过滤器介绍之原理分析
zhangjunhd 的BLOG 写留言去学院学习发消息 加友情链接进家园 加好友 博客统计信息 51CTO博客之星 用户名:zhangjunhd 文章数:110 评论数:858 访问量:19 ...
- Ajax原理,技术封装与完整示例代码
在做项目和学习的时候,经常用到Ajax的相关技术,但是这方面的技术总是运用的不是十分好,就寻找相关博客来学习加深Ajax技术相关. 一.Ajax简介 二.同步.异步传输区别 2.1 异步传输 2.2 ...
- Handler系列之原理分析
上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...
- Java NIO使用及原理分析(1-4)(转)
转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...
- 原子类java.util.concurrent.atomic.*原理分析
原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...
- Android中Input型输入设备驱动原理分析(一)
转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...
- 转载:AbstractQueuedSynchronizer的介绍和原理分析
简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础.使用的方法是继承,子类通过 ...
- Camel运行原理分析
Camel运行原理分析 以一个简单的例子说明一下camel的运行原理,例子本身很简单,目的就是将一个目录下的文件搬运到另一个文件夹,处理器只是将文件(限于文本文件)的内容打印到控制台,首先代码如下: ...
- NOR Flash擦写和原理分析
NOR Flash擦写和原理分析 1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直 ...
随机推荐
- 使用 C++ 的 StringBuilder 提升 4350% 的性能
http://blog.jobbole.com/109663/?utm_source=blog.jobbole.com&utm_medium=relatedPosts http://msdn. ...
- [iOS] UIView的clipsTobounds属性
如题,有两个view: view1,view2view2添加view1到中,如果view2大于view1,或者view2的坐标不全在view1的范围内,view2是盖着view1的,意思就是超出的部份 ...
- openssh-server
安装 apt-get install openssh-server 配置 sudo gedit /etc/ssh/sshd_config PermitRootLogin without-passwor ...
- cgroup子系统2_devices子系统
devices子系统用于控制cgroup中全部进程能够訪问哪些设备,三个控制文件:devices.allow,devices.deny,devices.list. devices.allow用于指定c ...
- ING【转载】处理大并发系列
一直在处理高可用高并发的服务.看到网上有一个系列的文章,写的不错.跟进一下. 一:http://blog.csdn.net/feitianxuxue/article/details/8936802 二 ...
- 织梦(Dedecms) V5.6 plus/carbuyaction.php 本地文件包含漏洞
漏洞版本: DedeCmsV5.6 漏洞描述: DedeCMS内容管理系统软件采用XML名字空间风格核心模板:模板全部使用文件形式保存,对用户设计模板.网站升级转移均提供很大的便利,健壮的模板标签为站 ...
- [转]VS2010快捷键
VS2010的快捷键,后附VS2008的快捷键 Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 ...
- iOS开发-多线程简介
多线程从概念上理解是指从软件或者硬件上实现多个线程并发执行的技术,简单点理解就是同一时间可以执行多个事情(比如说一边听歌一边码代码),听歌是一个线程,码代码是一个线程,如果是单核CPU的话,上面两个动 ...
- DialogPlus
项目地址:https://github.com/orhanobut/dialogplus Demo地址:https://github.com/baiqiantao/DialogPlusTest co ...
- JavaScript之深浅拷贝
数组的浅拷贝 如果是数组,我们可以利用数组的一些方法比如:slice.concat 返回一个新数组的特性来实现拷贝.比如: , true, null, undefined]; var new_arr ...