JSON是一种数据交换格式,类型大致分为:数组(有序数据的集合,只有VALUE)和对象(无序数据集合,有KEY和VALUE)。
(1) 并列数据之间用逗号分割。
["北京",16800,1600]
(2) KEY-VALUE映射关系用冒号表示。
{"城市":"北京","面积":16800,"人口":1600}
(3) 并列数据的集合(数组)用方括号表示。
[
["北京",16800,1600],
["上海",6400,1800]
]
(4) 映射集合(对象)用大括号表示。
[
{"城市":"北京","面积":16800,"人口":1600},
{"城市":"上海","面积":6400,"人口":1800}
]
JavaScript举例:
k1 : {
nadd : { var n = 99;alert(n);}
}
k1.nadd; //99
k1[nadd]; //99
function showcity(data){alert("城市:"+data.city+"面积:"+data.area);}
showcity('{"city":"上海","area":"6400","person":"1800"}');
JavaScript使用JSON和字符串
//JSON
var x = '{"city":"上海","area":"6400"}';
//字符串
var x = {"city":"上海","area":"6400"};
二、AJAX介绍
AJAX是在无需重新加载全部页面的情况下,调用HTTP_REQUEST请求更新部分网页的技术。传统方式POST数据使用表单、GET数据重新加载整个页面。
AJAX的核心是XMLHttpRequest对象,用JavaScript实现AJAX一般有两种方法:使用XMLHttpRequest对象的API;使用Jquery库的AJAX功能。
(1) 使用XMLHttpRequest对象的API实现AJAX
//创建一个XMLHttpRequest()实例对象(注意兼容性:IE浏览器的命令不一致)
#var request = new XMLHttpRequest();
//初始化XMLHttpRequest()实例对象
#request.open("method","URL",async);
method(请求类型) = GET or POST
URL = 请求执行文件的路径
async = true(异步) or false (同步)
//设置请求包的格式(便于服务器端取参数$_POST['s'])和发送请求包
#request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
#request.send(request_package)
//XMLHttpRequest对象响应
onreadystatechange事件记录了XMLHttpRequest对象响应状态
readyState:AJAX状态值(0: 请求未初始化;1: 服务器连接已建立;2: 请求已接收;3: 请求处理中;4: 请求已完成,且响应已就绪)
Status:服务器返回HTTP头信息代码(如:200:页面加载成功;404:没有发现请求文件)
xmlhttp.onreadystatechange=function()
if (xmlhttp.readyState==4 && xmlhttp.status==200){//do something;}
}
//取返回值(返回值格式数据格式是文本格式,可以设置为XML格式)
var content = request_get.response;
(2) 使用Jquery库实现AJAX
//创建jquery.ajax([option])实例对象
$.ajax({
type: 'post', //请求类型=GET or POST
url: '../../xxx?act=yyy&mod=zzz', //请求执行文件的路径
cache: 'false', //是否从浏览器缓存中加载请求信息(默认=true)
dataType: 'json', //交换数据格式是JSON
data:{'x1':y1,'x2':y2}, //POST数据
success:function(){//do something},
error:function(){//do something}
});
参数列表:
参数名 | 类型 | 描述 |
url | String | (默认: 当前页地址) 发送请求的地址。 |
type | String | (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。 |
timeout | Number | 设置请求超时时间(毫秒)。此设置将覆盖全局设置。 |
async | Boolean | (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。 |
beforeSend | Function | 发送请求前可修改 XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。XMLHttpRequest 对象是唯一的参数。 this; // the options for this ajax request } |
cache | Boolean | (默认: true) jQuery 1.2 新功能,设置为 false 将不会从浏览器缓存中加载请求信息。 |
complete | Function | 请求完成后回调函数 (请求成功或失败时均调用)。参数: XMLHttpRequest 对象,成功信息字符串。 this; // the options for this ajax request } |
contentType | String | (默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多数应用场合。 |
data | Object, | 发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。 |
dataType | String | 预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText,并作为回调函数参数传递,可用值: "xml": 返回 XML 文档,可用 jQuery 处理。 "html": 返回纯文本 HTML 信息;包含 script 元素。 "script": 返回纯文本 JavaScript 代码。不会自动缓存结果。 "json": 返回 JSON 数据 。 "jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。 |
error | Function | (默认: 自动判断 (xml 或 html)) 请求失败时将调用此方法。这个方法有三个参数:XMLHttpRequest 对象,错误信息,(可能)捕获的错误对象。 // 通常情况下textStatus和errorThown只有其中一个有值 this; // the options for this ajax request } |
global | Boolean | (默认: true) 是否触发全局 AJAX 事件。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或 ajaxStop 。可用于控制不同的Ajax事件 |
ifModified | Boolean | (默认: false) 仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified 头信息判断。 |
processData | Boolean | (默认: true) 默认情况下,发送的数据将被转换为对象(技术上讲并非字符串) 以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。 |
success | Function | 请求成功后回调函数。这个方法有两个参数:服务器返回数据,返回状态 // data could be xmlDoc, jsonObj, html, text, etc... this; // the options for this ajax request } |
三、跨域请求
(1) 同源策略简介
以http://blog.csdn.net/index.html为例(http的默认端口是80,https的默认端口是443。)URL由四个部分组成:
协议:http
主机:blog.csdn.net
端口:80
路径:/index.html
同源(域或domain)就是要求URL的协议、主机和端口都相同。举例:
其他URL | 是否同源 | 原因 |
http://blog.csdn.net/json.php | 是 |
|
https://blog.csdn.net/index.html | 否 | 协议,端口不同 |
http://blog.csdn.net:81/index.html | 否 | 端口不同 |
http://www.csdn.net/ | 否 | 主机不同 |
JavaScript同源策略是用来组织一个源的JavaScript调用另一个源的JavaScript(例如:http://blog.csdn.net/index.html页加载的JavaScript无法对http://bbs.csdn.net/发起XMLHttpRequest(AJAX)请求)。
对于http://blog.csdn.net/index.html和http://bbs.csdn.net/可以执行下面的JavaScript语句:
#document.domain = "csdn.net";
这样两个页面就是同一个源,且端口设置为NULL。
(2) 利用回调函数实现跨域请求JSONP
为了避开JavaScript同源策略的限制,实现跨域请求。制定了一个非正式的协议JSONP,JSONP中包含了回调函数,通过回调函数实现跨域请求。具体步骤如下:
1.在源A对源B的可执行文件M发送请求,请求包含回调函数。(URL携带参数?callback=FUN_A)设置请求包的格式(如:JSON)
2.执行源B的文件M输出执行结果,设置返回包格式(如:JSON格式:FUN_A(参数))
3.源A重解析页面并注入脚本<script src="url?callback=FUN_A" type="txt/javascript"></script>
4.源A加载JavaScript执行FUN_A(参数)
利用回调函数实现跨域请求JSONP
1. 在服务器端设置JSONP协议接受和发送口。
//源A执行文件M创建输入
<?php
$callback=isset($_REQUEST['callback'])?$_REQUEST['callback']:"callback";
if($callback == "FUN_A"){//do something}
//源A执行文件M创建输出
header('Content-type:application/json');
echo $callback . "(" . json_encode($output) . ")";
2. 在客户端设置脚本注入和回调函数
//源B的JavaSript脚本创建脚本注入
call:function(){
var url = "http://B/M.php?callback=M";
var script = document.createElement("script");
script.setAttribute("src",url);
script.setAttribute("type","text/javascript");
document.getElementsByTagName("head")[0].appendChild(script);
},
//源B的JavaSript脚本创建回调函数
M:function(data){//do something;}
利用JSONP协议完成跨域请求实际是一种脚本注入,但是有如下缺点:
1. 不能接受HTTP状态码
2. 不能使用POST提交(默认GET)
3. 不能发送和接受HTTP头
4. 不能设置同步调用(默认异步)
5. 不能提供请求的错误返回码(请求状态码和服务器返回码)
(3) 利用JQuery库实现跨域请求JSONP
1. 在服务器端设置JSONP协议接受和发送口。(与利用回调函数实现跨域请求一致)
2. 在客户端设置Jquery函数。
call:function(){
$.ajax({
async:false,
type:'get',
url:'http://B/item.php?act=M',
cache:false,
dataType:'jsonp',
data:{},
timeout:5000,
success:function(para){//do something}});},