您的位置:首页 > Web前端 > JavaScript

JavaScript学习笔记一AJAX和JSON

2012-06-18 11:06 661 查看
一、JSON介绍
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 对象是唯一的参数。

function (XMLHttpRequest) {

this; // the options for this ajax request

}

cache

Boolean

(默认: true) jQuery 1.2 新功能,设置为 false 将不会从浏览器缓存中加载请求信息。

complete

Function

请求完成后回调函数 (请求成功或失败时均调用)。参数: XMLHttpRequest 对象,成功信息字符串。

function (XMLHttpRequest, textStatus) {

this; // the options for this ajax request

}

contentType

String

(默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多数应用场合。

data

Object,

String

发送到服务器的数据。将自动转换为请求字符串格式。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 对象,错误信息,(可能)捕获的错误对象。

function (XMLHttpRequest, textStatus, errorThrown) {

// 通常情况下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

请求成功后回调函数。这个方法有两个参数:服务器返回数据,返回状态

function (data, textStatus) {

// 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}});},
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: