面试时问到了这个问题,说实话我还是不理解的,只是单单会使用。所以今天我看一下,自己了解下。

看了网上前辈们写的资料,我自己总结归纳ajax的原理和流程如下:

1、AJAX创建异步对象XMLHttpRequest

这个是ajax核心的对象,当然不是所有浏览器创建这个对象的方法是一致的。我们开发过程中一般建议使用chrome浏览器,在chrome中,XMLHttpRequest对象的创建方法直接

var xmlHttp=new XMLHttpRequest();即可。但是IE是特例,我们需要这样var xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");(这里忽略低版本IE了,我相信再低不可能使用IE6以下吧),要在一个方法内完成对象创建需要try、catch(JS也是可以的)

2、操作XMLHttpRequest 对象

对象创建完成后当然是使用了。

(1)设置请求参数(请求方式,请求页面的相对路径,是否异步)

(2)设置回调函数,一个处理服务器响应的函数,使用 onreadystatechange ,类似函数指针

(3)获取异步对象的readyState 属性:该属性存有服务器响应的状态信息。每当 readyState 改变时,onreadystatechange 函数就会被执行。

(4)判断响应报文的状态,若为200说明服务器正常运行并返回响应数据,

(5)读取响应数据,可以通过 responseText 属性来取回由服务器返回的数据。

感觉好难记,一时间还是很难消化的。我们还是直接来看ajax怎么写吧

现在ajax我会的就两种,一种就是原生的ajax,另一种就是jquery中提供的ajax,后者比前者更简单。

第一种:

原生ajax,请求方式因为分为post和get等,为了统一,可以当参数传入,不必分开处理,然后我们可以封装这样的一个方法,使用时直接调用

 1 function ajax_method(url,data,method,success) {
2 // 创建异步对象
3 var ajax = new XMLHttpRequest();
4
5 // get 跟post 需要分别写不同的代码
6 if (method=='get') {
7 // get请求
8 if (data) {
9 // 如果有值
10 url+='?';
11 url+=data;
12 }else{
13
14 }
15 // 设置 方法 以及 url
16 ajax.open(method,url);
17
18 // send即可
19 ajax.send();
20 }else{
21 // post请求
22 // post请求 url 是不需要改变
23 ajax.open(method,url);
24
25 // 需要设置请求报文
26 ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
27
28 // 判断data send发送数据
29 if (data) {
30 // 如果有值 从send发送
31 ajax.send(data);
32 }else{
33 // 木有值 直接发送即可
34 ajax.send();
35 }
36 }
37
38 // 注册事件
39 ajax.onreadystatechange = function () {
40 // 在事件中 获取数据 并修改界面显示
41 if (ajax.readyState==4&&ajax.status==200) {
42 // console.log(ajax.responseText);
43
44 // 将 数据 让 外面可以使用
45 // return ajax.responseText;
46
47 // 当 onreadystatechange 调用时 说明 数据回来了
48 // ajax.responseText;
49
50 // 如果说 外面可以传入一个 function 作为参数 success
51 success(ajax.responseText);
52 }
53 }
54
55 }

第二种:

其实jquery中使用ajax也是有多种方式的,先看看不带参数的:

 1 $(document).ready(function(){
2 $("button").click(function(){
3 $.ajax({url:"http://localhost:8080/lsd/getChildrenList.action",
4 success:function(result){
5   //处理返回数据12 }});
13 });
14 });

其中第一个参数是请求的url,第二个参数是回调用函数,json数据封装在result,需要对result的json数据进行解析

如果想加入参数,则在url和回调函数之间加入参数即可。

另外,jquery中提供post类型的ajax方法从服务器载入数据

1 $('#send').click(function(){
2 $.post('jqRequest.jsp',{
3 num: $('#num').val()
4 },function(data){
5 $('#result').html('您选择的数字' + $('#num').val() + '是' + data)
6 })
7 })

写法上我觉得就是三种$.ajax()和$.post()和$.get(),至于参数不参数,按实际需要来就行

三者做个比较:

$.get $.post是简单易用的高层实现,我们使用$.get $.post方法,jQuery会自动封装调用底层的$.ajax。
$.get 只处理简单的 GET 请求功能以取代复杂 $.ajax,请求成功时可调用回调函数。不支持出错时执行函数,否则必须使用$.ajax。
$.post 只处理 post请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。不支持出错时执行函数,否则必须使用$.ajax。
$.get("test.php", { name: "John", time: "2pm" } ) $.get方法在请求时会自动生成queryString提交给服务器(name=John&time=2pm),
$.post方法提交的数据直接类似表单提交,提交的数据量比$.get更大。

这里插一句:post和get提交的区别,面试也问了,回答的不是很全面。

1.post提交的数据量几乎没有限制,get提交有内容大小限制

2.get提交把参数加在url中,post提交不会

3.由于get提交把参数放入了url,所以大家都可以看到是比较不安全的,post比较安全

AJAX异步原理与实现的更多相关文章

  1. AJAX异步请求原理和过程

    AJAX 指异步 JavaScript 及 XML(Asynchronous JavaScript And XML),它不是一种新的编程语言,而是一种使用现有标准的新方法. AJAX 基于 JavaS ...

  2. 【java项目实践】具体解释Ajax工作原理以及实现异步验证username是否存在+源代码下载(java版)

    一年前,从不知道Ajax是什么,伴随着不断的积累,到如今常常使用,逐渐有了深入的认识. 今天,假设想开发一个更加人性化,友好,无刷新,交互性更强的网页,那您的目标一定是Ajax. 介绍 在具体讨论Aj ...

  3. Ajax工作原理

    在写这篇文章之前,曾经写过一篇关于AJAX技术的随笔,不过涉及到的方面很窄,对AJAX技术的背景.原理.优缺点等各个方面都很少涉及null.这次写这篇文章的背景是因为公司需要对内部程序员做一个培训.项 ...

  4. 淘宝购物车页面 智能搜索框Ajax异步加载数据

    如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...

  5. 关于Ajax工作原理

    1.ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax ...

  6. jquery Ajax异步请求之session

    写了一个脚本,如下: $(function () { $("#btnVcode").click(function () { var receiveMobile = $(" ...

  7. Ajax工作原理(转)

    1.ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax ...

  8. ajax请求原理及jquery $.ajax封装全解析

    .ajax原理: Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面.这其中最关键的一步就是从服务器获得 ...

  9. 触碰jQuery:AJAX异步详解

    触碰jQuery:AJAX异步详解 传送门:异步编程系列目录…… 示例源码:触碰jQuery:AJAX异步详解.rar AJAX 全称 Asynchronous JavaScript and XML( ...

随机推荐

  1. 【Web前端HTML5&CSS3】03-字符实体与语义标签

    笔记来源:尚硅谷Web前端HTML5&CSS3初学者零基础入门全套完整版 目录 字符实体与语义标签 1. 字符实体 2. meta标签 3. 语义标签 4. 块元素与行内元素 块元素(bloc ...

  2. Kubernetes入门,使用minikube 搭建本地k8s 环境

    这是一篇 K8S 的 HelloWorld,在学习K8S官方文档时搭建环境搭建的一个记录,照着文档下来还是比较顺利的. 一.安装kubectl 下载 kubectl curl -LO "ht ...

  3. 面试遇到的坑JS深拷贝和浅拷贝

    首先要搞明白深拷贝和钱拷贝的区别要先搞明白 栈和堆的区别 一.栈 栈存储基础数据类型,如: String.Number.Boolean.Null.Underined,这些简单的基础数据类型能够直接存储 ...

  4. ES6学习-1 啥是ES6啊

    我不准备刨根问底,找寻他的十八辈祖先,希望用最简单的方式能够说明白ES6是个啥,come on baby ES6的全称是ECMAScript 6.0,他于2015 年 6 月正式发布,它的目标是使得 ...

  5. [DB] Zookeeper

    介绍 相当于"数据库",类似linux.hdfs的属性文件结构 分布式协调框架,实现HA(High Availability) 分布式锁管理框架 保证数据在zookeeper集群之 ...

  6. 【SecureCRT配置】修改默认卷屏行数当做一个操作,屏幕输出有上百行,当需要将屏幕回翻时,这个设置会有很大帮助,默认为500行,可以改为10000行,不用担心找不到了。 选项 => 全局选项 => Default Session => Edit Default Settings => Terminal => Emulation => Scrollback 修改为32000。

    SecureCRT配置屏幕内容输出到log文件 SecureCRT看不到前几分钟操作的内容,或者想把通过vi命令查看的日志输出到log文件(在懒得下载日志文件的情况下),所以接下来就这样操作: 文件保 ...

  7. 联想INTEL X86台式机 用光驱启动 usb光驱启动

    联想INTEL X86台式机  用光驱启动 usb光驱启动 启动项顺序 都要调整 主要顺序 自动顺序 出错顺序 按下f10 f12

  8. Linux利用nc命令脚本批量检测服务器指定端口是否开放

    一.nc命令检测端口的用法 # nc -v -w 10 %IP% -z %PORT% -v 显示指令执行过程. -w <超时秒数> 设置等待连线的时间. -u 表示使用UDP协议 -z 使 ...

  9. "sar"工具 利用率

    LTP--linux稳定性测试 linux性能测试 ltp压力测试   余二五 2017-11-14 16:20:00 浏览1172 linux 日志 配置 内存管理 测试 脚本 性能测试 压力测试 ...

  10. python基础之python牛逼的设计模式

    七大设计原则: 1.单一职责原则[SINGLE RESPONSIBILITY PRINCIPLE]:一个类负责一项职责. 2.里氏替换原则[LISKOV SUBSTITUTION PRINCIPLE] ...