ASP.NET之Ajax系列(三)
我们通过前两篇文章的学习,已经大致掌握了Ajax的实现方法,同时也可以对比出两种方式的优劣。但是我们还是没有搞清楚真正的ajax的实现原理,以及最原始的,未经过封装的ajax是什么样的,今天我们一起来探索这些之前不了解的地方。
首先在上一篇也提到过,Ajax是异步的Javascript和XML,那么聪明的你应该已经猜到,js脚本是必不可少的。我们在这里先引入一个浏览器对象:XMLHttpRequest,可能大家对这个对象比较陌生,那么我们就先从它的属性开始了解。它主要有三个属性:onreadystatechange 属性、readyState 属性和responseText 属性,从名字上我们大致可以看出,第一个属性,也就是onreadystatechange 是用来在状态变更的时候处理服务器响应的函数,第二个属性是保存服务请求的状态(这里可能的值为0-4之间),第三个属性是获取服务器响应后的信息。
介绍完三个属性之后,我们开始进入正题,和所有的过程一样,我们需要先初始化XMLHttpRequest这个对象,但是由于浏览器的问题,在不同的浏览器初始化时,需要进行不同的方式:
<script type="text/javascript">
var xmlhttp;
function checkUser() {
xmlhttp = null;
var Name = document.getElementById("txtId").value; if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}//这里适用于火狐,谷歌还有高版本IE浏览器
else if (window.ActiveXObject) {
xmlhttp = new ActiveXObject("Microsoft.XMLHttp");
}//这里适用于低版本IE,如IE4,IE5等等
xmlhttp.open("GET", "Handler1.ashx?name=" + Name, true);
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
document.getElementById("lblShow").innerHTML = xmlhttp.responseText;
}
}
}
xmlhttp.send(null);
}
</script>
从代码中我们再一次验证了微软当年的“不走寻常路”,说句题外话,做了这么久的B/S,发现兼容性真是个头疼的问题,尤其是IE,每个版本之间兼容性都不一致,写Js的时候苦不堪言,推荐使用JQuery,它的兼容性非!常!好!在初始化对象之后,我们便开始了发送请求之旅,这次我们依然是向ashx提交并进行处理。xmlhttp.open("GET", "Handler1.ashx?name=" + Name, true);这句代码中有3个参数,第一个参数用于指定get提交或是post提交,这里需要注意大写;第二个参数是要提交的url,第三个参数指定是否为异步模式。接下来我们需要处理服务端状态改变后的函数,先判断服务器响应的状态信息:0为请求未初始化(在调用 open() 之前),1为请求已提出(调用 send() 之前),2为请求已发送(这里通常可以从响应得到内容头部),3为请求处理中(响应中通常有部分数据可用,但是服务器还没有完成响应),4为请求已完成(可以访问服务器响应并使用它)。
我们知道服务器是个大忙人,它要处理很多东西,如果打断了可不好,所以我们必须等待它的状态为4,才能进行下一步的处理,于是乎,在4之后判断响应是否为200(这里属于Http协议,不再详细阐述,有兴趣可以找下资料),然后再处理服务器的响应文本。好的,介绍完原理之后呢,我们就开始运行:
依然输入我们亲爱的豆豆。。。由前两篇的数据库我们“已经知道”豆豆这个昵称是存在的,所以我们没猜到过程,就已经猜到了结果,嘿嘿。接下来我们看看服务器端:
我们发现已经成功进入了断点,表明我们之前的请求已经成功!偶也,因为这次的方法比前两次都要复杂,所以我也是尝试了好几次,比较兴奋一些。注释掉的部分是上一篇中处理的方法,我记得ajax配合ashx使用时,貌似一次请求就要对应一个ashx文件(这里不确定,欢迎大家指正),真正的干货是下面没被注释掉的部分,获取传进来的参数,然后去对比。
因为我们已经“预知”了结果,所以出现这个情况也是意料之中,不过也表明我们今天的ajax实现方法已经成功,再来一个没注册的图:
好了,我们今天的教程到此为止,Ajax其实就是这样的原理,发送请求-等待响应-响应完成-后续处理,只是它可以在整个页面不回发的情况下单独进行处理,所以受到了人民的青睐。Ajax系列已经完结,不知道各位是否有收获呢?如果还有什么疑问或者想法,还可以在评论区中提出来,大家一起讨论。最后再给大家一个建议,实现的时候最好使用第二种jQuery+ashx的方式实现,简单暴力流!希望大家喜欢,谢谢!
ASP.NET之Ajax系列(三)的更多相关文章
- Asp.Net生命周期系列三
上文讲到了HttpRunTime主要做了三个事情,我们先回忆一下. 第一:雇佣了项目经理(HttpApplication). 第二:建立了HttpModule列表,项目经理(HttpRunTime)就 ...
- (转)Asp.Net生命周期系列三
原文地址:http://www.cnblogs.com/skm-blog/p/3178862.html 上文讲到了HttpRunTime主要做了三个事情,我们先回忆一下. 第一:雇佣了项目经理(Htt ...
- ASP.NET之Ajax系列(二)
在上一次的Ajax操作中,我们使用了ASP.NET原生控件实现,但是弊端很多,效率低下,而且有个文件上传的BUG:http://blog.csdn.net/zhaoqiliang527/article ...
- ASP.NET之Ajax系列(一)
我们在Web开发中经常会接触到Ajax技术,同时Ajax技术也有很多种实现方式,那么,我们今天从第一种方式说起:ASP.NET原生控件实现Ajax. ASP.NET原生控件用于Ajax技术的主要是Up ...
- Asp.Net生命周期系列四
上回我们说的当一个Http请求来到HttpModule这里的时候,Asp.Net内部并未对这个Http请求做出任何的处理,我们可以对这个Http请求添加一些我们需要的信息,以方便我们控制这个Http请 ...
- Asp.Net生命周期系列五
如果您看了我的前四篇文章,应该知道目前Http请求已经流到了HttpModule这个程序员手中了,而且我们可以注册自己的HttpModule并且可以在里面注册一些事件来控制这个Http请求,但是到目前 ...
- (转)Asp.Net生命周期系列五
原文地址:http://www.cnblogs.com/skm-blog/p/3188697.html 如果您看了我的前四篇文章,应该知道目前Http请求已经流到了HttpModule这个程序员手中了 ...
- Owin+ASP.NET Identity浅析系列(三)框架结构分析
在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… 前两篇博客仅仅说了下功能如何 ...
- ASP.NET MVC学习系列(二)-WebAPI请求
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
随机推荐
- python中文处理
源码文件为utf-8格式 CODEC = 'utf-8': VS在“高级保存选项”中选择“UTF-8 65001” input(u'中文');print(u'中文')
- 在ubuntu(linux)下安装vim,以及vim的常用命令
介绍vim: vim是一种编辑器,自我感觉这东西好用,就是现在有些不太习惯 如何安装: 如果是使用redhat ,系统自带着vi和vim 如果是使用ubuntu,建议使用apt-get命令, 可以尝试 ...
- hdu----(1671)Phone List(Trie带标签)
Phone List Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- poj----(1470)Closest Common Ancestors(LCA)
Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 15446 Accept ...
- oracle知识点
创建序列 create sequence a_seq --创建序列名字为 a_seqminvalue 1 -- 最小值为 1maxvalue 99999 --- 最大值为 99999 start wi ...
- Windows Store App 用户库文件操作
(1)获取用户库位置 如果想要通过应用程序在用户库中创建文件,首先需要获得用户库中指定的位置,例如图片库.文档库等.这里值得注意的是,在获取用户库的位置之前,必须在Windows应用商店项目的清单文件 ...
- BZOJ1932 [Shoi2007]Setstack 集合堆栈机
妈呀...clj大爷太强啦! 原来还有set_union和set_intersection这种东西... 于是只要把栈顶的每个元素hash一下记录到一个vector里去就好了 /*********** ...
- gitlab配置邮件通知
配置用户提交评论.添加issue等的邮件通知: Gitlab邮件提醒方便跟踪项目进度,在这里介绍两种方式,一种是用系统的sendmail发送邮件,另一种是GMAIL的stmp来发送邮件 第一种 用系统 ...
- Octopus系列之关于多选属性如何在OO中表示呢?
在电子商务系统中 关于产品属性的问题 会设计如下几个表 产品信息 Product 选项信息表 Option 存储 Size Color.... 选项值信息表 O ...
- java反射之Class.getMethod与getDeclaredMethods()区别
Class对象的getMethods和getDeclaredMethods都是获取类对象的方法.但是又有所不同.废话不多说, 先看demo package com.westward; public c ...