Chinaunix首页 | 论坛 | 博客
  • 博客访问: 223941
  • 博文数量: 25
  • 博客积分: 1380
  • 博客等级: 中尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-02 18:19
文章分类

全部博文(25)

文章存档

2010年(4)

2009年(4)

2008年(17)

我的朋友

分类: 系统运维

2008-08-07 22:39:22

ajax所包含的技术
    大家都知道ajax并非一种新的技术,而是几种原有技术的结合体。它由下列技术组合而成。
   1.使用CSS和XHTML来表示。
   2. 使用DOM模型来交互和动态显示。
      DOM(Document Object Model),它是一个接口,是HTML和XML的接口,目的是为了获取和更改节点。
   3.使用XMLHttpRequest来和服务器进行异步通信。
   4.使用javascript来绑定和调用。
在上面几中技术中,除了XmlHttpRequest对象以外,其它所有的技术都是基于web标准并且已经得到了广
泛使用的,XMLHttpRequest虽然目前还没有被W3C所采纳,但是它已经是一个事实的标准,因为目前几乎
所有的主流浏览器都支持它。
ajax原理和XmlHttpRequest对象

  Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用
javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和
原理,我们必须对 XMLHttpRequest有所了解。
XMLHttpRequest是ajax的核心机制,它是在IE5中首先引入的,是一种支持异步请求的技术。简单的说,
也就是javascript可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。
  所以我们先从XMLHttpRequest讲起,来看看它的工作原理。
  首先,我们先来看看XMLHttpRequest这个对象的属性。
  它的属性有:
  onreadystatechange  每次状态改变所触发事件的事件处理程序。
  responseText     从服务器进程返回数据的字符串形式。
  responseXML    从服务器进程返回的DOM兼容的文档数据对象。
  status           从服务器返回的数字代码,比如常见的404(未找到)和200(已就绪)
  status Text       伴随状态码的字符串信息
  readyState       对象状态值
0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)
1 (初始化) 对象已建立,尚未调用send方法
2 (发送数据) send方法已调用,但是当前的状态及http头未知
3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取
部分数据会出现错误,
4 (完成) 数据接收完毕,此时可以通过通过responseXml和responseText获取完整的回应数据

  但是,由于各浏览器之间存在差异,所以创建一个XMLHttpRequest对象可能需要不同的方法。这个差异
主要体现在IE和其它浏览器之间。下面是一个比较标准的创建XMLHttpRequest对象的方法。
function CreateXmlHttp()
   {

   //非IE浏览器创建XmlHttpRequest对象
    if(window.XmlHttpRequest)
    {
     xmlhttp=new XmlHttpRequest();
    }
    //IE浏览器创建XmlHttpRequest对象
     if(window.ActiveXObject)
    {
    try
    {
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");     
    }
    catch(e)
    {
    try{
     xmlhttp=new ActiveXObject("msxml2.XMLHTTP");
     }
     catch(ex){}
    }
    }
   }  
function Ustbwuyi()
   {
    var data=document.getElementById("username").value;   
        CreateXmlHttp();
        if(!xmlhttp)
        {
         alert("创建xmlhttp对象异常!");
         return false;
        }      
        xmlhttp.open("POST",url,false);
        xmlhttp.onreadystatechange=function()
        {   
         if(xmlhttp.readyState==4)
           {
           document.getElementById("user1").innerHTML="数据正在加载...";
             if(xmlhttp.status==200)
             {
              document.write(xmlhttp.responseText);
             }      
           }
         }
        xmlhttp.send();

   }
如上所示,函数首先检查XMLHttpRequest的整体状态并且保证它已经完成(readyStatus=4),即数据已
经发送完毕。然后根据服务器的设定询问请求状态,如果一切已经就绪(status=200),那么就执行下面
需要的操作。
对于XmlHttpRequest的两个方法,open和send,其中open方法指定了:
a、向服务器提交数据的类型,即post还是get。
b、请求的url地址和传递的参数。
c、传输方式,false为同步,true为异步。默认为true。如果是异步通信方式(true),客户机就不等待服
务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作。我们需要
根据实际需要来指定同步方式,在某些页面中,可能会发出多个请求,甚至是有组织有计划有队形大规模
的高强度的request,而后一个是会覆盖前一个的,这个时候当然要指定同步方式。
    Send方法用来发送请求。

  知道了XMLHttpRequest的工作流程,我们可以看出,XMLHttpRequest是完全用来向服务器发出一个请求
的,它的作用也局限于此,但它的作用是整个ajax实现的关键,因为ajax无非是两个过程,发出请求和响
应请求。并且它完全是一种客户端的技术。而XMLHttpRequest正是处理了服务器端和客户端通信的问题所
以才会如此的重要。
  现在,我们对ajax的原理大概可以有一个了解了。我们可以把服务器端看成一个数据接口,它返回的是
一个纯文本流,当然,这个文本流可以是XML格式,可以是Html,可以是Javascript代码,也可以只是一
个字符串。这时候,XMLHttpRequest向服务器端请求这个页面,服务器端将文本的结果写入页面,这和普
通的web开发流程是一样的,不同的是,客户端在异步获取这个结果后,不是直接显示在页面,而是先由
javascript来处理,然后再显示在页面。至于现在流行的很多ajax控件,比如magicajax等,可以返回
DataSet等其它数据类型,只是将这个过程封装了的结果,本质上他们并没有什么太大的区别。
ajax的优点
   Ajax的给我们带来的好处大家基本上都深有体会,在这里只简单的讲几点:
     1、最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好。
  2、使用异步(异步就是各做各的事情,同步就是等那边的事忙完了以后,再忙这边的事)方式
与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。
  3、可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带
宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,ajax的原则是“按需取数据”,可以最大
程度的减少冗余请求,和响应对服务器造成的负担。
     4、基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。
ajax的缺点
  下面我着重讲一讲ajax的缺陷,因为平时我们大多注意的都是ajax给我们所带来的好处诸如用户体验的
提升。而对ajax所带来的缺陷有所忽视。
  下面所阐述的ajax的缺陷都是它先天所产生的。
   1、ajax去掉了back按钮,即对浏览器后退机制的破坏。后退按钮是一个标准的web站点的重要功能,
但是它没法和js进行很好的合作。这是ajax所带来的一个比较严重的问题,因为用户往往是希望能够通过
后退来取消前一次操作的。那么对于这个问题有没有办法?答案是肯定的,用过Gmail的知道,Gmail下面
采用的ajax技术解决了这个问题,在Gmail下面是可以后退的,但是,它也并不能改变ajax的机制,它只
是采用的一个比较笨但是有效的办法,即用户单击后退按钮访问历史记录时,通过创建或使用一个隐藏的
IFRAME来重现页面上的变更。(例如,当用户在Google Maps中单击后退时,它在一个隐藏的IFRAME中进
行搜索,然后将搜索结果反映到Ajax元素上,以便将应用程序状态恢复到当时的状态。)
但是,虽然说这个问题是可以解决的,但是它所带来的开发成本是非常高的,和ajax框架所要求的快速开
发是相背离的。这是ajax所带来的一个非常严重的问题。
ajax的几种框架

目前我们采用的比较多的ajax框架主要有ajax.dll,ajaxpro.dll,magicajax.dll 以及微软的atlas框架。

Ajax.dll和Ajaxpro.dll这两个框架差别不大,而magicajax.dll只是封装得更厉害一些,比如说它可以
直接返回DataSet数据集,前面我们已经说过,ajax返回的都是字符串,magicajax只是对它进行了封装而
已。但是它的这个特点可以给我们带来很大的方便,比如说我们的页面有一个列表,而列表的数据是不断
变化的,那么我们可以采用magicajax来处理,操作很简单,添加magicajax之后,将要更新的列表控件放
在magicajax的控件之内,然后在pageload里面定义更新间隔的时间就ok了,atlas的原理和magicajax差
不多。但是,需要注意的一个问题是,这几种框架都只支持IE,没有进行浏览器兼容方面的处理,用反编
译工具察看他们的代码就可以知道。
除了这几种框架之外,我们平时用到的比较多的方式是自己创建xmlHttpRequest对象,这种方式和前面
的几种框架相比更具有灵活性。另外,在这里还提一下aspnet2.0自带的异步回调接口,它和ajax一样也
可以实现局部的无刷新,但它的实现实际上也是基于xmlhttprequest对象的,另外也是只支持IE,当然这
是微软的一个竞争策略.

阅读(869) | 评论(0) | 转发(0) |
0

上一篇:突然想听歌

下一篇:期待的只是曾经

给主人留下些什么吧!~~