引言
时代在进步我们也要跟着往前跑啊,以前的文章大部分都是在论述C/S很重要,而且对于程序员来说C/S是基础,但是在如今信息革命时代,网络大行其道只懂C/S是远远不够的,还要精通B/S,接下来的文章就要开始论述B/S技术了。那就从AJAX开始吧。
一、B/S+AJAX
1.1 B/S综述
对于HTML、XML、CSS、Javascript应该都不陌生,它们都是B/S的编程语言,在开发浏览器应用程序时这几种语言必不可少,CSS的出现使得我们的网页布局独立于网页本身,能更方便的开发网页UI。对于Javascript它是一种动态的网页脚本语言,提供了更好的动态网页程序的开发,能够制作出很漂亮的网页效果,另外它的处理是在Browser端减少了Browser和服务器的交互,这也是它优于asp.net的地方。
Note:有关HTML和XML的内容请查看笔者的前篇博客。上面系统了解了B/S应用程序中的几种编程语言,但对于AJAX却没有说明。可能对于没有接触过AJAX的童鞋来说,它可能是一种很困难、很尖端的技术(至少对于以前的我来说是这样的),但通过了解后发现AJAX很简单,因为它基本上类似于JQuery是一种Web应用程序的技术。
1.2 AJAX概述
AJAX= 异步 JavaScript 及 XMLAJAX 全称是Asynchronous JavaScript And XML,它是指异步 JavaScript 及 XML,它不是一种新的编程语言,而是一种创建更好更快、交互性更强的Web技术。使用XMLHttpRequest对象来直接与服务器进行通信,使得JavaScript可在不重载页面的情况下与 Web 服务器交换数据。
表1 AJAX的应用情况
应 用 情 况 |
说 明 |
基于表单的简单用户交互 |
如用户注册验证、数据格式验证等。如果采取整页回发(PostBack)到服务器做法,不仅传输数据量大、服务器负担重、响应时间长,而且会导致用户体验很差。在验证结束后,由于某些数据错误返回注册页面时,先前输入的数据都已不存在了,必须重新填写。而采用Ajax技术后,这些任务在用户填写其他信息时,已有XMLHTTPRequest对象异步完成,极大地改善用户操作体验 |
时时更新的页面信息 |
如聊天室信息、在线统计、股票的涨跌等。这类系统都需要实时地反映数据的变化。采用Ajax技术能定时异步访问服务器,可以获得最新信息并将其显示给用户,而且可以避免整个页面的刷新 |
菜单导航 |
如多级联动菜单、树状导航等。可以采用Ajax技术来实现按需读取数据的功能,这可以避免每次变动都需要整页回发(PostBack)到服务器,从而节省带宽资源,提高响应速度,也减少显示所有数据时所要消耗的带宽资源 |
评论、选择投票 |
这几种情况传输的数据量非常小,因而没有必要将整个页面回发(PostBack)到服务器。采用Ajax技术,用户在执行完相关操作后,将异步与服务器进行自动交互,而用户同时可以继续执行其他操作 |
二、AJAX运行机制
图2 Ajax Web应用程序的模型
(1)用户在Web页面上执行了某个操作,如单击某个链接,或进行某项选择等。
(2)根据用户的操作,页面产生相应的DHTML事件。
(3)调用注册到该DHTML事件的客户端JavaScript事件处理函数。其中需要创建并初始化一个用以向服务器发送异步请求的XMLHttpRequest对象,同时指定一个回调函数。当服务器端的响应返回时,将自动调用该回调函数。
(4)服务器收到XMLHttpRequest对象的请求之后,根据请求进行一系列的处理。
(5)处理完毕,服务器端向客户端返回所需要的数据。
(6)数据到达客户端之后,执行JavaScript回调函数,并根据返回的数据对用户显示界面进行更新。
(7)用户获得自己操作所需的数据,即为看到显示界面的变化。
三、XMLHttpRequest对象
XMLHttpRequest 对象,使得web 开发者可以做到在页面已加载后从服务器更新页面!
XMLHttpRequest 对象,是AJAX的重点,它封装了DOM对象的基本操作方法和属性,另外不同的浏览器创建 XMLHttpRequest 对象的方法是有差异的,对于IE 浏览器使用 ActiveXObject,而其他的浏览器使用名为 XMLHttpRequest 的 JavaScript 内建对象。所以在使用AJAX时首先必须要做的是判断浏览器的类型,代码如下:
<html> <head> <title>AJAX的多浏览器支持示例</title> </head> <body> <script type="text/javascript"> //验证浏览器的类型,根据浏览器的类型创建XMLHttpRequest对象 function ajaxFunction(){ var xmlHttp; //****************************************************************************** //方法一:使用try-catch的方法判断是否支持AJAX try{ xmlHttp=new XMLHttpRequest(); }catch(e){ try{ xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ alert("您的浏览器不支持AJAX!"); return false; } } } //****************************************************************************** //****************************************************************************** //方法二:使用if-else的方法判断是否支持AJAX if(window.ActiveXObject){ //IE浏览器 }if (window.ActiveXObject) { //针对IE6,IE5.5,IE5 //两个可以用于创建XMLHTTPRequest对象的控件名称,保存在一个js的数组中 //排在前面的版本较新 var activexName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"]; for (var i = 0; i < activexName.length; i++) { try{ //取出一个控件名进行创建,如果创建成功就终止循环 //如果创建失败,回抛出异常,然后可以继续循环,继续尝试创建 xmlhttp = new ActiveXObject(activexName[i]); break; } catch(e){ } } } //****************************************************************************** } </script> </body> </html>
XMLHttpRequest使用的基本步骤:
(1)建立XMLHttpRequest对象(2)注册回调函数
(3)使用open方法设置和服务器端交互的基本信息
(4)设置发送的数据,开始和服务器端交互
(5)在回调函数中判断交互是否结束,相应是否正确,并根据需要获取服务器端返回的数据,更新页面代码。
//用户名校验的方法 //这个方法将使用XMLHTTPRequest对象来进行AJAX的异步数据交互 var xmlhttp; function verify() { //0。使用dom的方式获取文本框中的值 //document.getElementById("userName")是dom中获取元素节点的一种方法,一个元素节点对应HTML页面中的一个标签,如果<input> //。value可以获取一个元素节点的value属性值 var userName = document.getElementById("userName").value; //1.创建XMLHttpRequest对象 //这是XMLHttpReuquest对象五部使用中最复杂的一步 //需要针对IE和其他类型的浏览器建立这个对象的不同方式写不同的代码 if (window.XMLHttpRequest) { //针对FireFox,Mozillar,Opera,Safari,IE7,IE8 xmlhttp = new XMLHttpRequest(); //针对某些特定版本的mozillar浏览器的BUG进行修正 if (xmlhttp.overrideMimeType) { xmlhttp.overrideMimeType("text/xml"); } } else if (window.ActiveXObject) { //针对IE6,IE5.5,IE5 //两个可以用于创建XMLHTTPRequest对象的控件名称,保存在一个js的数组中 //排在前面的版本较新 var activexName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"]; for (var i = 0; i < activexName.length; i++) { try{ //取出一个控件名进行创建,如果创建成功就终止循环 //如果创建失败,回抛出异常,然后可以继续循环,继续尝试创建 xmlhttp = new ActiveXObject(activexName[i]); break; } catch(e){ } } } //确认XMLHTtpRequest对象创建成功 if (!xmlhttp) { alert("XMLHttpRequest对象创建失败!!"); return; } else { alert(xmlhttp.readyState); } //2.注册回调函数 //注册回调函数时,只需要函数名,不要加括号 //我们需要将函数名注册,如果加上括号,就会把函数的返回值注册上,这是错误的 xmlhttp.onreadystatechange = callback; //3。设置连接信息 //第一个参数表示http的请求方式,支持所有http的请求方式,主要使用get和post //第二个参数表示请求的url地址,get方式请求的参数也在url中 //第三个参数表示采用异步还是同步方式交互,true表示异步 xmlhttp.open("GET",url,true); //POST方式请求的代码 //xmlhttp.open("POST","AJAXServer",true); //POST方式需要自己设置http的请求头 //xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //POST方式发送数据 //xmlhttp.send("name=" + userName); //4.发送数据,开始和服务器端进行交互 //同步方式下,send这句话会在服务器段数据回来后才执行完 //异步方式下,send这句话会立即完成执行 xmlhttp.send(null); } //回调函数 function callback() { //alert(xmlhttp.readyState); //5。接收响应数据 //判断对象的状态是交互完成 if (xmlhttp.readyState == 4) { //判断http的交互是否成功 if (xmlhttp.status == 200) { //获取服务漆器端返回的数据 //获取服务器段输出的纯文本数据 var responseText = xmlhttp.responseText; //将数据显示在页面上 //通过dom的方式找到div标签所对应的元素节点 var divNode = document.getElementById("result"); //设置元素节点中的html内容 divNode.innerHTML = responseText; } else { alert("出错了!!!"); } } }
上面的代码示例演示类XMLHttpRequest在使用过程中需要执行的五个步骤,其中最困难的是XMLhttpRequest的创建,不同的浏览器在创建该对象时会有所差异,另外还有设置连接信息,有GET和POST两种方式,两种创建方式有很大的区别。有关XMLHttpRequest的API说明请下载:XMLHttpRequest方法和属性API。
三、Ajax示例
编写了一个注册的案例,使用的是Ajax进行用户信息的验证。该案例通过对会员昵称(用户名)进行验证,即根据该用户名是否已经被使用,在不进行页面刷新的情况下给出相应的提示信息。如下图为注册页面的UI界面:
完整的代码示例请下载:AJAX登陆示例。
会员注册页面:Default.aspx,使用的是基本的HTML控件,在昵称后面放置了一个<span>标签用来提示用户输入的信息是否合法,其中交互过程使用的是AJAX来实现。
<form id="form1" runat="server"> <script language="javascript" src="Scripts/tool.js"></script> <div> <h2>会员注册</h2> </div> <div> <asp:Panel ID="Panel1" runat="server"> <div> 完成下面的注册,即可成为我们的会员 </div> </asp:Panel> <div> 昵 称:<input id="iUserName" type="text" onblur="userCheck()" style=" height:20px; width:200px;"/> <span id="showmsgform"></span><br /> 邮 箱:<input id="Text1" type="text" style=" height:20px; width:200px;"/> <br /> 密 码:<input id="Text2" type="text" style=" height:20px; width:200px;"/> <br /> <input id="btnSubmit" type="submit" value="确 定" /> <input id="btnCancel" type="submit" value="取 消" /> </div> </div> </form>
Tool.js,内部Ajax代码的执行过程。userCheck方法用来验证数据用户的用户名,如果不为空将调用AJAX代码向checkUserName.aspx页面传递用户名参数,并在checkUserName.aspx查询数据库中的用户名来验证输入的用户名是否正确。
//检查用户是否存在 function userCheck() { //获取用户输入的用户名 var username = document.getElementById("iUserName").value; //判断用户名是否输入,如果用户名为空将显示提示语句 if (username == "") { //显示提示语句 document.getElementById("showmsgform").innerHTML = "<font color=‘Red‘>会员昵称不能为空</font>"; //用户名框重新获得焦点 document.getElementById("iUserName").focus(); return false; } else { send_request(‘checkUserName.aspx?username=‘ + username + ‘&r=‘ + Math.random()); } } //向服务器发送请求函数 var http_request = false; function send_request(url) { //初始化,指定处理函数,发送请求的函数 http_request = false; //开始初始化XMLHttpRequest对象 if (window.XMLHttpRequest) { //非IE浏览器 http_request = new XMLHttpRequest(); } else if (window.ActiveXObject) { //IE浏览器 try{ http_request=new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } //判断http_request是否创建成功 if (!http_request) { alert("该浏览器不支持AJAX!"); return false; } //注册回调函数 http_request.onreadystatechange = processRequest; //设置连接信息 //第一个参数表示http的请求方式,支持所有http的请求方式,主要使用get和post //第二个参数表示请求的url地址,get方式请求的参数也在url中 //第三个参数表示采用异步还是同步方式交互,true表示异步 http_request.open("GET", url, true); //发送数据,开始和服务器端进行交互 http_request.send(null); } //处理返回信息的函数processRequest() function processRequest() { if (http_request.readyState==4) { // 判断对象状态 if (http_request.status == 200) { // 信息已经成功返回,开始处理信息 var str = http_request.responseText; showMsg(str); } else { //页面不正常 alert("您所请求的页面有异常."); } } } //根据返回结果,显示信息 function showMsg(str) { if(str == "1") { document.getElementById("showmsgform").innerHTML = " <font color=‘Red‘>昵称可以使用!</font> "; } else if(str == "2") { document.getElementById("showmsgform").innerHTML = "<font color=‘Red‘>会员昵称已存在!</font>"; } else if(str == "3") { document.getElementById("showmsgform").innerHTML = "<font color=‘Red‘>会员昵称不能为空!</font>"; } }
结语
有关AJAX基础部分的内容已经讨论完成,从B/S到AJAX再到AJAX运行机制的解析,系统的了解了B/S架构的内容以及AJAX技术的便利性。其次对XMLHttpRequest对象进行了大致的应用解析,该对象是AJAX应用的基础,封装了页面的基本信息,最后通过示例来加深联系。说到这里有关AJAX的内容还没有完结,下篇博客让我们来看看AJAX是如何操作DOM对象的。