jy-11-AJAX--承租红+成恒

目录:

1、day01-AJAX

文件已上传分享

 2、day02-在Spring MVC中使用@ResponseBody

文件已上传分享

 3、day03-练习 - 二级联动菜单

文件已上传分享

4、回顾

5、什么是 JSON ?


1、day01-AJAX

名称

Asynchronous Javascript And XML:异步的Javascript与XML

异步的:非同步的

---------------------------------------------------------------------------------------------------------------------------------

问题

以登录功能为例,假设是失败的:当用户点击“登录”按钮后,会向服务器提交请求,然后,服务器端进行登录验证,并返回结果,返回的结果由于是失败的,很可能还是登录页面,只不过此次登录界面中包括错误信息,例如在页面上会显示“用户名或密码错误”之类的提示。

在这样的案例中,存在的问题:

1 登录前和登录后的是同一个界面,却由服务器返回了2次,第2次仅仅只是多了错误提示,返回的却是整个界面,从必要性、流量方向考虑,都是没有必要的!

2 用户体验较差,特别是网络传输速度较差的情况下表现得更加明显,毕竟需要处理的数据中有较大比例的是不必要传输的数据!

3 用户体验较差,表现为当用户提交后,接下来将得到新的界面,在提交后、新界面显示之前,用户无法在界面中进行操作。

---------------------------------------------------------------------------------------------------------------------------------

基本概念

AJAX是一种提交HTTP请求、获取结果的处理方式。

AJAX提交的请求是异步的,即开启另一个线程提交请求,与当前浏览器显示的页面、用户的使用并不发生冲突。

AJAX获取的响应结果通常不会是一个完整的网页,而是某些数据,可以是普通的字符串直接表示的数据,例如错误提示信息,也可能是有规则组织起来的数据,例如使用XML来组织这些数据。

AJAX并不是一门新的语言,只是一门技术而已。

AJAX在程序中的表现是Javascript代码。

---------------------------------------------------------------------------------------------------------------------------------

XMLHttpRequest

在AJAX中,XMLHttpRequest就是用于发送异步请求,并获取响应结果的对象!

由于历史版本问题,在IE 5和IE 6中,并没有XMLHttpRequest,而是使用的ActiveXObject,所以,在这2个版本的浏览器,如果需要使用AJAX,必须是:

XMLHttpRequest xmlhttp = new ActiveXObject("Microsoft.XMLHttp");

为了保证各种浏览器都可以获取到正确的XMLHttpRequest对象:

function getXMLHttpRequest() {
var xmlhttp = null;
if (window.XMLHttpRequest) {
// 适用于IE 7+、Chrome、Firefox、Safari、Opera……
xmlhttp = new XMLHttpRequest();
} else {
// 适用于IE 5、IE 6
xmlhttp = new ActiveXObject("Microsoft.XMLHttp");
}
return xmlhttp;
}

----------------------------------------------------------------------------------------------

在XMLHttpRequest中的5个属性

-- onreadystatechange:处理函数,即请求发出后,哪个函数对后续的操作进行处理,该属性的值应该是一个函数。

-- readyState:状态,该属性的值为0~4之间的数值,即共5种状态: -- -- 0[不关心]:连接尚未初始化 -- -- 1[不关心]:初始化连接 -- -- 2[不关心]:发出请求 -- -- 3[不关心]:服务器已经接收到请求 -- -- 4:响应已经就绪

-- status:响应码,例如200表示正确的响应

-- responseText:响应的正文(字符串)

-- responseXML:响应的XML,该属性和responseText选取其中一个来使用即可,取决于服务器响应的正文到底是字符串还是XML格式

-----------------------------------------------------------------------------------------------------------------------------

发送请求

发送请求需要调用open()和send()这2个函数,例如:

xmlhttp.open("GET", "query.do", true);
xmlhttp.send();

在open()函数中,第1个参数表示请求类型,取值可以是"GET"或"POST",第2个参数表示请求资源的路径,可以是相对路径,也可以是绝对路径,路径对应的资源可以是一个动态页面,也可以是在服务器上的文本文件,或图片等任意资源,第3个参数表示此次请求是否是异步的,取值为true表示异步,取值为false表示同步。

在发出"GET"请求时,调用send()函数时,不需要添加参数,或添加null作为参数均可,如果发出的是"POST"请求,则应该把参数以"name1=value1&name2=value2&name3=value3"这样的形式组织起来,作为调用send()函数的参数。

由于"POST"请求的参数是需要配置请求头的,所以,在发出"POST"请求之前,还必须调用XMLHttpRequest对象的setRequestHeader()函数,以配置请求头:

xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

Ps:在使用open()函数时将第3个参数设置为false表示将发出同步请求,一旦发出请求,当前网页将暂时处于不可用状态,例如网页上的按钮将无法点击,页面将无法滚动等,直至此次同步请求处理完毕。基于这样的特性,通常极少使用同步请求,即使使用,也只用于处理少量数据,保证同步请求不会占用太多时间,从而不影响用户的正常体验。

-----------------------------------------------------------------------------------------------------------------------------

案例一

目标

服务器端有一组数据:BeiJing、ShangHai、GuangZhou、ShenZhen、TianJin、NanJing、ChangSha、ChengDu……

在网页中输入例如字母B,将在网页中提示以字母B作为首字母的结果:BeiJing,如果输入S,则提示:ShangHai、ShenZhen

开发步骤

1 设计功能:

public String query(String keyword) {
String[] cities = "BeiJing,ShangHai,GuangZhou,ShenZhen,TianJin,NanJing,ChangSha,ChengDu".split(",");
StringBuffer result = new StringBuffer();
for (int i = 0; i < cities.length; i++) {
if (cities[i].startsWith(keyword)) {
if (result.length() > 0) {
result.append("、");
}
result.append(cities[i]);
}
}
return result.toString();
}

2 开发Web项目,提供功能

cn.tedu.ajax.servlet.QueryCityServlet

http://SERVER:PORT/PROJECT/query.do?keyword=S

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取请求参数:关键字
String keyword = req.getParameter("keyword");

// 2. 调用query()方法,获取关键字对应的结果
String result = query(keyword);

// 3. 获取输出流,向客户端输出结果
PrintWriter out = resp.getWriter();
out.println(result);
out.flush();
out.close();
}

另:需注册Servlet

3 设计前端页面:页面中需要1个输入框用于输入关键字,另需要1个标签显示结果,其它部分没有要求

4 编写Javascript程序,每当输入框中的内容改变时,获取输入框中的内容

<script type="text/javascript">
function showSuggest(keyword) {
// 测试获取输入框中的内容
// alert(keyword);
}
</script>

<input type="text"
onkeyup="showSuggest(this.value)" />

5 获取异步请求对象

var xmlhttp = new XMLHttpRequest();

6 发出请求

// 请求URL
var url = "query.do?keyword=" + keyword;
// 发出请求
xmlhttp.open("GET", url, true);
xmlhttp.send();

7 在发出请求之前,添加对结果处理的函数

xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4
&& xmlhttp.status == 200) {
document.getElementById("suggestResult")
.innerHTML = xmlhttp.responseText;
}
};

--------------------------------------------------------------------------------------

案例二

目标

模拟登录,需要输入用户名和密码来登录,假设正确的用户名是tomcat,匹配的密码是tomcat7,当用户登录后,如果用户名错误,则在用户名的输入框下方提示用户名错误,如果密码错误,则在密码的输入框下方提示密码错误。

-----------------------------------------------------------------------------------------------------------------------------

开发步骤

1 创建项目:DAY09-AJAX-02-Login

2 创建Servlet:cn.tedu.ajax.servlet.LoginServlet,并在该LoginServlet中重写doPost()方法,在方法中接收名为username和password的参数,根据参数模拟判断登录,如果用户名错误,向客户端输出"Username not exists",如果密码错误,向客户端输出"Password not match",如果都正确,则向客户端输出"OK",完成后,在web.xml中注册该LoginServlet,映射地址为:handleLogin.do

3 在webapp目录下添加index.html,在该文件中添加2个输入框,分别用于输入用户名和密码,并为这2个输入框设置id属性,以便于通过Javascript获取输入框中的值,然后添加按钮,最后,在2个输入框的下方分别添加1个标签,用于显示登录错误的信息

4 添加Javascript函数:funtion $(id) ...

5 添加Javascript函数:function getXMLHttpRequest() ...

6 添加Javascript函数:function doLogin(),在该函数中,先获取用户输入的数据,验证数据基本有效性(本次练习可选操作),然后获取XMLHttpRequest对象,配置onreadystatechange属性,设计响应函数,然后依次调用open()、setRequestHeader()、send()方法发出请求,在响应函数中,通过XMLHttpRequest对象的responseText获取响应结果,对结果进行判断,然后通过标签对象的innerHTML来显示错误信息,或者通过window.location重定向

在Spring MVC案例中,控制器返回值

在Spring MVC的默认情况下,控制器返回的值是用于处理后续内容的View组件名称,只需要使用@ResponseBody对方法进行注解,则表示方法返回的就只是值!注意:使用@ResponseBody时,必须在Spring的配置文件中添加<mvc:annotation-driven />

public class Controller {
@RequestMapping()
@ResponseBody
public String handleLogin() {
return "value";
}
}

2、day02-在Spring MVC中使用@ResponseBody

@ResponseBody用于注解Controller类中的方法。

一旦使用了这个注解,Controller中方法的返回值就应该是String,并且不再表示“返回View组件的名称”的意义,而是返回普通的字符串,最终,客户端得到的响应也就是这个字符串!

使用@ResponseBody时,推荐在Spring的配置文件中添加<mvc:annotation-driven />驱动注解。

-----------------------------------------------------------------------------------------------------------------------------

JSON

为什么要使用JSON

在很多情况下,服务端程序作出的响应不再是显示某个HTML页面,而是一系列相关的数据,这样的话,更加利于服务端程序“提供数据服务”,即只提供数据,而不负责数据的呈现。

由服务端程序提供数据往往包含很多信息,比如自定义的响应代码(例如1表示成功,-1表示某种操作错误等),还包含提示信息、关键数据等等。

诸多的信息应该有规则的组织起来,便于发出请求的一方进行分析并且处理!早期的做法是使用XML进行处理:

<response-body>
<status>1</status>
<data>
<username>tomcat</username>
<age>18</age>
<from>BeiJing</form>
</data>
</response-body>

使用XML最大的不足在于使用的节点过多,解析过程相对麻烦,并且由于节点过多,导致传输的数据量较大!

用于取代XML这种组织数据的方式的就是JSON:

{
"status":1,
"data":{
"username":"tomcat",
"age":18,
"from":"BeiJing"
}
}

通过对比,可以发现,使用JSON表达的数据,体量更小(字节数更少),所以,最终将表现得传输更快,消耗的流量更少一些!事实上,数据解析过程也更加简单一些!

-----------------------------------------------------------------------------------------------------------------------------

JSON的数据格式

1 JSON数据必须使用一对大括号框住后再开始编写,相当于每个XML都有且仅有1个根节点

2 JSON数据中的属性与值都是使用 "属性名":属性值 这样的格式来组织,多对属性与值的配置之间使用逗号进行分隔,例如:

{
"name":"tomcat",
"age":18
}

3 JSON中也有数据类型的概念,如果属性的值是字符串类型的,必须使用双引号框住,如果是数值型的,直接写值即可,但是,由于JSON被多用于服务器端向客户端传输数据,所以,并不一定需要在意数据的类型,即使全部作为字符串类型来处理也是可以的:

{
"name":"tomcat",
"age":"18"
}

4 JSON中也可以表示对象,如果某个属性的值是对象,则该属性值应该使用大括号框住,在这对大括号中,继续使用 "属性名":属性值 的格式表示对象内部的属性:

{
"status":1,
"data":{
"username":"tomcat",
"age":18,
"from":"BeiJing",
"department":{
"id":9527,
"name":"rd"
}
}
}

5 JSON中还可以表示数组或集合,对于JSON而言,严格的说只有数组,如果要表示List集合,语法上与数组是一样的,没有区别!表示数组的方式是使用 [] 将所有的数组成员框住,各成员之间使用逗号分隔:

{
"users":[
{ "username":"Alex", "age":18 },
{ "username":"Billy", "age":19 }
]
}

6 在Javascript中,也可以很方便的访问JSON数据,例如:

var jsonData = { "name":"tomcat", "age":"18" };
alert(jsonData.name);
jsonData = {
"status":1,
"data":{
"username":"tomcat",
"age":18,
"from":"BeiJing"
}
};
alert(jsonData.data.username);
jsonData = {
"users":[
{ "username":"Alex", "age":18 },
{ "username":"Billy", "age":19 }
]
};
alert(jsonData.users[1].username);

7 如果在Javascript中只能先得到JSON的字符串格式,需要转换为JSON对象,可以通过JSON.parse()函数来实现转换:

var text = '{ "status":1, "message":"ok" }';
var jsonObject = JSON.parse(text);

3、day03-练习 - 二级联动菜单

1 创建项目及准备工作

2 设计数据

----- 请选择 -----
1.广东省 1广州,2深圳,3珠海
2.河北省 4石家庄,5保定,6秦皇岛

3 设计服务端的功能:

URL:getCities.do
请求类型:GET
参数:provinceId
返回:ResponseResult,其中的数据部分是List<City>,City中至少封装id, name

a) 创建cn.tedu.spring.bean.ResponseResult,属性包括:int state,String message,Object data
b) 创建cn.tedu.spring.bean.City,属性包括:int id,String name
c) 创建cn.tedu.spring.controller.CityController,添加public String getCities(int provinceId)方法,映射到getCities.do路径,在方法内部,根据参数provinceId进行判断,然后得到List<City>,封装到ResponseResult中,最后转换为JSON字符串,作为方法的返回值
d) 通过浏览器测试

4 创建前端页面index.html,并添加2个下拉菜单,其中第1个下拉菜单中添加1广东省、2河北省这2个有效选项

5 设计AJAX请求

function $(id) {
return document.getElementById(id);
}
function getXMLHttpRequest() {
var xmlhttp = null;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else {
xmlhttp = new ActiveXObject("Microsoft.XMLHttp");
}
return xmlhttp;
}
function getCities(provinceId) {
// 无论选中哪个选项,先清空“城市”列表
while ($("cities").firstChild) {
$("cities").removeChild(
$("cities").firstChild);
}
// 判断provinceId是否有效
if (provinceId == 0) {
return;
}
// 获取XMLHttpRequest
var xmlhttp = getXMLHttpRequest();
// 设计响应函数
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4
&& xmlhttp.status == 200) {
// 获取响应的正文文本
var text = xmlhttp.responseText;
// 将响应的正文文本转换为JSON对象
var jsonObject = JSON.parse(text);
// 判断JSON对象中的state是否正确
if (jsonObject.state == 1) {
// 遍历JSON对象中的data对应的数组
for (var i = 0; i < jsonObject.data.length; i++) {
// 将数组中的每个数据设计为一个个<option>
var opt = document.createElement("option");
// <option value="3">珠海</option>
// "data":[
// {"id":1,"name":"广州"},
// {"id":2,"name":"深圳"},
// {"id":3,"name":"珠海"}
// ]
opt.value = jsonObject.data[i].id;
opt.innerHTML = jsonObject.data[i].name;
// 将<option>添加到“城市”列表中
$("cities").appendChild(opt);
}
}
}
};
// 发出请求
var url = "getCities.do?provinceId="
+ provinceId;
xmlhttp.open("GET", url, true);
xmlhttp.send();
}

AJAX的数据缓存问题

如果反复向同一个URL发出请求,并且请求参数没有发生变化的话,可能会获取到缓存的数据,即获取到的不是最新数据!

针对这个问题的解决方案:使得每次请求参数都不同!例如为每次的请求多添加1个参数,参数名可以自定义,参数值使用随机数即可!

jQuery AJAX - load()

在使用了jQuery后,关于AJAX的应用也得到了极大的简化,通过load()函数可以快速的提交AJAX的异步请求,并且将响应的结果填充到某个标签中。

注意:这种做法适用于(但不局限于)将结果直接填充到标签中!

这种做法的语法格式是:

$(选择器).load(URL,参数);

在以上语法中,$(选择器)表示需要将结果填充到哪个标签中,URL表示请求路径,参数表示发出请求时向服务器提交的参数,参数值的格式可以是字符串格式,例如:

username=tomcat&password=123456

参数值的格式还可以是JSON对象格式:

{ "username":"tomcat", "password":"123456" }

其实,load()函数的完整格式是:

$(选择器).load(URL,参数,处理响应结果的函数);

也就是说,load()函数还可以有第3个参数,第3个参数是一个函数,专门用于处理结果,类似于传统方式中的xmlhttp.onreadystatechange属性的值。

另外,其实在jQuery中,还有另一个也叫做load()的函数,也是被某个标签对象所调用的,但是,其参数是某个函数,用于表示标签加载完成时的自定义处理,这2个load()函数,至于执行的是哪个,取决于参数的设计。

jQuery AJAX - ajax()

在使用jQuery时,通过ajax()函数可以设置AJAX请求过程中所有的可设置项!

使用ajax()的基本语法是:

$.ajax({配置});

以上语法中,“配置”及左右两侧的{ }整体表现为一个JSON对象格式。

在“配置”中,通常会设置的属性有:

url:请求的路径

例如:

$.ajax({
"url":"getCities.do",
"success":function(obj) {
}
});

还会设置的属性有:

type:请求的类型(请求方式),取值为"GET"或"POST"

data:请求的参数,参数值可以是字符串格式的,也可以是JSON对象格式的

dataType:响应结果的数据的类型,常用的取值有"text"、"json",当取值为"text"时,后续success属性对应的处理函数中的参数将是字符串类型的,当取值为"json"时,后续success属性对应的处理函数中的参数将是JSON对象

success:成功得到响应结果时的处理函数,即该属性的值是某个函数,该函数仅会在成功得到响应结果后被调用,所以,在函数内部,无须再判断状态为4或响应码为200,并且,在编写处理函数时,请为该函数添加参数,参数名称可自行定义,参数将是成功得到响应结果时的响应结果,类似于xmlhttp.responseText

在配置以上属性时,不区分先后顺序,即先配置哪个后配置哪个,并没有要求!

除此以外,ajax()函数还可以配置许多属性,如有需要,请参考相关文档。


4、回顾

[****] HTML

用于规划网页内容,需要掌握有哪些标签、什么时候用什么标签,什么样的标签默认有什么样式

-----------------------------------------------------------------------------------------------------------------------------

[***] CSS

-----------------------------------------------------------------------------------------------------------------------------

[***] Javascript

处理界面与用户的交互

-----------------------------------------------------------------------------------------------------------------------------

[***] jQuery

-----------------------------------------------------------------------------------------------------------------------------

[*****] jQuery AJAX

-----------------------------------------------------------------------------------------------------------------------------

[***] Servlet

用于接收用户的请求,并向客户返回响应结果。

需要掌握:定位、注册、注册时配置参数

-----------------------------------------------------------------------------------------------------------------------------

[**] Filter

用于对请求进行过滤,运行在Servlet之前

需要掌握:字符编码过滤器

-----------------------------------------------------------------------------------------------------------------------------

[*****] JSP

向客户端提供响应的视图

需要掌握:EL、JSTL

-----------------------------------------------------------------------------------------------------------------------------

[*****] SQL

需要掌握:创建库、创建表、增删改查、关联表查询、事务

需要了解:聚合函数、Having、Group By、存储过程、触发器

-----------------------------------------------------------------------------------------------------------------------------

[*****] Spring

Spring解决了创建对象的问题,使得开发者可以不通过new语法获取对象。

DI(依赖注入)是实现的手段,IOC(控制反转)是最终的实现效果。

-----------------------------------------------------------------------------------------------------------------------------

[*****] Spring MVC

Spring MVC提供完整的接收请求、分发请求、响应请求的机制,最终表现为开发者可以自定义Controller类,并在Controller类中自定义方法去处理请求。

-----------------------------------------------------------------------------------------------------------------------------

[*****] Mybatis


一、AJAX

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。

1.AJAX 简介

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

-----------------------------------------------------------------------------------------------------------------------------

您应当具备的基础知识

在继续学习之前,您需要对下面的知识有基本的了解:

  • HTML / XHTML

  • CSS

  • JavaScript / DOM

如果您希望首先学习这些项目,请在我们的首页访问这些教程。

-----------------------------------------------------------------------------------------------------------------------------

什么是 AJAX ?

AJAX = 异步 JavaScript 和 XML。

AJAX 是一种用于创建快速动态网页的技术。

通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。

有很多使用 AJAX 的应用程序案例:新浪微博、Google 地图、开心网等等。

ajax-思维导图

----------------------------------------------------------------------------------------------

Google Suggest

在 2005 年,Google 通过其 Google Suggest 使 AJAX 变得流行起来。

Google Suggest 使用 AJAX 创造出动态性极强的 web 界面:当您在谷歌的搜索框输入关键字时,JavaScript 会把这些字符发送到服务器,然后服务器会返回一个搜索建议的列表。

-----------------------------------------------------------------------------------------------------------------------------

今天就开始使用 AJAX

AJAX 基于已有的标准。这些标准已被大多数开发者使用多年。

请阅读下一章,看看 AJAX 是如何工作的!


2.AJAX 实例

为了帮助您理解 AJAX 的工作原理,我们创建了一个小型的 AJAX 应用程序。

-----------------------------------------------------------------------------------------------------------------------------

实例

Let AJAX change this text

通过 AJAX 改变内容

-----------------------------------------------------------------------------------------------------------------------------

AJAX 实例解释

上面的 AJAX 应用程序包含一个 div 和一个按钮。

div 部分用于显示来自服务器的信息。当按钮被点击时,它负责调用名为 loadXMLDoc() 的函数:

<html>
<body>
<div id="myDiv"><h3>Let AJAX change this text</h3></div>
<button type="button" onclick="loadXMLDoc()">Change Content</button>
</body>
</html>

接下来,在页面的 head 部分添加一个 <script> 标签。该标签中包含了这个 loadXMLDoc() 函数:

<head>
<script type="text/javascript">
function loadXMLDoc()
{
.... AJAX script goes here ...
}
</script>
</head>

下面的章节会为您讲解 AJAX 的工作原理。


3.AJAX - 创建 XMLHttpRequest 对象

XMLHttpRequest 是 AJAX 的基础。

-----------------------------------------------------------------------------------------------------------------------------

XMLHttpRequest 对象

所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。

XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

-----------------------------------------------------------------------------------------------------------------------------

创建 XMLHttpRequest 对象

所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。

创建 XMLHttpRequest 对象的语法:

variable=new XMLHttpRequest();

老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:

variable=new ActiveXObject("Microsoft.XMLHTTP");

为了应对所有的现代浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,则创建 XMLHttpRequest 对象。如果不支持,则创建 ActiveXObject :

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");
}

在下一章中,您将学习发送服务器请求的知识。


4.AJAX - 向服务器发送请求

XMLHttpRequest 对象用于和服务器交换数据。

-----------------------------------------------------------------------------------------------------------------------------

向服务器发送请求

如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:

xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();
方法描述
open(method,url,async)

规定请求的类型、URL 以及是否异步处理请求。

  • method:请求的类型;GET 或 POST

  • url:文件在服务器上的位置

  • async:true(异步)或 false(同步)

send(string)

将请求发送到服务器。

  • string:仅用于 POST 请求

 -----------------------------------------------------------------------------------------------------------------------------

GET 还是 POST?

与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。

然而,在以下情况中,请使用 POST 请求:

  • 无法使用缓存文件(更新服务器上的文件或数据库)

  • 向服务器发送大量数据(POST 没有数据量限制)

  • 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

----------------------------------------------------------------------------------------------------------------------------- 

GET 请求

一个简单的 GET 请求:

xmlhttp.open("GET","demo_get.asp",true);
xmlhttp.send();

亲自试一试

在上面的例子中,您可能得到的是缓存的结果。

为了避免这种情况,请向 URL 添加一个唯一的 ID:

xmlhttp.open("GET","demo_get.asp?t=" + Math.random(),true);
xmlhttp.send();

亲自试一试

如果您希望通过 GET 方法发送信息,请向 URL 添加信息:

xmlhttp.open("GET","demo_get2.asp?fname=Bill&lname=Gates",true);
xmlhttp.send();

亲自试一试

----------------------------------------------------------------------------------------------------------------------------- 

POST 请求

一个简单 POST 请求:

xmlhttp.open("POST","demo_post.asp",true);
xmlhttp.send();

亲自试一试

如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:

xmlhttp.open("POST","ajax_test.asp",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Bill&lname=Gates");

亲自试一试

方法描述
setRequestHeader(header,value)

向请求添加 HTTP 头。

  • header: 规定头的名称

  • value: 规定头的值

----------------------------------------------------------------------------------------------------------------------------- 

url - 服务器上的文件

open() 方法的 url 参数是服务器上文件的地址:

xmlhttp.open("GET","ajax_test.asp",true);

该文件可以是任何类型的文件,比如 .txt 和 .xml,或者服务器脚本文件,比如 .asp 和 .php (在传回响应之前,能够在服务器上执行任务)。

----------------------------------------------------------------------------------------------------------------------------- 

异步 - True 或 False?

AJAX 指的是异步 JavaScript 和 XML(Asynchronous JavaScript and XML)。

XMLHttpRequest 对象如果要用于 AJAX 的话,其 open() 方法的 async 参数必须设置为 true:

xmlhttp.open("GET","ajax_test.asp",true);

对于 web 开发人员来说,发送异步请求是一个巨大的进步。很多在服务器执行的任务都相当费时。AJAX 出现之前,这可能会引起应用程序挂起或停止。

通过 AJAX,JavaScript 无需等待服务器的响应,而是:

  • 在等待服务器响应时执行其他脚本

  • 当响应就绪后对响应进行处理

 ----------------------------------------------------------------------------------------------------------------------------- 

Async = true

当使用 async=true 时,请规定在响应处于 onreadystatechange 事件中的就绪状态时执行的函数:

xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","test1.txt",true);
xmlhttp.send();

亲自试一试

您将在稍后的章节学习更多有关 onreadystatechange 的内容。

 ----------------------------------------------------------------------------------------------------------------------------- 

Async = false

如需使用 async=false,请将 open() 方法中的第三个参数改为 false:

xmlhttp.open("GET","test1.txt",false);

我们不推荐使用 async=false,但是对于一些小型的请求,也是可以的。

请记住,JavaScript 会等到服务器响应就绪才继续执行。如果服务器繁忙或缓慢,应用程序会挂起或停止。

注释:当您使用 async=false 时,请不要编写 onreadystatechange 函数 - 把代码放到 send() 语句后面即可:

xmlhttp.open("GET","test1.txt",false);
xmlhttp.send();
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

亲自试一试


5.AJAX - 服务器响应

服务器响应

如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。

属性描述
responseText获得字符串形式的响应数据。
responseXML获得 XML 形式的响应数据。

responseText 属性

如果来自服务器的响应并非 XML,请使用 responseText 属性。

responseText 属性返回字符串形式的响应,因此您可以这样使用:

document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

亲自试一试

 ----------------------------------------------------------------------------------------------------------------------------- 

responseXML 属性

如果来自服务器的响应是 XML,而且需要作为 XML 对象进行解析,请使用 responseXML 属性:

请求 books.xml 文件,并解析响应:

xmlDoc=xmlhttp.responseXML;
txt="";
x=xmlDoc.getElementsByTagName("ARTIST");
for (i=0;i<x.length;i++)
{
txt=txt + x[i].childNodes[0].nodeValue + "<br />";
}
document.getElementById("myDiv").innerHTML=txt;

亲自试一试


6.AJAX - onreadystatechange事件

onreadystatechange 事件

当请求被发送到服务器时,我们需要执行一些基于响应的任务。

每当 readyState 改变时,就会触发 onreadystatechange 事件。

readyState 属性存有 XMLHttpRequest 的状态信息。

下面是 XMLHttpRequest 对象的三个重要的属性:

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

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

  • 0: 请求未初始化

  • 1: 服务器连接已建立

  • 2: 请求已接收

  • 3: 请求处理中

  • 4: 请求已完成,且响应已就绪

status

200: "OK"

404: 未找到页面

在 onreadystatechange 事件中,我们规定当服务器响应已做好被处理的准备时所执行的任务。

当 readyState 等于 4 且状态为 200 时,表示响应已就绪:

xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}

亲自试一试

注释:onreadystatechange 事件被触发 5 次(0 - 4),对应着 readyState 的每个变化。

 ----------------------------------------------------------------------------------------------------------------------------- 

使用 Callback 函数

callback 函数是一种以参数形式传递给另一个函数的函数。

如果您的网站上存在多个 AJAX 任务,那么您应该为创建 XMLHttpRequest 对象编写一个标准的函数,并为每个 AJAX 任务调用该函数。

该函数调用应该包含 URL 以及发生 onreadystatechange 事件时执行的任务(每次调用可能不尽相同):

function myFunction()
{
loadXMLDoc("ajax_info.txt",function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
});
}

亲自试一试


7.AJAX ASP/PHP 请求实例

AJAX 用于创造动态性更强的应用程序。

 ----------------------------------------------------------------------------------------------------------------------------- 

AJAX ASP/PHP 实例

下面的例子将为您演示当用户在输入框中键入字符时,网页如何与 web 服务器进行通信:

请在下面的输入框中键入字母(A - Z):

姓氏:

建议:

亲自试一下源代码

 ----------------------------------------------------------------------------------------------------------------------------- 

实例解释 - showHint() 函数

当用户在上面的输入框中键入字符时,会执行函数 "showHint()" 。该函数由 "onkeyup" 事件触发:

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();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","gethint.asp?q="+str,true);
xmlhttp.send();
}

源代码解释:

如果输入框为空 (str.length==0),则该函数清空 txtHint 占位符的内容,并退出函数。

如果输入框不为空,showHint() 函数执行以下任务:

  • 创建 XMLHttpRequest 对象

  • 当服务器响应就绪时执行函数

  • 把请求发送到服务器上的文件

  • 请注意我们向 URL 添加了一个参数 q (带有输入框的内容)

 ----------------------------------------------------------------------------------------------------------------------------- 

AJAX 服务器页面 - ASP 和 PHP

由上面的 JavaScript 调用的服务器页面是 ASP 文件,名为 "gethint.asp"。

下面,我们创建了两个版本的服务器文件,一个用 ASP 编写,另一个用 PHP 编写。

----------------------------------------------------------------------------------------------------------------------------- 

ASP 文件

"gethint.asp" 中的源代码会检查一个名字数组,然后向浏览器返回相应的名字:

<%
response.expires=-1
dim a(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"
a(30)="Vicky"
'获得来自 URL 的 q 参数
q=ucase(request.querystring("q"))
'如果 q 大于 0,则查找数组中的所有提示
if len(q)>0 then
hint=""
for i=1 to 30
if q=ucase(mid(a(i),1,len(q))) then
if hint="" then
hint=a(i)
else
hint=hint & " , " & a(i)
end if
end if
next
end if
'如果未找到提示,则输出 "no suggestion"
'否则输出正确的值
if hint="" then
response.write("no suggestion")
else
response.write(hint)
end if
%>

PHP 文件

下面的代码用 PHP 编写,与上面的 ASP 代码作用是一样的。

注释:如需在 PHP 中运行这个例子,请将 url 变量的值(Javascript 代码中)由 "gethint.asp" 改为 "gethint.php"。

<?php
// 用名字来填充数组
$a[]="Anna";
$a[]="Brittany";
$a[]="Cinderella";
$a[]="Diana";
$a[]="Eva";
$a[]="Fiona";
$a[]="Gunda";
$a[]="Hege";
$a[]="Inga";
$a[]="Johanna";
$a[]="Kitty";
$a[]="Linda";
$a[]="Nina";
$a[]="Ophelia";
$a[]="Petunia";
$a[]="Amanda";
$a[]="Raquel";
$a[]="Cindy";
$a[]="Doris";
$a[]="Eve";
$a[]="Evita";
$a[]="Sunniva";
$a[]="Tove";
$a[]="Unni";
$a[]="Violet";
$a[]="Liza";
$a[]="Elizabeth";
$a[]="Ellen";
$a[]="Wenche";
$a[]="Vicky";
//获得来自 URL 的 q 参数
$q=$_GET["q"];
//如果 q 大于 0,则查找数组中的所有提示
if (strlen($q) > 0)
{
$hint="";
for($i=0; $i<count($a); $i++)
{
if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q))))
{
if ($hint=="")
{
$hint=$a[$i];
}
else
{
$hint=$hint." , ".$a[$i];
}
}
}
}
// 如果未找到提示,则把输出设置为 "no suggestion"
// 否则设置为正确的值
if ($hint == "")
{
$response="no suggestion";
}
else
{
$response=$hint;
}
//输出响应
echo $response;
?>

7.AJAX 数据库实例

AJAX 可用来与数据库进行动态通信。

----------------------------------------------------------------------------------------------------------------------------- 

AJAX 数据库实例

下面的例子将演示网页如何通过 AJAX 从数据库读取信息:

请在下面的下拉列表中选择一个客户:

请选择一位客户: Apple Computer, Inc.BAIDU, IncCanon USA, Inc.Google, Inc.Nokia CorporationSony Corporation of America

客户信息将在此处列出。

亲自试一下源代码

----------------------------------------------------------------------------------------------------------------------------- 

实例解释 - showCustomer() 函数

当用户在上面的下拉列表中选择某个客户时,会执行名为 "showCustomer()" 的函数。该函数由 "onchange" 事件触发:

function showCustomer(str)
{
var xmlhttp;
if (str=="")
{
document.getElementById("txtHint").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","getcustomer.asp?q="+str,true);
xmlhttp.send();
}

showCustomer() 函数执行以下任务:

  • 检查是否已选择某个客户

  • 创建 XMLHttpRequest 对象

  • 当服务器响应就绪时执行所创建的函数

  • 把请求发送到服务器上的文件

  • 请注意我们向 URL 添加了一个参数 q (带有输入域中的内容)

-----------------------------------------------------------------------------------------------------------------------------  

AJAX 服务器页面

由上面的 JavaScript 调用的服务器页面是 ASP 文件,名为 "getcustomer.asp"。

用 PHP 编写服务器文件也很容易,或者用其他服务器语言。请看用 PHP 编写的相应的例子

"getcustomer.asp" 中的源代码负责对数据库进行查询,然后用 HTML 表格返回结果:

<%
response.expires=-1
sql="SELECT * FROM CUSTOMERS WHERE CUSTOMERID="
sql=sql & "'" & request.querystring("q") & "'"
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open(Server.Mappath("/db/northwind.mdb"))
set rs=Server.CreateObject("ADODB.recordset")
rs.Open sql,conn
response.write("<table>")
do until rs.EOF
for each x in rs.Fields
response.write("<tr><td><b>" & x.name & "</b></td>")
response.write("<td>" & x.value & "</td></tr>")
next
rs.MoveNext
loop
response.write("</table>")
%>

 8.AJAX XML 实例

AJAX 可用来与 XML 文件进行交互式通信。

-----------------------------------------------------------------------------------------------------------------------------  

AJAX XML 实例

下面的例子将演示网页如何使用 AJAX 来读取来自 XML 文件的信息:

获得 CD 信息

亲自试一下源代码

-----------------------------------------------------------------------------------------------------------------------------  

实例解释 - loadXMLDoc() 函数

当用户点击上面的“获得 CD 信息”这个按钮,就会执行 loadXMLDoc() 函数。

loadXMLDoc() 函数创建 XMLHttpRequest 对象,添加当服务器响应就绪时执行的函数,并将请求发送到服务器。

当服务器响应就绪时,会构建一个 HTML 表格,从 XML 文件中提取节点(元素),最后使用已经填充了 XML 数据的 HTML 表格来更新 txtCDInfo 占位符:

function loadXMLDoc(url)
{
var xmlhttp;
var txt,xx,x,i;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
txt="<table border='1'><tr><th>Title</th><th>Artist</th></tr>";
x=xmlhttp.responseXML.documentElement.getElementsByTagName("CD");
for (i=0;i<x.length;i++)
{
txt=txt + "<tr>";
xx=x[i].getElementsByTagName("TITLE");
{
try
{
txt=txt + "<td>" + xx[0].firstChild.nodeValue + "</td>";
}
catch (er)
{
txt=txt + "<td> </td>";
}
}
xx=x[i].getElementsByTagName("ARTIST");
{
try
{
txt=txt + "<td>" + xx[0].firstChild.nodeValue + "</td>";
}
catch (er)
{
txt=txt + "<td> </td>";
}
}
txt=txt + "</tr>";
}
txt=txt + "</table>";
document.getElementById('txtCDInfo').innerHTML=txt;
}
}
xmlhttp.open("GET",url,true);
xmlhttp.send();
}

AJAX 服务器页面

上面这个例子中使用的服务器页面实际上是一个 XML 文件,名为 "cd_catalog.xml"。


9.AJAX 实例

本例演示与 XML 一起使用的 JavaScript (AJAX)。

-----------------------------------------------------------------------------------------------------------------------------  

使用 XMLHttpRequest 对象的实例

通过 XML HTTP 把文本文件载入 HTML 元素

通过 XML HTTP 加载 XML 文件

通过 XML HTTP 进行一次 HEAD 请求

通过 XML HTTP 进行一次指定的 HEAD 请求

把 XML 文件显示为 HTML 表格

例子解释

-----------------------------------------------------------------------------------------------------------------------------  

当用户在文本框中键入内容时,使用 XMLHttp:

当用户键入文本时,通过使用 XML HTTP 与服务器进行在线通信


5、什么是 JSON ?

JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)

JSON 是轻量级的文本数据交换格式

JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。

JSON 具有自我描述性,更易理解


2.1JSON - 转换为 JavaScript 对象

JSON 文本格式在语法上与创建 JavaScript 对象的代码相同。

由于这种相似性,无需解析器,JavaScript 程序能够使用内建的 eval() 函数,用 JSON 数据来生成原生的 JavaScript 对象。


2.2JSON - 简介

在线实例

通过我们的编辑器,您可以在线编辑 JavaScript 代码,然后通过点击一个按钮来查看结果:

JSON 实例

<!DOCTYPE html>
<html><head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<h2>JavaScript 创建 JSON 对象</h2>
<p>
网站名称: <span id="jname"></span><br />
网站地址: <span id="jurl"></span><br />
网站 slogan: <span id="jslogan"></span><br />
</p>
<script>
var JSONObject= { "name":"菜鸟教程",
"url":"www.runoob.com",
"slogan”:”学的不仅是技术,更是梦想!"
};
document.getElementById("jname").innerHTML=JSONObject.namedocument.getElementById("jurl").innerHTML=JSONObject.urldocument.getElementById("jslogan").innerHTML=JSONObject.slogan
</script>
</body>
</html>

尝试一下 »

点击 "尝试一下" 按钮查看在线实例。


与 XML 相同之处

JSON 是纯文本

JSON 具有"自我描述性"(人类可读)

JSON 具有层级结构(值中存在值)

JSON 可通过 JavaScript 进行解析

JSON 数据可使用 AJAX 进行传输


与 XML 不同之处

没有结束标签

更短

读写的速度更快

能够使用内建的 JavaScript eval() 方法进行解析

使用数组

不使用保留字


为什么使用 JSON?

对于 AJAX 应用程序来说,JSON 比 XML 更快更易使用:

使用 XML

读取 XML 文档

使用 XML DOM 来循环遍历文档

读取值并存储在变量中

使用 JSON

读取 JSON 字符串

用 eval() 处理 JSON 字符串


2.3JSON 语法

JSON 语法是 JavaScript 语法的子集。


JSON 语法规则

JSON 语法是 JavaScript 对象表示法语法的子集。

数据在名称/值对中

数据由逗号分隔

大括号保存对象

中括号保存数组


JSON 名称/值对

JSON 数据的书写格式是:名称/值对。

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:

"name" : "菜鸟教程"

这很容易理解,等价于这条 JavaScript 语句:

name = "菜鸟教程"

JSON 值

JSON 值可以是:

数字(整数或浮点数)

字符串(在双引号中)

逻辑值(true 或 false)

数组(在中括号中)

对象(在大括号中)

null


JSON 数字

JSON 数字可以是整型或者浮点型:

{ "age":30 }

JSON 对象

JSON 对象在大括号({})中书写:

对象可以包含多个名称/值对:

{ "name":"菜鸟教程" , "url":"www.runoob.com" }

这一点也容易理解,与这条 JavaScript 语句等价:

name = "菜鸟教程"url = "www.runoob.com"

JSON 数组

JSON 数组在中括号中书写:

数组可包含多个对象:

{"sites": [{ "name":"菜鸟教程" ,
"url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}

在上面的例子中,对象 "sites" 是包含三个对象的数组。每个对象代表一条关于某个网站(name、url)的记录。


JSON 布尔值

JSON 布尔值可以是 true 或者 false:

{ "flag":true }

JSON null

JSON 可以设置 null 值:

{ "runoob":null }

JSON 使用 JavaScript 语法

因为 JSON 使用 JavaScript 语法,所以无需额外的软件就能处理 JavaScript 中的 JSON。

通过 JavaScript,您可以创建一个对象数组,并像这样进行赋值:

实例

var sites = [ { "name":"runoob" , "url":"www.runoob.com" },
{"name":"google","url":"www.google.com"},
{"name":"微博","url":"www.weibo.com"}];

可以像这样访问 JavaScript 对象数组中的第一项(索引从 0 开始):

sites[0].name;

返回的内容是:

runoob

可以像这样修改数据:

sites[0].name="菜鸟教程";

尝试一下 »

在下面的章节,您将学到如何把 JSON 文本转换为 JavaScript 对象。


JSON 文件

JSON 文件的文件类型是 ".json"

JSON 文本的 MIME 类型是 "application/json"


2.4 JSON 对象

对象语法

实例

{ "name":"runoob", "alexa":10000, "site":null }

JSON 对象使用在大括号({})中书写。

对象可以包含多个 key/value(键/值)对。

key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。

key 和 value 中使用冒号(:)分割。

每个 key/value 对使用逗号(,)分割。


访问对象值

你可以使用点号(.)来访问对象的值:

实例

var myObj, x; myObj = { "name":"runoob", "alexa":10000, "site":null }; x = myObj.name;

尝试一下 »

---------------------------------------------------------------------------------------------------------------------------------

你也可以使用中括号([])来访问对象的值:

实例

var myObj, x; myObj = { "name":"runoob", "alexa":10000, "site":null }; x = myObj["name"];

尝试一下 »


循环对象

你可以使用 for-in 来循环对象的属性:

实例

var myObj = { "name":"runoob", "alexa":10000, "site":null };
for(xinmyObj){document.getElementById("demo").innerHTML+=x+"<br>";}

尝试一下 »

---------------------------------------------------------------------------------------------------------------------------------

在 for-in 循环对象的属性时,使用中括号([])来访问属性的值:

实例

var myObj = { "name":"runoob", "alexa":10000, "site":null };
for(xinmyObj){
document.getElementById("demo").innerHTML+=myObj[x]+"<br>";
}

尝试一下 »


嵌套 JSON 对象

JSON 对象中可以包含另外一个 JSON 对象:

实例

myObj = { "name":"runoob", "alexa":10000,
"sites":{
"site1":"www.runoob.com",
"site2":"m.runoob.com",
"site3":"c.runoob.com"
}
}

你可以使用点号(.)或者中括号([])来访问嵌套的 JSON 对象。

---------------------------------------------------------------------------------------------------------------------------------

实例

x = myObj.sites.site1; // 或者x = myObj.sites["site1"];

尝试一下 »


修改值

你可以使用点号(.)来修改 JSON 对象的值:

实例

myObj.sites.site1 = "www.google.com";

尝试一下 »

---------------------------------------------------------------------------------------------------------------------------------

你可以使用中括号([])来修改 JSON 对象的值:

实例

myObj.sites["site1"] = "www.google.com";

尝试一下 »


删除对象属性

我们可以使用 delete 关键字来删除 JSON 对象的属性:

实例

delete myObj.sites.site1;

尝试一下 »

---------------------------------------------------------------------------------------------------------------------------------

你可以使用中括号([])来删除 JSON 对象的属性:

实例

delete myObj.sites["site1"]

尝试一下 »

---------------------------------------------------------------------------------------------------------------------------------

json 对象和 json 字符串的区别:

json 对象

var str2 = { "name": "asan", "sex": "man" };

json字符串

var str1 = '{ "name": "deyuyi", "sex": "man" }';

在使用for遍历时,只能通过 myObj[x] 来获取相应属性的值,而不能使用 myObj.x

<div id="demo"></div>
<script>
var myObj = { "name":"runoob", "alexa":10000, "site":"www.runoob.com" };
for (x in myObj) {
document.getElementById("demo").innerHTML += myObj[x] + "<br>";
}
</script>

尝试一下 »


2.5 json数组

数组作为 JSON 对象

实例

[ "Google", "Runoob", "Taobao" ]

JSON 数组在中括号中书写。

JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。

JavaScript 中,数组值可以是以上的 JSON 数据类型,也可以是 JavaScript 的表达式,包括函数,日期,及 undefined。


JSON 对象中的数组

对象属性的值可以是一个数组:

实例

{"name":"网站", "num":3, "sites":[ "Google", "Runoob", "Taobao" ]}

我们可以使用索引值来访问数组:

实例

x = myObj.sites[0];

尝试一下 »


循环数组

你可以使用 for-in 来访问数组:

实例

for (i in myObj.sites) { x += myObj.sites[i] + "<br>"; }

尝试一下 »

---------------------------------------------------------------------------------------------------------------------------------

你也可以使用 for 循环:

实例

for (i = 0; i < myObj.sites.length; i++) { x += myObj.sites[i] + "<br>"; }

尝试一下 »


嵌套 JSON 对象中的数组

JSON 对象中数组可以包含另外一个数组,或者另外一个 JSON 对象:

实例

myObj = { "name":"网站", "num":3, "sites": [ { "name":"Google", "info":[ "Android", "Google 搜索", "Google 翻译" ] }, { "name":"Runoob", "info":[ "菜鸟教程", "菜鸟工具", "菜鸟微信" ] }, { "name":"Taobao", "info":[ "淘宝", "网购" ] } ]}

我们可以使用 for-in 来循环访问每个数组:

实例

for (i in myObj.sites) { x += "<h1>" + myObj.sites[i].name + "</h1>"; for (j in myObj.sites[i].info) { x += myObj.sites[i].info[j] + "<br>"; }}

尝试一下 »


修改数组值

你可以使用索引值来修改数组值:

实例

myObj.sites[1] = "Github";

尝试一下 »


删除数组元素

我们可以使用 delete 关键字来删除数组元素:

实例

delete myObj.sites[1];

尝试一下 »


2.6 JSON.parse()

JSON 通常用于与服务端交换数据。

在接收服务器数据时一般是字符串。

我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。

---------------------------------------------------------------------------------------------------------------------------------

语法

JSON.parse(text[, reviver])

参数说明:

text:必需, 一个有效的 JSON 字符串。

reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。


JSON 解析实例

例如我们从服务器接收了以下数据:

{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }

我们使用 JSON.parse() 方法处理以上数据,将其转换为 JavaScript 对象:

var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }');

解析前要确保你的数据是标准的 JSON 格式,否则会解析出错。

你可以使用我们的在线工具检测:JSON 在线解析 | 菜鸟工具

解析完成后,我们就可以在网页上使用 JSON 数据了:

实例

<p id="demo"></p> <script>var obj = JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob.com" }'); document.getElementById("demo").innerHTML = obj.name + ":" + obj.site; </script>

尝试一下 »


从服务端接收 JSON 数据

我们可以使用 AJAX 从服务器请求 JSON 数据,并解析为 JavaScript 对象。

实例

var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { myObj = JSON.parse(this.responseText); document.getElementById("demo").innerHTML = myObj.name; }}; xmlhttp.open("GET", "/try/ajax/json_demo.txt", true); xmlhttp.send();

尝试一下 »

查看服务端数据: json_demo.txt


从服务端接收数组的 JSON 数据

如果从服务端接收的是数组的 JSON 数据,则 JSON.parse 会将其转换为 JavaScript 数组:

实例

var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { myArr = JSON.parse(this.responseText); document.getElementById("demo").innerHTML = myArr[1]; }}; xmlhttp.open("GET", "/try/ajax/json_demo_array.txt", true); xmlhttp.send();

尝试一下 »

查看服务端数据: json_demo_array.txt


异常

解析数据

JSON 不能存储 Date 对象。

如果你需要存储 Date 对象,需要将其转换为字符串。

之后再将字符串转换为 Date 对象。

实例

var text = '{ "name":"Runoob", "initDate":"2013-12-14", "site":"www.runoob.com"}'; var obj = JSON.parse(text); obj.initDate = new Date(obj.initDate); document.getElementById("demo").innerHTML = obj.name + "创建日期: " + obj.initDate;

尝试一下 »

---------------------------------------------------------------------------------------------------------------------------------

我们可以启用 JSON.parse 的第二个参数 reviver,一个转换结果的函数,对象的每个成员调用此函数。

实例

var text = '{ "name":"Runoob", "initDate":"2013-12-14", "site":"www.runoob.com"}'; var obj = JSON.parse(text, function (key, value) { if (key == "initDate") { return new Date(value); } else { return value; }}); document.getElementById("demo").innerHTML = obj.name + "创建日期:" + obj.initDate;

尝试一下 »


解析函数

JSON 不允许包含函数,但你可以将函数作为字符串存储,之后再将字符串转换为函数。

实例

var text = '{ "name":"Runoob", "alexa":"function () {return 10000;}", "site":"www.runoob.com"}'; var obj = JSON.parse(text); obj.alexa = eval("(" + obj.alexa + ")"); document.getElementById("demo").innerHTML = obj.name + " Alexa 排名:" + obj.alexa();

尝试一下 »

不建议在 JSON 中使用函数。


浏览器支持

主流浏览器都支持 JSON.parse() 函数:

Firefox 3.5

Internet Explorer 8

Chrome

Opera 10

Safari 4

 JSON 数组         JSON.stringify()

eval(string):函数可计算某个字符串,并执行其中的的 JavaScript 代码。

eval("var a=1"); // 声明一个变量a并赋值1。
eval("2+3"); // 执行加运算,并返回运算值。
eval("mytest()"); // 执行mytest()函数。
eval("{b:2}"); // 声明一个对象。

对于服务器返回的JSON字符串,如果 jQuery 异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将该字符串放于 eval()中执行一次。这种方式也适合以普通 javascipt 方式获取 json 对象,以下举例说明:

var u = eval('('+user+')');

为什么要 eval 这里要添加 ('('+user+')') 呢?

原因在于:eval 本身的问题。 由于 json 是以 {} 的方式来开始以及结束的,在 js 中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。

加上圆括号的目的是迫使 eval 函数在处理 JavaScript 代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量 {},如若不加外层的括号,那么 eval 会将大括号识别为 javascript 代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:

alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]

测试实例

var user = '{name:"张三",age:23,'+
'address:{city:"青岛",zip:"266071"},'+ 'email:"iteacher@haiersoft.com.cn",'+
'showInfo:function(){'+
'document.write("姓名:"+this.name+"<br/>");'+
'document.write("年龄:"+this.age+"<br/>");'+
'document.write("地址:"+this.address.city+"<br/>");'+
'document.write("邮编:"+this.address.zip+"<br/>");'+
'document.write("E-mail:"+this.email+"<br/>");} }';
var u = eval('('+user+')');
u.showInfo();

尝试一下 »


2.7 JSON.stringify()

JSON 通常用于与服务端交换数据。

在向服务器发送数据时一般是字符串。

我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串。

---------------------------------------------------------------------------------------------------------------------------------

语法

JSON.stringify(value[, replacer[, space]])

参数说明:

value:

必需, 一个有效的 JSON 字符串。

replacer:

可选。用于转换结果的函数或数组。

如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。

如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。当 value 参数也为数组时,将忽略 replacer 数组。

space:

可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 有可以使用非数字,如:\t。


JavaScript 对象转换

例如我们向服务器发送以下数据:

var obj = { "name":"runoob", "alexa":10000, "site":"www.runoob.com"};

我们使用 JSON.stringify() 方法处理以上数据,将其转换为字符串:

var myJSON = JSON.stringify(obj);

myJSON 为字符串。

我们可以将 myJSON 发送到服务器:

实例

var obj = { "name":"runoob", "alexa":10000, "site":"www.runoob.com"}; var myJSON = JSON.stringify(obj); document.getElementById("demo").innerHTML = myJSON;

尝试一下 »


JavaScript 数组转换

我们也可以将 JavaScript 数组转换为 JSON 字符串:

实例

var arr = [ "Google", "Runoob", "Taobao", "Facebook" ]; var myJSON = JSON.stringify(arr);

myJSON 为字符串。

我们可以将 myJSON 发送到服务器:

实例

var arr = [ "Google", "Runoob", "Taobao", "Facebook" ]; var myJSON = JSON.stringify(arr); document.getElementById("demo").innerHTML = myJSON;

尝试一下 »


异常

解析数据

JSON 不能存储 Date 对象。

JSON.stringify() 会将所有日期转换为字符串。

实例

var obj = { "name":"Runoob", "initDate":new Date(), "site":"www.runoob.com"}; var myJSON = JSON.stringify(obj); document.getElementById("demo").innerHTML = myJSON;

尝试一下 »

之后你可以再将字符串转换为 Date 对象。


解析函数

JSON 不允许包含函数,JSON.stringify() 会删除 JavaScript 对象的函数,包括 key 和 value。

实例

var obj = { "name":"Runoob", "alexa":function () {return 10000;}, "site":"www.runoob.com"}; var myJSON = JSON.stringify(obj); document.getElementById("demo").innerHTML = myJSON;

尝试一下 »

---------------------------------------------------------------------------------------------------------------------------------

我们可以在执行 JSON.stringify() 函数前将函数转换为字符串来避免以上问题的发生:

实例

var obj = { "name":"Runoob", "alexa":function () {return 10000;}, "site":"www.runoob.com"}; obj.alexa = obj.alexa.toString(); var myJSON = JSON.stringify(obj); document.getElementById("demo").innerHTML = myJSON;

尝试一下 »

不建议在 JSON 中使用函数。


浏览器支持

主流浏览器都支持 JSON.stringify() 函数:

Firefox 3.5

Internet Explorer 8

Chrome

Opera 10

Safari 4


2.8JSON 使用

把 JSON 文本转换为 JavaScript 对象

JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 JavaScript 对象,然后在网页中使用该数据。

为了更简单地为您讲解,我们使用字符串作为输入进行演示(而不是文件)。


JSON 实例 - 来自字符串的对象

创建包含 JSON 语法的 JavaScript 字符串:

var txt = '{ "sites" : [' + '{ "name":"菜鸟教程" , "url":"www.runoob.com" },' + '{ "name":"google" , "url":"www.google.com" },' + '{ "name":"微博" , "url":"www.weibo.com" } ]}';

由于 JSON 语法是 JavaScript 语法的子集,JavaScript 函数 eval() 可用于将 JSON 文本转换为 JavaScript 对象。

eval() 函数使用的是 JavaScript 编译器,可解析 JSON 文本,然后生成 JavaScript 对象。必须把文本包围在括号中,这样才能避免语法错误:

var obj = eval ("(" + txt + ")");

在网页中使用 JavaScript 对象:

实例

var txt = '{ "sites" : [' + '{ "name":"菜鸟教程" , "url":"www.runoob.com" },' + '{ "name":"google" , "url":"www.google.com" },' + '{ "name":"微博" , "url":"www.weibo.com" } ]}'; var obj = eval ("(" + txt + ")"); document.getElementById("name").innerHTML=obj.sites[0].name document.getElementById("url").innerHTML=obj.sites[0].url

尝试一下 »


JSON 解析器

   eval() 函数可编译并执行任何 JavaScript 代码。这隐藏了一个潜在的安全问题。

使用 JSON 解析器将 JSON 转换为 JavaScript 对象是更安全的做法。JSON 解析器只能识别 JSON 文本,而不会编译脚本。

在浏览器中,这提供了原生的 JSON 支持,而且 JSON 解析器的速度更快。

较新的浏览器和最新的 ECMAScript (JavaScript) 标准中均包含了原生的对 JSON 的支持。

Web 浏览器支持Web 软件支持

Firefox (Mozilla) 3.5

Internet Explorer 8

Chrome

Opera 10

Safari 4

jQuery

Yahoo UI

Prototype

Dojo

ECMAScript 1.5

尝试一下 »

对于较老的浏览器,可使用 JavaScript 库: GitHub - douglascrockford/JSON-js: JSON in JavaScript

JSON 格式最初是 originally specified by Douglas Crockford


2.9 JSONP 教程

本章节我们将向大家介绍 JSONP 的知识。

Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。

为什么我们从不同的域(网站)访问数据需要一个特殊的技术(JSONP )呢?这是因为同源策略。

同源策略,它是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略。


JSONP 应用

1. 服务端JSONP格式数据

如客户想访问 : http://www.runoob.com/try/ajax/jsonp.php?jsonp=callbackFunction。

假设客户期望返回JSON数据:["customername1","customername2"]。

真正返回到客户端的数据显示为: callbackFunction(["customername1","customername2"])。

服务端文件jsonp.php代码为:

jsonp.php 文件代码

<?phpheader('Content-type: application/json');
//获取回调函数名
$jsoncallback=htmlspecialchars($_REQUEST['jsoncallback']);
//json数据
$json_data='["customername1","customername2"]';
//输出jsonp格式的数据
echo$jsoncallback."(".$json_data.")";?>

2. 客户端实现 callbackFunction 函数

<script type="text/javascript">
functioncallbackFunction(result,methodName){
varhtml='<ul>';
for(vari=0;i<result.length;i++){
html+='<li>'+result[i]+'</li>';
}
html+='</ul>';
document.getElementById('divCustomers').innerHTML=html;
}
</script>

页面展示

<div id="divCustomers"></div>

客户端页面完整代码

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP 实例</title>
</head>
<body>
<div id="divCustomers"></div>
<script type="text/javascript">
function callbackFunction(result, methodName) {
varhtml='<ul>';
for(vari=0;i<result.length;i++){
html+='<li>'+result[i]+'</li>';
}
html+='</ul>';
document.getElementById('divCustomers').innerHTML=html;
}
</script>
<script type="text/javascript" src="http://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction"></script>
</body>
</html>

jQuery 使用 JSONP

以上代码可以使用 jQuery 代码实例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP 实例</title>
<script src="http://cdn.static.runoob.com/libs/jquery/1.8.3/jquery.js">
</script>
</head>
<body>
<div id="divCustomers"></div>
<script>
$.getJSON("http://www.runoob.com/try/ajax/jsonp.php?jsoncallback=?",
function(data){
var html = '<ul>';
for(var i = 0; i < data.length; i++) {
html += '<li>' + data[i] + '</li>';
}
html += '</ul>'; $('#divCustomers').html(html);
});
</script>
</body>

作者:Darren

QQ:603026148

以上内容归靳烨所有,如果有什么错误或者不足的地方请联系我,希望我们共同进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从码农到码到成功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值