在w3school()上面看到一个关于异步传输的例子,在服务器端其用asp和php两种方式实现了该传输,在这里我将服务器端程序改装一下使用ejs完成相同功能。 说到web异步传输不得不提到XMLHttpRequest对象,它是所有异步传输的基础。如:ajax;XMLHttpRequest用于在后台与服务器交换数据。
主要的功能:
1、在不重新加载页面的情况下更新网页;
2、在页面已加载后从服务器请求数据;
3、在页面已加载后从服务器接收数据;
4、在后台向服务器发送数据;
创建方式:
- var xmlhttp;
- if (window.XMLHttpRequest)
- {// code for IE7+, Firefox, Chrome, Opera, Safari
- xmlhttp=new XMLHttpRequest();
- }
- else
- {// code for IE6, IE5
- xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
- }
发送请求:- open(method,url,async) 规定请求的类型、URL 以及是否异步处理请求
参数:
1、method:请求的类型;GET或者POST;
2、url:文件在服务器上的位置;
3、async:true(异步)或者false(同步)
参数string:用于POST请求;
服务器端响应:
- responseText 获得字符串形式的响应数据。
- respon***ML 获得 XML 形式的响应数据。
onreadystatechange事件:
当请求发送到服务器的时候,就会去响应一下任务。
每当 readyState 改变时,就会触发 onreadystatechange 事件。
- onreadystatechange 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
- readyState 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
- 0: 请求未初始化
- 1: 服务器连接已建立
- 2: 请求已接收
- 3: 请求处理中
- 4: 请求已完成,且响应已就绪
- status 200: "OK"
- 404: 未找到页面
当 readyState 等于 4 且状态为 200 时,表示响应已就绪;eg:
- xmlhttp.onreadystatechange=function()
- {
- if (xmlhttp.readyState==4 && xmlhttp.status==200)
- {
- document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
- }
- }
上面就是整个XMLHttpRequest响应过程,下面是例子;客户端代码不变,只改动服务器端代码。
服务器端:
- <html>
- <body>
- <%
- var a = new Array(30);
- a[1]="Anna";
- a[2]="Brittany";
- a[3]="Cinderella";
- a[4]="Diana";
- a[5]="Eva";
- a[6]="Fiona";
- a[7]="Gunda";
- a[8]="Hege";
- a[9]="Inga";
- a[10]="Johanna";
- a[11]="Kitty";
- a[12]="Linda";
- a[13]="Nina";
- a[14]="Ophelia";
- a[15]="Petunia";
- a[16]="Amanda";
- a[17]="Raquel";
- a[18]="Cindy";
- a[19]="Doris";
- a[20]="Eve";
- a[21]="Evita";
- a[22]="Sunniva";
- a[23]="Tove";
- a[24]="Unni";
- a[25]="Violet";
- a[26]="Liza";
- a[27]="Elizabeth";
- a[28]="Ellen";
- a[29]="Wenche";
- var value,result;
- value = params.q;//接收表单数据
- var i,s,s1="";
- if (value != null)
- {
- result = ""
- for (i = 1;i < 30; i++){
- s = a[i].substring(0,1);
- if (s == value){
- if (result == ""){
- result = a[i];
- }
- else {
- result = result +','+a[i];
- }
- }
- }
- }
- if (result == ""){
- write("no suggestion");
- }
- else{
- write(result);
- }
- %>
- </body>
- </html>
客户端代码:
- <html>
- <head>
- <script type="text/javascript">
- function showHint(str)
- {
- var xmlhttp;
- if (str.length==0)
- {
- document.getElementById("txtHint").innerHTML="";
- return;
- }
- if (window.XMLHttpRequest)
- {// code for IE7+, Firefox, Chrome, Opera, Safari
- xmlhttp=new XMLHttpRequest();//创建XMLHttpRequest对象
- }
- else
- {// code for IE6, IE5
- xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");//老的浏览器所指出的XMLHttpRequest对象
- }
- xmlhttp.onreadystatechange=function()
- {
- if (xmlhttp.readyState==4 && xmlhttp.status==200) //判断响应是否接受完成
- {
- document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
- }
- }
- xmlhttp.open("GET","xml.ejs?q="+str,true);//请求格式
- xmlhttp.send();//发送请求
- }
- </script>
- </head>
- <body>
- <h3>请在下面的输入框中键入大写字母(A - Z):</h3>
- <form action="">
- 姓氏:<input type="text" id="txt1" onkeyup="showHint(this.value)" />
- </form>
- <p>建议:<span id="txtHint"></span></p>
- </body>
- </html>
通过这个例子我们可以知道在服务器端选择ejs的优势,它可以让开发者在开发客户端界面和服务器端程序时使用相同的编程语言。ejs只是js的一个模板补充。
阅读(2810) | 评论(1) | 转发(0) |