浏览器与服务器通信技术——Ajax详解

使用BOM接口从服务器获取数据,获取的是整个页面,得到数据之后需要刷新整个页面。运用ajax技术无须刷新页面即可从服务器取得数据。ajax的核心是XMLHttpRequest对象。

一、 创建XHR对象

var xhr=new XMLHttpRequest();

二、启动和发送请求

xhr.open("get","example.php",false);

open方法接受3个参数:要发送的请求的类型,请求的URL和表示是否异步发送请求的布尔值。URL相对于执行代码的当前页面。

xhl.send(null);

send方法接受一个参数,即要作为请求主体发送的数据。如果不需要通过请求主体发送数据,则必须传入null。

三、 处理响应

调用send()之后,请求就会被分派到服务器,等待服务器的响应。在收到响应后,响应的数据会自动填充XHR对象的属性,相关属性简介如下:
responseText:作为响应主体被返回的文本。
responseXML:如果响应内容类型为"text/xml",这个数据将保存包含响应数据的XML DOM文档。
status:响应的HTTP状态说明。一般来说,可以将HTTP状态代码200作为成功的标志,此时可以取得responseText属性的值。状态代码304表示请求的资源并没有被修改,可以使用浏览器缓存中的版本。
statusText:HTTP状态的说明。

1 xhr.open("get","example.php",false);
2 xhr.send(null);
3 if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
4      alert("成功"+xhr.responseText);
5 }else{
6     alert("失败"+xhr.responseText);
7 }    

四、异步获取数据

XHR对象有一个readyState属性,该属性表示请求/响应过程的当前活动阶段。这个属性可取的值如下:

0:未初始化。尚未调用open()方法。

1:启动。已经调用open()方法,但尚未调用send()方法。

3. 发送。已经调用send()方法,但尚未接受到响应。

3. 接受。已经接受到部分响应数据。

4. 完成。已经接受到全部响应数据,而且已经可以在客户端使用了。

只要readyState的属性值改变一次,就会触发一次readystatechange事件。

 1 var xhr=new XMLHttpRequest();
 2 xhr.onreadystatechange=function(){
 3     if(xhr.readyState==4){
 4         if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
 5             alert(xhr.responseText);
 6         }else{
 7             alert("失败"+xhr.responseText);
 8         }
 9     }
10 };
11 xhr.open("get","example.php",true);
12 xhr.send(null);    

调用xhr.abort()方法,XHR对象会停止触发事件。

五、get请求

get请求常用于向服务器查询某些信息,可以将查询字符串追加到url的末尾:

xhr.open("get","example.php?age=20&name=xiaoming",true);

查询字符串中每个参数的名称和值都必须使用encodeURIComponent()进行编码,然后才能放到URL的末尾。下面这个函数可以辅助向现有URL的末尾添加查询字符串参数:

1 function addURLParam(url,name,value){
2   url+=(url.indexOf("?")==-1?"?":"&");
3   url+=encodeURIComponent(name)+"="+encodeURIComponent(value);
4   return url;
5 }

六、POST请求

POST请求,通常用于向服务器发送应该被保存的数据。POST请求的主体可以包含非常多的数据,而且格式不限。如果服务器上的PHP想通过$_POST超级全局变量获取数据,可以使用XHR来模仿表单提交:首先将Content-Type头部信息设置为application/x-www-form-urlencoded,也就是表单提交时的内容类型,其次以适当方式创建一个字符串。

1 xhr.open("post","test.php",true);
2 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
3 var data="age=20&name=dongfeng"
4 xhr.send(data);

也可以通过serialize()函数将页面中表单的数据进行序列化,然后通过XHR发送到服务器。

1 xhr.open("post","test.php",true);
2 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
3 var form=document.getElementById("user-info");
4 xhr.send(serialize(form));

与get请求相比,POST请求消耗的资源会多一些。从性能角度来看,以发送相同的数据计,Get请求的速度最多可达到POST请求的两倍。

七、FormData

FormData为序列化表单以及创建与表单格式相同的数据提供了便利。使用FromData的方便之处体现在不必明确地在XHR对象上设置请求头部。XHR对象能够识别传入的数据类型是FormData的实例,并配置适当的头部信息。

1 xhr.open("post","test.php",true);
2 var form=document.getElementById("user-info");
3 xhr.send(new FormData(form));

可以使用append方法向FromData对象中追加数据:

var data=new FormData();
data.append("name","snsart");

八、进度事件

有以下6个进度事件:

loadstart:在接受到响应数据的第一个字节时触发。

progress:在接受响应期间持续不断的触发。

error:在请求发生错误时触发。

abort:在因为调用abort()方法而终止连接时触发。

load:在接受到完整的响应数据时触发。

loadend:在通信完成或者触发error、abort或load事件后触发。

其中onprogress事件处理程序会接收到一个envent对象,其target属性时XHR对象,并且有三个额外的属性:lengthComputable、position和totalSize。其中,lengthComputable是一个表示进度信息是否可用的布尔值,position表示已经接收的字节数,totalSize表示根据

Content-Length响应头部确定的预期字节数。有了这些数据,就可以创建一个进度指示器了:

1 xhr.onprogress=function(event){
2   var divStatus=document.getElementById("status");
3   if(event.lengthComputable){
4     divStatus.innerHTML="接收:"+event.position+"总共:"+"event.tatalSize"+"字节";
5   }
6 };
7 xhr.open("get","altevents.php",true);
8 xhr.send(null);

原文地址:https://www.cnblogs.com/snsart/p/10896137.html

时间: 2024-11-07 23:43:34

浏览器与服务器通信技术——Ajax详解的相关文章

(转)CAS (4) —— CAS浏览器SSO访问顺序图详解(CAS Web Flow Diagram by Example)

CAS (4) —— CAS浏览器SSO访问顺序图详解(CAS Web Flow Diagram by Example) tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 nginx版本: nginx-1.9.8 cas版本: cas4.1.2cas-client-3.4.1 参考来源: jasig.github.io:CAS protocol CAS (1) —— Mac下配置CAS到Tomcat(服务端) CAS (2) —— Mac下配置CAS到Tomc

Ajax详解及使用Ajax时的返回值类型有哪些?

Ajax详解 Ajax = 异步 JavaScript 和 XML. Ajax 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 Ajax)如果需要更新内容,必需重载整个网页面. (注:图片来自网络) 如何使用Ajax技术 首先,需要获取XMLHttpRequest对象: var xhr; xhr = new XMLHttpRequest(); XMLH

IE浏览器条件注释if IE详解

无论是google还是百度搜到的if IE条件注释用法,排在前面的几个搜索结果文章都是有错误和漏洞的,而这些漏洞和错误导致我一度误以为有些IE条件注释已经失效了,即使不是失效,也令我 很费解.今天抽时间查阅了些老外写的东西,并且都试验了一遍.发现给我造成费解的原因是那些文章大多都是抄来的,没有经过亲自试验,在复制来复制去的过程 中就把某些关键的地方弄错了:( 现将正确的if IE条件注释用法总结一下,以便以后使用: 运算符 示例 说明 ! [if !IE] 非运算符.该例子表示所有的非IE浏览器

Linux系统环境SVN服务器定时备份详解

Linux系统环境SVN服务器定时备份详解: 本篇文章主要介绍的内容是在Linux系统下如何定时备份SVN服务器,目的是为了防止一旦SVN服务器挂掉及数据丢失造成的损失,需要对SVN服务器数据定时备份处理,以便找回丢失的数据,具体如下所示: 一. 新建备份目录 #mkdir /opt/project_backup 二.编写备份脚本 #cd /home/svn #vim project_backup.sh cd /home/svn now=`/bin/date +%Y%m%d` /bin/tar

css3浏览器私有属性前缀使用详解

什么是浏览器私有属性前缀 CSS3的浏览器私有属性前缀是一个浏览器生产商经常使用的一种方式.它暗示该CSS属性或规则尚未成为W3C标准的一部分. 以下是几种常用前缀 -webkit- -moz- -ms- -o- -khtml-(现在基本都没有用了,被-webkit-取代) 举例来说,一个CSS3圆角的代码是: -webkit-border-radius: 50%; -o-border-radius: 50%; -moz-border-radius: 50%; -ms-border-radius

ajax详解

1.ajax介绍 1.1.什么是ajax 全称:Asynchronous JavaScript And XML(异步 JavaScript 及 XML) Ajax的作用:实现异步请求的技术. 什么是同步请求? 场景:页面上有一个a标签,用户点击a标签,浏览器发出一个请求,然后服务器给出一个响应. (请求,其实是用户的操作,触发的) 什么是异步(不同步)请求? 场景:在用户注册的时候,用户首先输入用户名,接下来用户继续填写其他注册信息,与此同时,浏览器自动发送了一个请求,将用户输入的用户名发送给服

jQuery中$.ajax()详解(转)

JQuery中$.ajax()方法参数详解     url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有

$.ajax()详解

$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持. 3.timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设置. 4.async: 要求为B

Nginx服务器的配置详解

Nginx 配置文件详解 user nginx ; #用户 worker_processes 8; #工作进程,根据硬件调整,大于等于cpu核数 error_log logs/nginx_error.log crit; #错误日志 pid logs/nginx.pid; #pid放置的位置 worker_rlimit_nofile 204800; #指定进程可以打开的最大描述符 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文 件数(ulimit -n)与ngin