Ajax
最近写博比较频繁,主要是为了将自己平时零散的知识点总结一下,让自己的知识能成一下体系。
今天把高程的Ajax部分看完了,简单梳理一下,如有理解不到位的地方,也请各位网友指点一下,抱拳!
先上大段代码
1 //处理IE7之前版本的兼容并创建XHR对象; 2 function createXHR(){ 3 if(typeof XMLHttpRequest != "undefined"){ 4 //如果存在XMLHttpRequest则直接使用该对象 5 return new XMLHttpRequest(); 6 }else if(typeof ActiveXObject != "undefined"){ 7 //以下均为处理IE兼容问题 8 if(typeof arguments.callee.activeXString != "string"){ 9 var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"]; 10 var len=null; 11 for (var i=0; len=versions.length; i < len; i++) { 12 try{ 13 new ActiveXObject(versions[i]); 14 arguments.callee.activeXString=versions[i]; 15 break; 16 }catch(ex){ 17 //do something 18 }; 19 }; 20 }; 21 return new ActiveXObject(arguments.callee.activeXString); 22 }else{ 23 //如果没有XHR对象可用的话,也需要处理一下 24 throw new Error("No XHR Object Available"); 25 } 26 }; 27 28 var xhr=createXHR();//创建变量xhr 29 30 //在调用open之前指定onreadystatechange事件处理程序才能确保跨浏览器兼容性 31 xhr.onreadystatechange=function(){ 32 //监控xhr的状态:readyState的值有5个,每次值改变都会触发一次readystatechange 33 //readyState==0 ---→未初始化,尚未调用open方法 34 //readyState==1 ---→启动,调用open尚未调用send 35 //readyState==2 ---→发送,调用send尚未接收到相应 36 //readyState==3 ---→接收,收到部分响应数据 37 //readyState==4 ---→完成,接收到全部响应数据且可以在客户端使用了 38 if(xhr.readyState==4){ 39 if((xhr.status>=200&&xhr.status<300)||xhr.status==304){ 40 //200为响应成功的标志,304表示资源没有被修改 41 alert(xhr.responseText); 42 }else{ 43 alert("Request was unsuccessful:"+xhr.status); 44 }; 45 }; 46 }; 47 xhr.open("get","example.txt",true); 48 xhr.send(null); 49 //xhr.abort();//在接收到响应之前调用该方法可以取消异步请求
以上是最简单的一个Ajax请求的过程,大概的流程如下:
1.先定义一个XMLHttpRequest对象,这里的难点就是需要考虑IE兼容;
2.启动一个请求以备发送open():该方法接收三个参数(实际可以接收5个,不过处于安全考虑,不建议使用):要发送的请求类型(“get”,“post”),请求的URL和表示是否异步的布尔值;这里还涉及到跨域问题,后面会提到;
3.发动特定请求send(null):接收一个参数,即要作为请求主体发送的数据。如果不需要的话,也需要写一个null作为参数。
4.检查响应状态,根据不同的状态,做出不同的处理,这部分代码一般写在open方法之前,主要是为了处理跨浏览器兼容问题。
jQuery里已经将Ajax封装好了,调用很方便。
1 $.ajax({ 2 3 type: 'POST', 4 5 url: url , 6 7 data: data , 8 9 success: success , 10 11 dataType: dataType 12 13 });
以上写的很简单,其实Ajax还是很复杂的,w3c上介绍的很详细,一点点慢慢看。其实前端发展了这么多年了,基本大神们已经把各种东西都总结出来了,资料也很多。
http://www.w3school.com.cn/jquery/ajax_ajax.asp
补充GET和POST的区别
讲到Ajax就不得不提GET和POST,二者的区别也是常被提起的,在网上也看了很多相关的文章,现把大家总结好的且是大多数人接受的一个区别列出来:
1. get是从服务器上获取数据,post是向服务器传送数据。(这个基本上是没有异议的)
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
(这个其实是大家默认的一种约定)
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
(这里说的get传送数据量小其实并不是指get本身,二是说URL有一个长度限制,这个根据浏览器不同而不同,但是其实很多现代浏览器也并没有真的限制URL的长度,只是URL的长度会影响服务器响应的效率。所以这个应该不算是get和POST的区别。)
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
(现在在日常使用中,其实很多人也会把get的数据进行一个encode处理,这样很多人也很难一眼就从URL中读取到实际数据了,如果说可以进行encode解析,那么这个人应该也有能力截取POST发送包吧...)
以上关于get和POST的区别黑体字部分是一般大家默认的,也是面试过程中面试官希望大家回答的,记住就好了;红色字体部分,可能是更深层次的东西吧,因为我没做过服务器端的工作,对这些,暂时还不敢较真,不过,先列出来,有技术大神可以指点一二,日后自己有机会更多的接触该部分,也会回来自己做一个校正。