Ajax

Ajax

一、Ajax简介

AJAX即“Asynchronous JavaScript and XML”(异步JavaScriptXML),AJAX并非缩写词,而是由Jesse James Gaiiett创造的名词,是指一种创建交互式网页应用的网页开发技术

1.同步交互和异步交互的理解

举个例子:普通B/S模式(同步    AJAX技术(异步)

       同步:提交请求->等待服务器处理->处理完毕返回 

             这个期间客户端浏览器不能干任何事

同步是指:发送方发出数据后,等接收方发回响应以后才发下一数据包 的通讯方式。  

       异步请求通过事件触发->服务器处理(这时浏览器仍然可以作其他    事情)->处理完毕

      异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数 据包的通讯方式 

2.Ajax:一种不用刷新整个页面便可与服务器通讯的办法

二、Ajax的工作原理

1.Ajax的核心是JavaScript对象XmlHttpRequest

2.AJAX采用异步交互过程

AJAX在用户与服务器之间引入一个中间媒介,从而消除了网络交互过程中的处理等待处理等待缺点。

用户的浏览器在执行任务时即装载了AJAX引擎。AJAX引擎用JavaScript语言编写,通常藏在一个隐藏的框架中。它负责编译用户界面及与服务器之间的交互。

         AJAX引擎允许用户与应用软件之间的交互过程异步进行,独立于用户与网络服务器间的交流。现在,可以用Javascript调用AJAX引擎来代替产生一个HTTP的用户动作,内存中的数据编辑、页面导航、数据校验这些不需要重新载入整个页面的需求可以交给AJAX来执行

3.XMLHttpRequest对象

创建XMLHttpRequest对象(由于非标准所以实现方法不统一)

   (1)Internet ExplorerXMLHttpRequest实现为一个ActiveX对象

  (2)其他浏器(FirefoxSafariOpera…)把它实现为一个本地    JavaScript对象。

         (3)XMLHttpRequest在不同浏览器上的实现是兼容的,所以可以用同样  的方式访问XMLHttpRequest实例的属性和方法,而不论这个实例创   建的方法是什么。

        实例:

function getXmlHttpRequest(){

       var xhr ;

       try{//firefox,opera浏览器

          xhr = new XMLHttpRequest();

       }catch(err){

           try{//IE浏览器5.0

              xhr = new ActiveXObject("Microsoft.XMLHTTP");

           }catch(er){

             alert("您的浏览器版本太低了......");

           }

       }

       return xhr;

}

4.XMLHttpRequest对象方法

方法 

描述 

abort() 

停止当前请求 

getAllResponseHeaders() 

http请求的所有响应首部作为键/值对返回

getResponseHeader("headerLabel") 

返回指定首部的串值

open(method,url,async)

规定请求的类型、URL 以及是否异步处理请求。

method请求的类型;GET 或 POST 

url文件在服务器上的位置 

async:true(异步)或 false(同步) 

send(content) 

向服务器发送请求 

setRequestHeader("label", "value") 

把指定首部设置为所提供的值。在设置任何首部之前必须先调用open() 

5.发送请求方法与属性的介绍

利用XMLHttpRequest 实例与服务器进行通信包含以下3个关键部分

 onreadystatechange 事件处理函数open 方法send 方法 

(1).onreadystatechange

 该事件处理函数由服务器触发,而不是用户

    在 Ajax 执行过程中,服务器会通知客户端当前的通信状态。这    依靠更新XMLHttpRequest对象的readyState来实现,改变readyState       属性是服务器对客户端连接操作的一种方式。

     每次 readyState 属性的改变都会触发 readystatechange事件

(2).open(method, url, asynch)

method请求类型,类似 “GET”或”POST”的字符串。若只想从服务器检索一个文件,而不需要发送任何数据,使用GET(可以在GET请求里通过附加在URL上的查询字符串来发送数据,不过数据大小限制为2000个字符)。若需要向服务器发送数据,用POST

url路径字符串,指向你所请求的服务器上的那个文件。可以是绝对路径或相对路径。

asynch表示请求是否要异步传输,默认值为true(异步)。指定true,在读取后面的脚本之前,不需要等待服务器的相应。指定false,当脚本处理过程经过这点时,会停下来,一直等到Ajax请求执行完毕再继续执行。

在某些情况下,有些浏览器会把多个XMLHttpRequest请求的结果缓存在同一个URL。如果对每个请求的响应不同,这就会带来不好的结果。把当前时间戳追加到URL的最后,就能确保URL的惟一性,从而避免浏览器缓存结果。 

  (3).send(data)

    open 方法定义了 Ajax 请求的一些细节。send 方法可为已经待命的请求发送指令

    data:将要传递给服务器的字符串。

    若选用的是 GET 请求,则不会发送任何数据,给 send 方法传递null 即可:request.send(null)

    当向send()方法提供参数时,要确保open()中指定的方法是POST,如果没有数据作为请求体的一部分发送,则使用null.

       (4).setRequestHeader(header,value)

参数header:首部的名字

              参数value:首部的值

    如果用 POST 请求向服务器发送数据,需要将 “Content-type” 的首部设置为“application/x-www-form-urlencoded”它会告知服务器正在发送数据,并且数据已经符合URL编码了。

   该方法必须在open()之后才能调用

(5)get()和post()基本区别

1.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。 

2.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。两种方式的参数都可以用Request来获得。 

3.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,因服务器的不同而异。 

4.get安全性非常低,post安全性较高。 

5.<form method="get" action="a.asp?b=b">跟<form method="get" action="a.asp">是一样的,也就是说,method为get时action页面后边带的参数列表会被忽视;而<form method="post" action="a.asp?b=b">跟<form method="post" action="a.asp">是不一样的。 

(6)谈Ajax的Get和Post的区别

    1.Get方式
    用get方式可传送简单数据,但大小一般限制在1KB下,数据追加到 url中发送(http的header传送),也就是说,浏览器将各个表单字段 元素及其数据按照URL参数的格式附加在请求行中的资源路径后面。另 外最重要的一点是,它会被客户端的浏览器缓存起来,那么,别人就可 以从浏览器的历史记录中,读取到此客户的数据,比如帐号和密码等。 因此,在某些情况下,get方法会带来严重的安全性问题。

Ajax发送请求:如果是get请求send(参数)参数:必须是null或 xhr.send();

    get请求就不必要设置 xhr.setRequestHeader(header,value)

备注:如果xhr.send(参数);参数不为空情况下,会自动转换成post请求 方式 您可以通过request.getMethod();方法获取请求的方式

实例:

function getAjax(){ 

     //获取xhr对象

     var xhr = getXhr();

        //规定请求类型     

     xhr.open("get","main.jsp?username=123",true);

     xhr.onreadystatechange = function (){

          //判读是否处理完毕

          if(xhr.readyState==4){

               //判读服务器是否处理成功!

              if(xhr.status==200){

                    alert(xhr.responseText);

              }

          }

                

}

使用get方式需要注意
(1)对于get请求(或凡涉及到url传递参数的),被传递的参数都要先经

encodeURIComponent方法处理.例:var url = "update.php?username="  +encodeURIComponent(username) + "&content=" +encodeURIComponent

(content)+"&id=1" ;

2.Post方式:
    当使用POST方式时,浏览器把各表单字段元素及其数据作为HTTP 消息的实体内容发送给Web服务器,而不是作为URL地址的参数进行传 递,使用POST方式传递的数据量要比使用GET方式传送的数据量大的多

发送请求:如果是post请求send(参数)参数:参数可以是null或者

xhr.send()|send(带有参数的)post请求在传递值的情况下必须 设置  xhr.setRequestHeader(header,value)

实例:

function postAjax(){ 

     //获取xhr对象

     var xhr = getXhr();

     //规定请求类型     

     xhr.open("post","main.jsp",true);

   xhr.setRequestHeader("Content-Type",

       "application/x-www-form-urlencoded")

 xhr.send("username=345&pass=123");

     xhr.onreadystatechange = function (){

          //判读是否处理完毕

          if(xhr.readyState==4){

               //判读服务器是否处理成功!

              if(xhr.status==200){

                  alert(xhr.responseText);

              }

          }

                

}

使用Post方式需注意:
(1).设置header的Context-Type为application/x-www-form-

    urlencode确保服务器知道实体中有参数变量.通常使用XmlHttpRequest对象的

    SetRequestHeader("Context-Type","application/x-www-form-urlencoded;")。 例:xmlHttp.setRequestHeader("Content-Type",

"application/x-www-form-urlencoded")
(2).参数是名/值一一对应的键值对,每对值用&号隔开.如 var name=abc&sex=man &age=18 注意var name=update.php?abc&sex=man&age=18

以及var name=?abc&sex=man&age=18的写法都是错误的;
(3).参数在Send(参数)方法中发送,例: xmlHttp.send(name); 如果是 get 方式,直接 xmlHttp.send(null);

(4).服务器端请求参数区分Get与Post。如果是get方式则$username =  $_GET["username"]; 如果是post方式,则$username =  $_POST["username"];

  总之,GET方式传送数据量小,处理效率高,安全性低,会被缓存,而 POST反之。

6.接收方法和属性

  用 XMLHttpRequest 的方法可向服务器发送请求。在 Ajax 处理过程   中,XMLHttpRequest 的属性readyStatestatusresponseText responseXML可被服务器更改

(1)readyState

readyState 属性表示Ajax请求的当前状态。它的值用数字代表。

代表未初始化。 还没有调用 open 方法

代表正在加载。 open 方法已被调用,但 send 方法还没有

  被调用

代表已加载完毕。send 已被调用。请求已经开始

代表交互中。服务器正在发送响应

代表完成。响应发送完毕

    每次 readyState 值的改变,都会触发 readystatechange 事件。如

果把 onreadystatechange 事件处理函数赋给一个函数,那么每次 

   readyState 值的改变都会引发该函数的执行。

    readyState 值的变化会因浏览器的不同而有所差异。但是,当请求

结束的时候,每个浏览器都会把 readyState 的值统一设为 4

(2).status

服务器发送的每一个响应也都带有首部信息。三位数的状态码是服务器发

  送的响应中最重要的首部信息,并且属于超文本传输协议中的一部分。

常用状态码及其含义:

404 没找到页面(not found)

403 禁止访问(forbidden)

500 内部服务器出错(internal service error)

200 一切正常(ok)

304 没有被修改(not modified)(服务器返回304状态,表示源文件没有被修改 )

在 XMLHttpRequest 对象中,服务器发送的状态码都保存在 status 

  性里。通过把这个值和 200 或 304 比较,可以确保服务器是否已发送了一 

  个成功的响应

(3).responseText

      XMLHttpRequest 的 responseText 属性包含了从服务器发送的数据。它

  是一个HTML,XML或普通文本,这取决于服务器发送的内容。

当 readyState 属性值变成 , responseText 属性才可用,表明

  Ajax 请求已经结束。

(4).responseXML

如果服务器返回的是 XML, 那么数据将储存在 responseXML 属性中。

 只用服务器发送了带有正确首部信息的数据时,responseXML 属性才

是可用的。 MIME 类型必须为 text/xml

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值