百独托管7500 紫田网络超高转化播放器收cps[推荐]速盾CDN 免实名免备防屏蔽阿里云 爆款特卖9.9元封顶提升alexa、IP流量7Q5团队
【腾讯云】中小企福利专场【腾讯云】多款产品1折起高防 随时退换 好耶数据小飞国外网赚带你月入万元炎黄网络4H4G10M 99每月
香港带宽CN2/美国站群优惠中客数据中心 服务器租用联盟系统移动广告平台 中易企业专场腾讯云服务器2.5折九九数据 工信部正规资质
腾讯云新用户大礼包代金券高价收cpa注册量高价展示【腾讯云】2核2G/9.93起租服务器找45互联 随时退换阿里云 短信服务 验证秒达

[其它内容] 手把手教你用ajax搭建页面[12/10 添加演示及实例代码下载] [复制链接]
查看:13639 | 回复:19

头像被屏蔽

0

主题

22

帖子

142

积分

落伍者(一心一意)

Rank: 1

贡献
8
鲜花
0
注册时间
2005-1-14
发表于 2005-12-9 17:54:05 | |阅读模式 来自 中国广东中山
Author: tony         tonyhl[at]126.com
转载请著名作者及版权
(那个什么什么狐狸的,堂而皇之的将我的一个小程序改个名字就成了自己的,实在是)


演示: http://www.goldenleaftool.com.cn/tony/demo/ajax/reg/
实例下载: http://www.goldenleaftool.com.cn/tony/demo/ajax/reg/reg.rar

上次随手写了个结合ajax的alexa查询
很多落伍的朋友PM我怎样使用ajax搭建无刷新页面,很不好意思,直到今天才有空写一些我使用ajax的心得

一.什么是ajax? (我说了N次,不是那个阿贾克斯 足球俱乐部)
本人表达能力有限,大家可以自己google一下,在这里我只说下ajax的概况
ajax = asynchronous + javascript + xml = 同步传输数据 + javascrip处理返回XML数据

实际上,几年前ajax这个技术就应用于互联网上,但因思维的禁锢,一直在ajax的"X", 即处理返回XML数据上打转.
只至伟大的梦想家GOOGLE将其应用于GMAIL及GMAP上,告知世人AJAX也可以玩的这么COOL, 这种老技术才被大家重新所重视.

二.为什么要用ajax
  富客户端已经成为网站以及基于网站的程序发展的必然(什么是富客户端?自己google),要构建一个富客户端的程序,必须满足以下条件:
1. 用户定制服务(实例: www.live.com)
2.无需等待(实例:Gmail)
3.桌面化界面(实例:www.backbase.com)

OK,再来讲讲ajax能实现的功能:
1.采用XMLHttpRequest实现后台数据提交,客户端无刷新(此功能满足富客户端要求2)
2.返回数据能完美与CSS结合,实现丰富界面(此功能满足富客户端要求3)
3.采用javascript脚本实时控制当前浏览界面(此功能满足富客户端要求1)
4.兼容绝大部分浏览器,只要你的浏览器支持JAVASCRIP,支持XMLHttpRequest
5.丰富的自定义扩展(请允许我叫他API吧),能用于FLASH,能用于ASP,能用于PHP.能用于......

综上,ajax的使用无疑能大大完善客户端与服务器端的交流与沟通,较完美处理客户端指令,试想,当你跟客户沟通已经达致完美,还有什么生意谈不成呢?

三. ajax原理
请允许我采用这张已经广为流传的图片作为ajax原理的展示,虽然他还不够完全表达,但已经是目前最直观最完美的展示了




四.实例告诉你怎么用ajax
精彩部分开始了!

实例1: 注册模块

假如我要构造一个会员注册页面,传统的方法是客户端填写注册内容,然后交给服务器端处理,然后返回注册结果
假设我注册一个ID为 tony的会员,而数据库中已经存在这个ID,整个流程将是这样的:
1. 客户填写注册表单(当然,你可以加入javascript已检测客户端填写表单是否正确),并表明要求注册的ID为tony
2.发送表单至处理页面(客户端刷新一次,并等待)
3.服务器端处理表单,检测tony这一ID已经注册,返回"ID已注册信息"(视程序而定,客户端刷新一次或不刷新)
4.重新跳转至注册页面(客户端再刷新一次)

OMG, 这最少要刷新2次,还得要我等上半分钟,如果不是很重要,我情愿不注册了!
不刷新? 不等待? 让ajax来帮你吧

Step1:
已存在数据库
会员表单 member

ID   登陆ID
Password 登陆密码
其中已经有一行 ID为  tony   的数据

Step2:
构造注册表单  reg.html

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title>注册</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. </head>
  7. <body>
  8. <div id="msg"></div>
  9. ID: <input type="text" id="regid" /><br />
  10. Password: <input type="password" id="regpassword" /><br />
  11. <input type="submit" id="regsubmit" />
  12. </body>
  13. </html>
复制代码


Step3:
XmlHTTPrequest调用 javascript       ajax.js

  1. //功能: 根据浏览器调用支持的XMLHTTPREQUEST
  2. // IE support
  3. if (window.ActiveXObject && !window.XMLHttpRequest)
  4. {
  5.         window.XMLHttpRequest = function()
  6.                 {
  7.                         var msxmls = new Array('Msxml2.XMLHTTP.5.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0','Msxml2.XMLHTTP','Microsoft.XMLHTTP');
  8.                         for (var i = 0; i < msxmls.length; i++)
  9.                         {
  10.                                 try
  11.                                 {
  12.                                         return new ActiveXObject(msxmls[i]);
  13.                                 }
  14.                                 catch (e)
  15.                                 {
  16.                                 }
  17.                         }
  18.                         return null;
  19.                 };
  20. }

  21. // Gecko support
  22. /* ;-) */
  23. // Opera support
  24. if (window.opera && !window.XMLHttpRequest)
  25. {
  26.         window.XMLHttpRequest = function()
  27.         {
  28.                 this.readyState = 0; // 0=uninitialized,1=loading,2=loaded,3=interactive,4=complete
  29.                 this.status = 0; // HTTP status codes
  30.                 this.statusText = '';
  31.                 this._headers = [];
  32.                 this._aborted = false;
  33.                 this._async = true;
  34.                 this._defaultCharset = 'ISO-8859-1';
  35.                 this._getCharset = function()
  36.                 {
  37.                         var charset = _defaultCharset;
  38.                         var contentType = this.getResponseHeader('Content-type').toUpperCase();
  39.                         val = contentType.indexOf('CHARSET=');
  40.                         if (val != -1)
  41.                         {
  42.                                 charset = contentType.substring(val);
  43.                         }
  44.                         val = charset.indexOf(';');
  45.                         if (val != -1)
  46.                         {
  47.                                 charset = charset.substring(0, val);
  48.                         }
  49.                         val = charset.indexOf(',');
  50.                         if (val != -1)
  51.                         {
  52.                                 charset = charset.substring(0, val);
  53.                         }
  54.                         return charset;
  55.                 };

  56.                 this.abort = function()
  57.                 {
  58.                         this._aborted = true;
  59.                 };
  60.                
  61.                 this.getAllResponseHeaders = function()
  62.                 {
  63.                         return this.getAllResponseHeader('*');
  64.                 };
  65.                
  66.                 this.getAllResponseHeader = function(header)
  67.                 {
  68.                         var ret = '';
  69.                         for (var i = 0; i < this._headers.length; i++)
  70.                         {
  71.                                 if (header == '*' || this._headers[i].h == header)
  72.                                 {
  73.                                         ret += this._headers[i].h + ': ' + this._headers[i].v + '\n';
  74.                                 }
  75.                         }
  76.                         return ret;
  77.                 };
  78.                
  79.                 this.getResponseHeader = function(header)
  80.                 {
  81.                         var ret = getAllResponseHeader(header);
  82.                         var i = ret.indexOf('\n');
  83.                         if (i != -1)
  84.                         {
  85.                                 ret = ret.substring(0, i);
  86.                         }
  87.                         return ret;
  88.                 };
  89.                
  90.                 this.setRequestHeader = function(header, value)
  91.                 {
  92.                         this._headers[this._headers.length] = {h:header, v:value};
  93.                 };

  94.                 this.open = function(method, url, async, user, password)
  95.                 {
  96.                         this.method = method;
  97.                         this.url = url;
  98.                         this._async = true;
  99.                         this._aborted = false;
  100.                         this._headers = [];
  101.                         if (arguments.length >= 3)
  102.                         {
  103.                                 this._async = async;
  104.                         }
  105.                         if (arguments.length > 3)
  106.                         {
  107.                                 opera.postError('XMLHttpRequest.open() - user/password not supported');
  108.                         }
  109.                         this.readyState = 1;
  110.                         if (this.onreadystatechange)
  111.                         {
  112.                                 this.onreadystatechange();
  113.                         }
  114.                 };
  115.                
  116.                 this.send = function(data)
  117.                 {
  118.                         if (!navigator.javaEnabled())
  119.                         {
  120.                                 alert("XMLHttpRequest.send() - Java must be installed and enabled.");
  121.                                 return;
  122.                         }
  123.                         if (this._async)
  124.                         {
  125.                                 setTimeout(this._sendasync, 0, this, data);
  126.                         }
  127.                         else
  128.                         {
  129.                                 this._sendsync(data);
  130.                         }
  131.                 };
  132.                
  133.                 this._sendasync = function(req, data)
  134.                 {
  135.                         if (!req._aborted)
  136.                         {
  137.                                 req._sendsync(data);
  138.                         }
  139.                 };
  140.                
  141.                 this._sendsync = function(data)
  142.                 {
  143.                         this.readyState = 2;
  144.                         if (this.onreadystatechange)
  145.                         {
  146.                                 this.onreadystatechange();
  147.                         }
  148.                         var url = new java.net.URL(new java.net.URL(window.location.href), this.url);
  149.                         var conn = url.openConnection();
  150.                         for (var i = 0; i < this._headers.length; i++)
  151.                         {
  152.                                 conn.setRequestProperty(this._headers[i].h, this._headers[i].v);
  153.                         }
  154.                         this._headers = [];
  155.                         if (this.method == 'POST')
  156.                         {
  157.                         // POST data
  158.                                 conn.setDoOutput(true);
  159.                                 var wr = new java.io.OutputStreamWriter(conn.getOutputStream(), this._getCharset());
  160.                                 wr.write(data);
  161.                                 wr.flush();
  162.                                 wr.close();
  163.                         }
  164.                         // read response headers
  165.                         // NOTE: the getHeaderField() methods always return nulls for me :(
  166.                         var gotContentEncoding = false;
  167.                         var gotContentLength = false;
  168.                         var gotContentType = false;
  169.                         var gotDate = false;
  170.                         var gotExpiration = false;
  171.                         var gotLastModified = false;
  172.                         for (var i = 0; ; i++)
  173.                         {
  174.                                 var hdrName = conn.getHeaderFieldKey(i);
  175.                                 var hdrValue = conn.getHeaderField(i);
  176.                                 if (hdrName == null && hdrValue == null)
  177.                                 {
  178.                                         break;
  179.                                 }
  180.                                 if (hdrName != null)
  181.                                 {
  182.                                         this._headers[this._headers.length] = {h:hdrName, v:hdrValue};
  183.                                         switch (hdrName.toLowerCase())
  184.                                         {
  185.                                                 case 'content-encoding': gotContentEncoding = true; break;
  186.                                                 case 'content-length' : gotContentLength = true; break;
  187.                                                 case 'content-type' : gotContentType = true; break;
  188.                                                 case 'date' : gotDate = true; break;
  189.                                                 case 'expires' : gotExpiration = true; break;
  190.                                                 case 'last-modified' : gotLastModified = true; break;
  191.                                         }
  192.                                 }
  193.                         }
  194.                         // try to fill in any missing header information
  195.                         var val;
  196.                         val = conn.getContentEncoding();
  197.                         if (val != null && !gotContentEncoding) this._headers[this._headers.length] = {h:'Content-encoding', v:val};
  198.                         val = conn.getContentLength();
  199.                         if (val != -1 && !gotContentLength) this._headers[this._headers.length] = {h:'Content-length', v:val};
  200.                         val = conn.getContentType();
  201.                         if (val != null && !gotContentType) this._headers[this._headers.length] = {h:'Content-type', v:val};
  202.                         val = conn.getDate();
  203.                         if (val != 0 && !gotDate) this._headers[this._headers.length] = {h:'Date', v:(new Date(val)).toUTCString()};
  204.                         val = conn.getExpiration();
  205.                         if (val != 0 && !gotExpiration) this._headers[this._headers.length] = {h:'Expires', v:(new Date(val)).toUTCString()};
  206.                         val = conn.getLastModified();
  207.                         if (val != 0 && !gotLastModified) this._headers[this._headers.length] = {h:'Last-modified', v:(new Date(val)).toUTCString()};
  208.                         // read response data
  209.                         var reqdata = '';
  210.                         var stream = conn.getInputStream();
  211.                         if (stream)
  212.                         {
  213.                                 var reader = new java.io.BufferedReader(new java.io.InputStreamReader(stream, this._getCharset()));
  214.                                 var line;
  215.                                 while ((line = reader.readLine()) != null)
  216.                                 {
  217.                                         if (this.readyState == 2)
  218.                                         {
  219.                                                 this.readyState = 3;
  220.                                                 if (this.onreadystatechange)
  221.                                                 {
  222.                                                         this.onreadystatechange();
  223.                                                 }
  224.                                         }
  225.                                         reqdata += line + '\n';
  226.                                 }
  227.                                 reader.close();
  228.                                 this.status = 200;
  229.                                 this.statusText = 'OK';
  230.                                 this.responseText = reqdata;
  231.                                 this.readyState = 4;
  232.                                 if (this.onreadystatechange)
  233.                                 {
  234.                                         this.onreadystatechange();
  235.                                 }
  236.                                 if (this.onload)
  237.                                 {
  238.                                         this.onload();
  239.                                 }
  240.                         }
  241.                         else
  242.                         {
  243.                                 // error
  244.                                 this.status = 404;
  245.                                 this.statusText = 'Not Found';
  246.                                 this.responseText = '';
  247.                                 this.readyState = 4;
  248.                                 if (this.onreadystatechange)
  249.                                 {
  250.                                         this.onreadystatechange();
  251.                                 }
  252.                                 if (this.onerror)
  253.                                 {
  254.                                         this.onerror();
  255.                                 }
  256.                         }
  257.                 };
  258.         };
  259. }

  260. // ActiveXObject emulation
  261. if (!window.ActiveXObject && window.XMLHttpRequest)
  262. {
  263.         window.ActiveXObject = function(type)
  264.         {
  265.                 switch (type.toLowerCase())
  266.                 {
  267.                         case 'microsoft.xmlhttp':
  268.                                 case 'msxml2.xmlhttp':
  269.                                 case 'msxml2.xmlhttp.3.0':
  270.                                 case 'msxml2.xmlhttp.4.0':
  271.                                 case 'msxml2.xmlhttp.5.0':
  272.                                 return new XMLHttpRequest();
  273.                 }
  274.                 return null;
  275.         };
  276. }
  277. //上述代码也是网上广为流传的,请允许我调用,虽然我不知道原作者是谁:P
复制代码


Step4:
构造表单处理及提交javascript脚本 reg.js

  1. //获取页面指定ID公用函数
  2. function GE(a){return document.getElementById(a);}
  3. //表单检测
  4. function Check(){
  5. //检测ID是否为空
  6. if(GE('regid').value==''){GE('msg').innerHTML='ID不能为空';return false}
  7. //检测PASSWORD是否为空
  8. if(GE('regpassword').value==''){GE('msg').innerHTML='password 不能为空';return false}
  9. //检测OK后提交数据

  10. //建立XMLHttpRequest对象
  11. var X=new XMLHttpRequest();
  12. //检测浏览器是否支持XMLHttpRequest
  13. if(X){
  14. //禁止客户端再次提交表单
  15.         GE('regsubmit').disabled=true;
  16. //onreadystatechange为XMLHttpRequest的状态改变的事件触发器
  17.                 X.onreadystatechange=function(){

  18. //readyState 对象状态
  19. //0 = 未初始化
  20. //1 = 读取中
  21. //2 = 已读取
  22. //3 = 交互中
  23. //4 = 完成
  24.                         if(X.readyState==4){
  25. //交互完成的处理
  26. //status,服务器返回的状态码, 200为成功
  27.                                 if(X.status==200){
  28. //运行服务器返回的脚本
  29.                                 eval(X.responseText)
  30.                                 }
  31. //服务器端程序运行失败,返回错误代码
  32.                                 else{GE('msg').innerHTML=X.statusText}
  33.                         }
  34.                 };
  35. //获取服务器端数据
  36. //open("method","URL"[,asyncFlag])
  37. //请求的目标 URL, 方法
  38. //采用POST为提交数据
  39. //采用true为异步传输, false为同步传输

  40.                 X.open('POST','reg.asp',true);
  41.                 X.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  42.                 var SendData = 'regid='+GE('regid').value+'&regpassword='+GE('regpassword').value
  43.                 X.send(SendData)
  44.         }
  45.         //不支持的话返回错误提示
  46.         else{
  47.                 GE('msg').innerHTML='你的浏览器不支持XMLHttpRequest'
  48.         }
  49. }
复制代码


Step5:
OK,客户端页面全部完成, 重新调整下reg.html

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title>注册</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <script type="text/javascript" src="ajax.js"></script>
  7. <script type="text/javascript" src="reg.js"></script>
  8. </head>
  9. <body>
  10. <div id="msg"></div>
  11. ID: <input type="text" id="regid" /><br />
  12. Password: <input type="password" id="regpassword" /><br />
  13. <input type="submit" id="regsubmit" onclick="Check()" />
  14. </body>
  15. </html>
复制代码


Step6:
构造服务器端程序 reg.asp

  1. <%
  2. dim regid, regpassword, str
  3. regid=Request.Form("regid")
  4. regpassword=Request.Form("regpassword")
  5. if regid="" or regpassword="" then
  6.         str = "ID和PASSWORD必须填写"
  7. else
  8.         '查询数据库是否存在该ID
  9.         '代码略
  10.         if rs.EOF then
  11.         '不存在则添加数据
  12.         '代码略
  13.                 str = "注册成功,ID为" & regid & " , 密码为" & regpassword
  14.         else
  15.                 str = "注册失败,ID已经存在"
  16.         end if
  17.         Set rs = nothing
  18. End if
  19. Response.Write "GE('msg').innerHTML='" & str & "';GE('regsubmit').disabled=false"
  20. Response.End
  21. %>
复制代码


至此,一个简单的注册页面 已经打造成功. 当然,你可以添加更多的代码(比如添加表单内容,扩充表单检测脚本,提高后台程序安全性等)以提高程序实用性

上述代码及实例实现了一个简单的ajax过程.
或许,这不能叫ajax,只能叫aja, 因为它没有实现xml数据处理. 但是,能实现ajax的特色功能,能使客户端更满意,更人性化,这样用法又何尝不可? Google不就是这么用的吗

后续:

这篇文章只是介绍了ajax这个古老而新潮的技术的一点皮毛.更多的认识和运用,还需要自己在编写程序中不断去学习和体会. 下次有时间,我会再写一篇较复杂,涉及到xml数据处理的关于ajax应用的文章跟大家分享

P.S.
所谓的语言,所谓的技术,不过是我们用来实现程序功能,改善程序性能和实用性的工具.
所以,频繁的谈论甚至争论哪种语言,哪种技术更好,更新是很肤浅的一件事情. AJAX不就是最好的例子吗?
通彻了解一种语言,一门技术并拿来为我所用,才是我们真正应该花时间做的事情


[ 本帖最后由 tonycc 于 2005-12-10 04:03 编辑 ]

0

主题

1262

帖子

1252

积分

落伍者(两全齐美)

Rank: 2

贡献
19
鲜花
0
注册时间
2004-4-14
发表于 2005-12-9 18:07:07 | 来自 中国福建福州
支持,顶一下

233

主题

4万

帖子

25万

积分

名誉斑竹

Rank: 8Rank: 8

贡献
3983
鲜花
636
注册时间
2004-3-28

落伍热心人QQ绑定落伍者落伍微信绑定落伍手机绑定

发表于 2005-12-9 20:27:05 | 来自 中国浙江绍兴
学习中
绍兴人买车、爱车、玩车就上www.car0575.com
头像被屏蔽

16

主题

523

帖子

494

积分

落伍者(一心一意)

Cp

Rank: 1

贡献
48
鲜花
3
注册时间
2005-1-13
发表于 2005-12-10 01:45:56 | 来自 中国湖北武汉
没调试成功
签名被屏蔽

37

主题

6956

帖子

7293

积分

落伍者(三羊开泰)

李锐

Rank: 3Rank: 3

贡献
412
鲜花
0
注册时间
2002-7-8

QQ绑定落伍手机绑定

发表于 2005-12-10 10:27:39 | 来自 中国北京
一定要支持!

3

主题

3877

帖子

4105

积分

落伍者(两全齐美)

i3t.net

Rank: 2

贡献
297
鲜花
0
注册时间
2004-3-28

QQ绑定

发表于 2005-12-10 13:09:47 | 来自 中国江苏南京
原帖由 gooday 于 2005-12-10 01:45 发表
没调试成功



下次详细请教
SAP FICO

5

主题

214

帖子

493

积分

落伍者(一心一意)

小厮

Rank: 1

贡献
421
鲜花
0
注册时间
2005-1-20
发表于 2005-12-14 10:49:44 | 来自 中国江苏镇江
我顶,收藏+研究!
头像被屏蔽

0

主题

477

帖子

534

积分

落伍者(一心一意)

Rank: 1

贡献
233
鲜花
0
注册时间
2004-11-19
发表于 2005-12-14 11:51:50 | 来自 LAN
asynchronous好象是异步的吧
头像被屏蔽

0

主题

825

帖子

918

积分

保护或锁定(状态异常,请联系客服)

贡献
1
鲜花
0
注册时间
2001-7-8
发表于 2005-12-14 12:17:13 | 来自 中国湖北咸宁
强烈支持这种技术贴,虽然还没完全懂。。。。。
签名被屏蔽
头像被屏蔽

4

主题

743

帖子

1829

积分

落伍者(两全齐美)

Rank: 2

贡献
721
鲜花
0
注册时间
2005-9-24
发表于 2005-12-14 14:37:54 | 来自 中国天津
好文章
签名被屏蔽
论坛客服/商务合作/投诉举报:2171544 (QQ)
落伍者创建于2001/03/14,本站内容均为会员发表,并不代表落伍立场!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
落伍官方微信:2030286 邮箱:(djfsys@gmail.com|tech@im286.com)
© 2001-2014

浙公网安备 33060302000191号

浙ICP备11034705号 BBS专项电子公告通信管[2010]226号

  落伍法律顾问: ITlaw-庄毅雄

手机版|找回帐号|不能发帖?|Archiver|落伍者

GMT+8, 2024-6-16 09:54 , Processed in 0.124134 second(s), 38 queries , Gzip On.

返回顶部