接上一篇  Ajax基础知识(一)

在上一篇博客里,抛弃了VS中新建aspx页面,拖个button写上C#代码的方式。使用ajax的方式,异步向服务器请求数据。我们让服务器只简单的返回一个“Hello World”字符串给客户端。实例代码也放出,但是对于掌握Ajax到底是个什么东西,还有些疑惑点。首先,那个JS函数GetInfoByAjax里面的XmlHttpRequest是个什么东西,为什么open里面放的是get,回调函数这些都是什么。

一、XmlHttpRequest

这是一个对象,所有现代浏览器都支持这个对象,用于在后台与服务器交换数据,它提供了在网页加载后与服务器进行通信的方法(所谓的异步加载数据)。在IE5和IE6时代,使用的叫ActiveXObject。在上一篇的JS代码中,GetInfoByAjax首先就实例化了一个XmlHttpRequest对象。当然,那样的代码是略有问题的,至少在IE5、6下是会报错的。对GetInfoByAjax进行修改,增加对浏览器的判断。

function GetInfoByAjax() {
//创建xmlHttpRequest对象
var xmlHttp; if (window.XMLHttpRequest) { //判断浏览器是否支持XMLHttpRequst
xmlHttp = new XMLHttpRequest();
} else {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} //配置XmlHttpRequest对象
xmlHttp.open("get", "Handlers/SimpleAjax.ashx");
//设置回调函数
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState = 4 && xmlHttp.status == 200) {
document.getElementById("DataDiv").innerHTML = xmlHttp.responseText;
}
}
//发送请求
xmlHttp.send(null);
}

二、open里面的参数是什么

创建完xmlHttp对象后,就该使用它了。其实它就是去向服务器请求自己需要的文档,如果知道这个文档存放的位置,就可以把这个地址(URL)写上去就好了。至于请求的文件是什么,可以是纯文本文件,xml文件,html文件等等(Handler/SimpleAjax.ashx则是我们请求的文件)。当然,那是向服务器请求一个静态的文件,当我们需要向服务器请求的文件并不是一成不变,而是需要服务器进行处理的文件呢。可能还会需要向服务器发送点东西,服务器根据接收到的内容再返回相应的内容给客户端。再拿省市区联动的例子说事,当我在浏览器上选择了自己所在的省,比如吉林,那服务器得根据收到的省去查询这个省下的市,把这些市返回给我,而不是又一股脑把所有省下的市都抛给了我。这个get就是向服务器发送数据的方式,另一种方式叫post。二者的区别在于,get会将发送的数据显示在浏览器的地址栏上(经常会看到地址栏上显示?username=xxxx&email=XXXX),对于发送数据量少,且安全性要求不高的使用get发送方便。post发送的数据大小不限,且不明显显示在地址栏上。比较遗憾,GetInfoByAjax方法并未向服务器发送任何数据,假设向服务器post了一个用户名的数据,则相应的代码需要修改成如下。

function GetInfoByAjax() {
//创建xmlHttpRequest对象
var xmlHttp;
var userName = 'user123';
if (window.XMLHttpRequest) { //判断浏览器是否支持XMLHttpRequst
xmlHttp = new XMLHttpRequest();
} else {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} //配置XmlHttpRequest对象
xmlHttp.open("post", "Handlers/SimpleAjax.ashx");
//设置请求头
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//设置回调函数
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState = 4 && xmlHttp.status == 200) {
document.getElementById("DataDiv").innerHTML = xmlHttp.responseText;
}
}
//发送请求
xmlHttp.send("username=" + userName);
}

三、回调函数

回想一下上一篇啰嗦的浏览网页发生的过程,现在向服务器请求的事情都干完了。服务器也把该准备的内容准备好了,发给客户端以后怎么办呢?这里的回调函数,干的就是把服务器根据我请求的内容返回的内容给更新到当前的页面上。XmlHttpRequest有三个非常重要的属性:onreadystatechange、status、readyState。readyState保存了XmlHttpRequest的状态,每当它的值变化,就会触发onreadystatechange事件。

属性 描述
onreadystatechange 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
readyState

存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。

  • 0: 请求未初始化
  • 1: 服务器连接已建立
  • 2: 请求已接收
  • 3: 请求处理中
  • 4: 请求已完成,且响应已就绪
status

200: "OK"

404: 未找到页面

从上面的表中看到,GetInfoByAjax中onreadystatechange指定到一个匿名函数中,该函数判断XmlHttpRequest对象的状态是已经请求完成,响应就绪。则把返回的内容写到了页面中的div中。这样,这个使用Ajax的过程就差不多完成了。下一篇,会完成上一篇中提到的省市区三级联动的程序。

Reference: W3school

版权声明:本文为博主原创文章,未经博主允许不得转载。

Ajax基础知识(二)的更多相关文章

  1. Ajax基础知识 浅析(含php基础语法知识)

    1.php基础语法    后缀名为.php的文件 (1) echo   向页面中输入字符串  <?php    所有php相关代码都要写在<?php ?>这个标签之中 echo &q ...

  2. Ajax基础知识《一》

    对于网站开发人员,一定不会陌生的Ajax技术,本篇就让我们认识一下它,或许在日后的开发过程中我们就可以使用到.Ajax在那方面使用的比较多呢?答案:表单注册,传统的表单注册,有时需要填写大量的信息,当 ...

  3. java 基础知识二 基本类型与运算符

    java  基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...

  4. 菜鸟脱壳之脱壳的基础知识(二) ——DUMP的原理

    菜鸟脱壳之脱壳的基础知识(二)——DUMP的原理当外壳的执行完毕后,会跳到原来的程序的入口点,即Entry Point,也可以称作OEP!当一般加密强度不是很大的壳,会在壳的末尾有一个大的跨段,跳向O ...

  5. Dapper基础知识二

    在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 2,如何使用Dapper?     首先Dapper是支持多种数据库的 ...

  6. python基础知识(二)

    python基础知识(二) 字符串格式化 ​ 格式: % 类型 ---- > ' %类型 ' %(数据) %s 字符串 ​ print(' %s is boy'%('tom')) ----> ...

  7. 11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库

    1.ajax的基础知识 ajax是结合了jquery.php等几种技术延伸出来的综合运用的技术,不是新的内容.ajax也是写在<script>标签里面的. 如果使用ajax一定是要有1个处 ...

  8. Java基础知识二次学习--第三章 面向对象

    第三章 面向对象   时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...

  9. Java基础知识二次学习-- 第一章 java基础

    基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...

随机推荐

  1. dij算法为什么不能处理负权,以及dij算法变种

    对于上面那张图,是可以用dij算法求解出正确答案,但那只是巧合而已. 我们再看看下面这张图. dist[4] 是不会被正确计算的. 因为dij算法认为从队列出来的点,(假设为u)肯定是已经求出最短路的 ...

  2. Android数据存储——SQLite数据库(模板)

    本篇整合Android使用数据库,要保存一个实体类的样本. 首先看一下数据库语句: ORM:关系对象映射 添加数据: ContentValues values = new ContentValues( ...

  3. 重新想象 Windows 8 Store Apps (2) - 控件之按钮控件: Button, HyperlinkButton, RepeatButton, ToggleButton, RadioButton, CheckBox, ToggleSwitch

    原文:重新想象 Windows 8 Store Apps (2) - 控件之按钮控件: Button, HyperlinkButton, RepeatButton, ToggleButton, Rad ...

  4. cgo 随笔(golang)

    结构体应用 //结构体定义如下 // test.h struct test { int a; int b; int c; } 在golang中的调用如下: package name import &q ...

  5. .c和.h档

    可一再声明,但不是很多定义 对于一个项目,我们应该要非常好的处理众多的.c和.h文件 1.通过头文件调用库功能:#include <stdio.h>       在非常多场合,源码不便(或 ...

  6. js多物体任意值运动

    假如有两个div,一个div要变宽,一个div要变高,你怎么写呢? 哎呀,写2个方法啊,一个控制div1变宽,一个控制div2变高啊 那么你的代码,是不是下面这样的呢! 示例:Div变宽和变高 现象: ...

  7. 组态Log4j(非常具体的)

    来自哪里: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用来设 ...

  8. SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别

    SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别: IN:确定给定的值是否与子查询或列表中的值相匹配. IN 关键字使您得以选择与列表中的任意一个值匹配的行. 当要获得居住在 ...

  9. 公钥\私人 ssh避password登陆

    相关概念以前见过,决不要注意,使用公共密钥管理之前,腾讯云主机的备案机,非常头发的感觉,查了一下相关资料,这里总结下: 字符a:192.168.7.188 (ubuntu) 字符b:192.168.7 ...

  10. 如何知道 win10 的激活到期时间和期限等

    在“运行”里输入cmd,出来dos对话框后,输入下面的东西后,按Enterslmgr.vbs -dli (显示:操作系统版本.部分产品密钥.许可证状态)slmgr.vbs -dlv (显示:最为详尽的 ...