转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
看沧海变桑田 Web2.0中AJAX应用探讨         ★★★★

看沧海变桑田 Web2.0中AJAX应用探讨

作者:闵涛 文章来源:闵涛的学习笔记 点击数:656 更新时间:2009/4/23 11:27:12
  最近互联网上比较火热的话题当然是关于WEB2.0的应用,其中AJAX又是WEB2.0的核心之一。AJAX是Asynchronous JavaScript and XML 的缩写。它并不是一门新的语言或技术,它实际上是几项技术按一定的方式组合在一在同共的协作中发挥各自的作用,它包括:

  使用XHTML和CSS标准化呈现;

  使用DOM实现动态显示和交互;

  使用XML和XSLT进行数据交换与处理;

  使用XMLHttpRequest进行异步数据读取;

  最后用JavaScript绑定和处理所有数据;

  Ajax的工作原理相当于在用户和服务器之间加了一个中间层,使用户操作与服务器响应异步化。这样把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。

  我们以两个验证通行证帐号是否存在的例子来讲述AJAX在实际中的应用:

  (1)用文本字符串的方式返回服务器的响应来验证网易通行证帐号是否存在;

  (2)以XMLDocument对象方式返回响应来验证金山通行证帐号是否存在;

  首先,我们需要用JavaScript来创建XMLHttpRequest 类向服务器发送一个HTTP请求, XMLHttpRequest 类首先由Internet Explorer以ActiveX对象引入,被称为XMLHTTP。 后来Mozilla Netscape Safari和其他浏览器也提供了XMLHttpRequest类,不过它们创建XMLHttpRequest类的方法不同。

  对于Internet Explorer浏览器,创建XMLHttpRequest 方法如下:

xmlhttp_request =
new ActiveXObject("Msxml2.XMLHTTP.3.0"); 
//3.0或4.0, 5.0        
xmlhttp_request = 
new ActiveXObject("Msxml2.XMLHTTP");
xmlhttp_request =
new ActiveXObject("Microsoft.XMLHTTP");

  由于在不同Internet Explorer浏览器中XMLHTTP版本可能不一致,为了更好的兼容不同版本的Internet Explorer浏览器,因此我们需要根据不同版本的Internet Explorer浏览器来创建XMLHttpRequest类,上面代码就是根据不同的Internet Explorer浏览器创建XMLHttpRequest类的方法。对于Mozilla Netscape Safari等浏览器,创建XMLHttpRequest 方法如下:

xmlhttp_request = new XMLHttpRequest();

  如果服务器的响应没有XML mime-type header,某些Mozilla浏览器可能无法正常工作。 为了解决这个问题,如果服务器响应的header不是text/xml,可以调用其它方法修改该header。

xmlhttp_request = new XMLHttpRequest();
xmlhttp_request.overrideMimeType('text/xml');

  在实际应用中,为了兼容多种不同版本的浏览器,一般将创建XMLHttpRequest类的方法写成如下形式:

try

{
  if( window.ActiveXObject )
  {
            for( var i = 5; i; i-- )
			{
                try{
                    if( i == 2 )
					
					{

xmlhttp_request = 

new ActiveXObject( "Microsoft.XMLHTTP" );    
  }
  else
  {
xmlhttp_request = 
new ActiveXObject( 

"Msxml2.XMLHTTP." + i + ".0" );    
   }
xmlhttp_request.setRequestHeader
("Content-Type","text/xml");
xmlhttp_request.setRequestHeader
("Content-Type","gb2312");
break;}
                catch(e)
				{                        
                    xmlhttp_request = false;
                }
            }
        }
		else if( window.XMLHttpRequest )
		{
            xmlhttp_request = new XMLHttpRequest();
            if (xmlhttp_request.overrideMimeType) 
			{
                xmlhttp_request.overrideMimeType
				
				('text/xml');
            }
        }
    }catch(e)
	{
        xmlhttp_request = false;
    }

  在定义了如何处理响应后,就要发送请求了。可以调用HTTP请求类的open()和send()方法,如下所示:

xmlhttp_request.open('GET', URL, true);
xmlhttp_request.send(null);

  open()的第一个参数是HTTP请求方式?GET,POST或任何服务器所支持的您想调用的方式。 按照HTTP规范,该参数要大写;否则,某些浏览器(如Firefox)可能无法处理请求。

  第二个参数是请求页面的URL。

  第三个参数设置请求是否为异步模式。如果是TRUE,JavaScript函数将继续执行,而不等待服务器响应。这就是"AJAX"中的"A"。

  用JavaScript来创建XMLHttpRequest类向服务器发送一个HTTP请求后,接下来要决定当收到服务器的响应后,需要做什么。这需要告诉HTTP请求对象用哪一个JavaScript函数处理这个响应。可以将对象的onreadystatechange属性设置为要使用的JavaScript的函数名,如下所示:

xmlhttp_request.onreadystatechange =FunctionName;

  FunctionName是用JavaScript创建的函数名,注意不要写成FunctionName(),当然我们也可以直接将JavaScript代码创建在onreadystatechange之后,例如:

xmlhttp_request.onreadystatechange = function(){
    // JavaScript代码段
};

  在这个函数中。首先要检查请求的状态。只有当一个完整的服务器响应已经收到了,函数才可以处理该响应。XMLHttpRequest 提供了readyState属性来对服务器响应进行判断。

  readyState的取值如下:

0 (未初始化)

1 (正在装载)

2 (装载完毕)

3 (交互中)

4 (完成)

  所以只有当readyState=4时,一个完整的服务器响应已经收到了,函数才可以处理该响应。具体代码如下:

if (http_request.readyState == 4) 

{
    // 收到完整的服务器响应
} 

else 

{
    // 没有收到完整的服务器响应
}

  当readyState=4时,一个完整的服务器响应已经收到了,接着,函数会检查HTTP服务器响应的状态值。完整的状态取值可参见W3C文档。当HTTP服务器响应的值为200时,表示状态正常。

  在检查完请求的状态值和响应的HTTP状态值后,就可以处理从服务器得到的数据了。有两种方式可以得到这些数据:

  (1)以文本字符串的方式返回服务器的响应

  (2)以XMLDocument对象方式返回响应

  实例一: 用文本字符串的方式返回服务器的响应来验证网易通行证帐号是否存在

  首先,我们登陆网易通行证注册页面,可以看到检测用户名是否存在是将用户名提交给checkssn.jsp页面进行判断,格式为:

reg.163.com/register/checkssn.jsp?username=用户名

  根据上面讲到的方法,我们可以利用AJAX技术对网易通行证用户名进行检测:

  第一步:新建一个基于Xhtml标准的网页,在区域插入Javascript函数如下:

<script type="text/javascript" language="javascript">
function getXMLRequester( )

{
    var xmlhttp_request = false;
    try
	
	{
        if( window.ActiveXObject )
		
		{
            for( var i = 5; i; i-- )
			
			{
                try{
                    if( i == 2 )
					
					{
xmlhttp_request = 
new ActiveXObject( "Microsoft.XMLHTTP" );    
                    }
					else
					{
xmlhttp_request = 
new ActiveXObject(
"Msxml2.XMLHTTP." + i + ".0" );    
xmlhttp_request.setRequestHeader
("Content-Type","text/xml");
xmlhttp_request.setRequestHeader
("Content-Type","gb2312");
                 }
break;
}
                catch(e)
				{                        
                    xmlhttp_request = false;
                }
            }
        }else if( window.XMLHttpRequest )
		{
            xmlhttp_request = 
			
			new XMLHttpRequest();
            if (xmlhttp_request.overrideMimeType) 
			{
                xmlhttp_request.overrideMimeType
				
				('text/xml');
            }
        }
    }catch(e){
        xmlhttp_request = false;
    }
    return xmlhttp_request ;
}

    function IDRequest(n) 
	{
	
	//定义收到服务器的响应后需要执行的JavaScript函数
url=n+document.getElementById('163id').value;
//定义网址参数
        xmlhttp_request=getXMLRequester();
		//调用创建XMLHttpRequest的函数
        xmlhttp_request.onreadystatechange = doContents;
		//调用doContents函数
        xmlhttp_request.open('GET', url, true);
        xmlhttp_request.send(null);
    }
    function doContents() {
        if (xmlhttp_request.readyState == 4) {
		// 收到完整的服务器响应
            if (xmlhttp_request.status == 200) {
			//HTTP服务器响应的值OK
document.getElementById('message').innerHTML = 
xmlhttp_request.responseText;
//将服务器返回的字符串写到页面中ID为message的区域
            } 
			else 
			{
                alert(http_request.status);
            }
        }
    }
</script>

  在区域建立一个文本框,id为163id

<input type="text" id="163id" onpropertychange=
"IDRequest('http://reg.163.com
/register/checkssn.jsp?username=')"
/>

  再建一个id为messsge的空白区域用来显示返回字符串(也可以通过Javascript函数截取一部分字符串显示):

<div id="message"></div>

  这样,一个基于AJAX技术的用户名检测页面就做好了,不过这个页面将返回服务器响应生成页面的所有字符串,当然还可以对返回的字符串进行一些操作,便于应用到不同的需要当中。

  实例二: 以XMLDocument对象方式返回响应来验证金山通行证帐号是否存在

  在上面的例子中,当服务器对HTTP请求的响应被收到后,我们会调用请求对象的reponseText属性。该属性包含了服务器返回响应文件的内容。现在我们以XMLDocument对象方式返回响应,此时将不再需要reponseText属性而使用responseXML属性。

  首先登陆金山通行证注册页面,我们发现金山通行证用户名的检测方式为:

  pass.kingsoft.com/ksgweb/jsp/login/uid.jsp?uid=用户名,并且返回XML数据:

<?xml version="1.0" 
encoding="UTF-8" 
standalone="yes" ?> 
<response>
<method>isExistedUid</method> 
<result>-2</result> 
</response>

  当result值为-1时表示此用户名已被注册,当result值为-2时表示此用户名尚未注册,因此通过对result值的判断可以知道用户名是否被注册。

  对上例代码进行修改:

  首先找到

document.getElementById('message').innerHTML = 
xmlhttp_request.responseText;

  改为:

var response = xmlhttp_request.
responseXML.documentElement;
var result = response.getElementsByTagName
('result')[0].firstChild.data;
//返回result节点数据
if(result ==-2){
document.getElementById
('message').innerHTML =
"用户名"+document.getElementById
('163id').value+"尚未注册";
}
else if(result ==-1){
document.getElementById
('message').innerHTML = 
"对不起,用户名"+document.getElementById
('163id').value+"已经注册";
}

  通过以上两个实例说明了AJAX的客户端基础应用,采用的是网易和金山现成的服务器端程序,当然为了开发合适自己页面的程序,还需要对自己编写服务器端程序,这设计到程序语言及数据库的操作,对于有一定程序基础的读者一定不是很难的事情。


[Web开发]AJAX来判断dedecms用户是否登录  [网页制作]新手解读:认识XML,AJAX,SNS,Tag
[网页制作]从GMail认识的W3C网页标准和Ajax  [Web开发]利用PHP+JavaScript打造AJAX搜索窗
[Web开发]基于AJAX技术提高搜索引擎排名  [Web开发]XMLHTTP异步获取返回值的代码超时测试(AJAX)
[Web开发]整理Web开发-Ajax社区中有关Ajax的资料  [Web开发]【编程】Web 交互 - AJAX 不是什么新技术
[Web开发]掌握 Ajax,第 1 部分: Ajax 简介  [Web开发]Backbase框架:专业级AJAX开发框架
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台