Ajax是异步的javacript和xml
发音:
Ajax [ˈeɪˌdʒæks]javascript
传统方式(同步):一个请求对应一个回应,他们是同步的,回应不完成,没办法对这个页面进行操做。
具体解释:
客户端要发一个请求,服务器端要去处理,响应,这时候客户端彻底是在等待,等待服务器端的处理和响应。当服务器端的处理和响应完成事后,客户端会从新载入页面,这时候若是有错误,只能再次发起请求,再次等待。
异步:
说明:填写复杂的表单,填写到邮箱地址的时候,页面当时就把邮箱的地址发送到服务器,也就是页面发送了一个请求,服务器去作处理和响应,获得你的邮箱和地址填写重复,他会把响应结果发给页面,可是在这个过程当中,依然能够填写其余的内容。这时候服务器告诉你已经有重复的邮箱的地址,在页面的表现只是在邮箱地址的旁边标上一行字,把整个文本框标红,并无从新刷新页面,这样 表单上的错误会实时的标注出来,你也能够实时的更正错误。这个过程你不会有整个页面的刷新,也不会有整个页面的提交和等待。也就是说:当你最后点击一下提交,一切都会搞定,这就是ajax出现后的异步。
**异步实现步骤:*8
1.运用HTML和CSS来实现页面,表达信息。
2.运用XMLHttpRequest和web服务器进行数据的异步交换
3.运用JavaScript操做DOM,实现动态局部刷新php
首先要是实例化一个XMLHttpRequest对象
var request = new XMLHttpRequest();
注意:
全部现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。
XMLHttpRequest 用于在后台与服务器交换数据。这意味着能够在不从新加载整个网页的状况下,对网页的某部分进行更新。
Ie5,ie6是不支持标准的XMLHttpRequest的.html
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"); }
http是计算机经过网络进行通讯的规则
http是一种无状态协议
1.一个完整的HTTP请求的过程,一般有7个步骤:
(1)创建TCP链接
(2)Web浏览器向Web服务器发送请求命令
(3)Web浏览器发送请求头信息
(4)Web服务器应答
(5)Web服务器发送应答头信息
(6)Web服务器向浏览器发送数据
(7)Web服务器关闭TCP链接
2.一个HTTP请求通常由四部分组成:
(1)HTTP请求的方法或动做,好比是GET仍是POST请求。
(2)正在请求的URL,总得知道请求的地址是什么吧
(3)请求头,包含一些客户端环境信息,身份证信息等
(4)请求体,也就是请求正文,请求正文中能够包含客户提交的查询字符串信息,表单信息等等。
(通常请求头和请求体之间有个空行,这个空行很重要,表示请求头已经结束了,)
HTTP请求例子:
3.提交数据的方式
GET方法:
通常用于信息获取
使用URL传递参数
对于发送的信息数量也有限制,通常在2000个字符左右
POST方法:
通常用于修改服务器上的资源。 对于所发的信息量无限制
4.一个HTTP响应通常由三部分组成
(1)一个数字和文字组成的状态码,用来显示请求成功仍是失败;
(2)响应头,响应头也和请求头同样,包含许多包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等。
(3)响应体,也就是响应正文。
5.HTTP状态码:
HTTP状态码由3位数字构成,其中首位数字定义了状态码的类型:
1XX:信息类,表示收到Web浏览器请求,正在进一步的处理中。
2XX:成功,表示用户请求被正确接收,理解和处理,例如:200 OK
3XX:重定向,表示请求没有成功,客户必须采起进一步的动做
4XX:客户端错误,表示客户端提交的请求有错误,例如:400 NOT FOUND 意味着请求中所引发的文档不存在
5XX:服务器错误,表示服务器不能完成对请求的处理:如500
java
open(method,url,async) 发送请求方法 地址 请求同步/异步,通常是异步,默认值为true
send(string)
在使用 GET 方式请求时无需填写参数
在使用 POST 方式时参数表明着向服务器发送的数据web
例子
setRequestHeader 必需要写在 open()和sent()的中间,不然会出错误ajax
//完整的GET请求 var oAjax = new XMLHttpRequest();//建立Ajax对象 oAjax.open("GET","create.php",true);//链接服务器 oAjax.send();//发送请求
//完整的POST发送请求 var oAjax = new XMLHttpRequest();//建立 oAjax.open("POST","create.php",true);//"POST" oAjax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");//设置HTTP头信息.必须在open与send之间,不然出现异常. oAjax.send("name=陈二狗&sex=男");//发送给服务器的内容
XMLHttpRequest取得响应:
1.建立XMLHttpRequest对象;
2.调用open();
3.放入一些数据;
4.对这个过程进行监听,来知道服务器是否作出响应;
5.作一些事情,好比说获取服务器响应的内容、页面上的一些重现。
对服务器的相应进行监听:chrome
request.onreadystatechange = function({……}) request.onreadystatechange = function() { if (request.readyState === 4 && request.status === 200) { //处理request.responseText } }
首先须要下载xampp的安装包。
http://xampps.com/
解压安装包,安装地点在D盘,安装完成,启动XAMPP
在XAMPP控制面板中,咱们能够看到Service一列的单选框略有不一样,“X”表示相应组件尚未设为Windows系统服务;“空白”表示没有安装该组件;此外还有“√”,表示该组件已经安装成为Windows系统服务,能够start。
下面咱们就单击Apache和MySQL前的“X”,在弹出的对话框中点击“Yes”,将它们设为系统服务。
第1步:点击XAMPP控制面板上的start按钮,启动Apache服务器。如图所示,启动Apache后会在按钮和下方状态中看到变化
咱们看到面板上输出了xampp的初始化日志。
提示Apache的80端口被占用了,
因而win+r 运行cmd,输入netstat -ano
看来咱们须要修改系统设置来更换一个端口号。
点击右上角的【系统设置】->【Service and Port Settings】,修改对应的端口号,而后点击【Save】保存。
修改Apache端口后,须要同时修改配置文件。
点击Apache后的【Config】,选择httpd- conf,打开配置文件。
搜索Listen,把后边的端口号,调整为咱们刚刚修改后的端口号,保存。重启下电脑
回到控制面板,点击咱们要启动的应用后边的【Start】,面板上【Module】列变色,【PID】有值,说明咱们的程序启动好了。
打开浏览器,输入localhost,看到了php相关的信息。
至此,咱们的环境已经搭建好了。
第2步:Apache默认的应用程序运行的根目录是\xampp\htdocs,打开htdocs文件夹,咱们会发现最后有一个index.php文件,接下来咱们就要在浏览器中访问这个文件,验证PHP环境是否已经配置成功。
第3步:打开浏览器,输入网址:http://localhost:81/index.php,
出现XAMPP的管理页面,说明PHP能够正常运行,环境搭建成功。接下来就能够编写PHP进行项目开发了。
问题:个人网络文档应该放在哪里?
全部网络文档都放在 htdocs 主文件夹中(.\xampp\htdocs)。
1)找到配置文件,并在xampp/htdocs下面新建一个文件夹做为你的根目录,譬如:demo。
2)、在根目录随便建立一个HTML文件,输入文字以备测试,譬如:index.html
三、打开chrome浏览器,输入:localhost/根目录/HTML文件名,若是能够出现就说明运行本地服务器成功,譬如:
localhost/demo/index.html
数据库
1.例子概述
(1)查询员工的基本信息,经过查询员工的编号来查询员工的基本信息
(2)新建员工信息,包括员工姓名,员工编号,员工性别,员工岗位
这个例子中;
Html页面,用来实现员工查询和新建的页面
Php页面,用来实现查询员工和新建员工的后台接口
2.设置站点
上面咱们已经配置好了php环境,咱们来用dreamwear设置下站点
php测试页面json
<h1> 这是一个测试页面 <?php echo "hello word" ?> </h1>
解释下:
(1)php是以<?php 开头,以?>结尾
(2)php的默认文件扩展名是.php
(3)php的语句是以;结尾
(4)echo() 函数输出一个或多个字符串。
直接输出字符或字符串的意思:例如:echo "abc"; 就会输出abc echo 'abc' 同样是输出abc . 若是仅仅只输出字符串的话,单引号和双引号是输出内容是同样的,若是要输出字符串变量,例如字符串变\(a='abc'; echo "\)a123" 则会输出abc123 ,但若是用 echo '\(a123' 则只会输出\)a123 ,也就是说单引号里面的内容会原样输出,而双引号则会判断里面有没有变量,有变量的话则转化为变量的值。
结果:
3.页面设置
Php页面(用来实现查询员工和新建员工的后台接口):数组
<?php //设置页面内容是html编码格式是utf-8 header("Content-Type: text/plain;charset=utf-8"); //响应过来的内容格式是纯文本 //header("Content-Type: application/json;charset=utf-8"); //响应过来的内容格式是json字符串 //header("Content-Type: text/xml;charset=utf-8"); //header("Content-Type: text/html;charset=utf-8"); //header("Content-Type: application/javascript;charset=utf-8"); //定义一个多维数组,包含员工的信息,每条员工信息为一个数组,定义姓名编号岗位。 //它能够包含这样一个键值的方式。由于这只是一个简单的例子,因此就把员工的信息都定义在多维数组中,而再也不存储数据库。 $staff = array ( array("name" => "洪七", "number" => "101", "sex" => "男", "job" => "总经理"), array("name" => "郭靖", "number" => "102", "sex" => "男", "job" => "开发工程师"), array("name" => "黄蓉", "number" => "103", "sex" => "女", "job" => "产品经理") ); //判断若是是get请求,则进行搜索;若是是POST请求,则进行新建 //$_SERVER是一个超全局变量,在一个脚本的所有做用域中均可用,不用使用global关键字 //$_SERVER["REQUEST_METHOD"]返回访问页面使用的请求方法 if ($_SERVER["REQUEST_METHOD"] == "GET") { search(); } elseif ($_SERVER["REQUEST_METHOD"] == "POST"){ create(); } //经过员工编号搜索员工 function search(){ //检查是否有员工编号的参数 //isset检测变量是否设置;empty判断值为否为空 //超全局变量 $_GET 和 $_POST 用于收集表单数据 if (!isset($_GET["number"]) || empty($_GET["number"])) { echo "参数错误"; return; } //函数以外声明的变量拥有 Global 做用域,只能在函数之外进行访问。 //global 关键词用于访问函数内的全局变量 global $staff; //获取number参数 $number = $_GET["number"]; $result = "没有找到员工。"; //遍历$staff多维数组,查找key值为number的员工是否存在,若是存在,则修改返回结果 foreach ($staff as $value) { if ($value["number"] == $number) { $result = "找到员工:员工编号:" . $value["number"] . ",员工姓名:" . $value["name"] . ",员工性别:" . $value["sex"] . ",员工职位:" . $value["job"]; break; } } echo $result; } //建立员工 function create(){ //判断信息是否填写彻底 if (!isset($_POST["name"]) || empty($_POST["name"]) || !isset($_POST["number"]) || empty($_POST["number"]) || !isset($_POST["sex"]) || empty($_POST["sex"]) || !isset($_POST["job"]) || empty($_POST["job"])) { echo "参数错误,员工信息填写不全"; return; } //TODO: 获取POST表单数据并保存到数据库 //提示保存成功 echo "员工:" . $_POST["name"] . " 信息保存成功!"; } ?>
相关知识点:
1)
PHP文件插入header("Content-type: text/html; charset=utf-8");
至关于页面里面的<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
2)
//定义一个多维数组,包含员工的信息,每条员工信息为一个数组,定义姓名编号岗位。 //它能够包含这样一个键值的方式。由于这只是一个简单的例子,因此就把员工的信息都定义在多维数组中,而再也不存储数据库。 $staff = array ( array("name" => "洪七", "number" => "101", "sex" => "男", "job" => "总经理"), );
3)请求的判断
$_SERVER
是一个超全局变量,在一个脚本的所有做用域中均可用,不用使用global关键字
在函数中使用$staff
这样一个全局变量。咱们须要这样global $staff;
来定义一下,不然直接使用$staff
会报错
可是这种超全局变量就不会出现这种状况,咱们在哪里均可以使用,
$_SERVER["REQUEST_METHOD"]
这个变量表示的是表单提交数据的方式,get或者post
4)经过员工编号搜索员工思路
if (!isset($_GET["number"]) empty($_GET["number"])) { echo "参数错误"; return; }
(1)首先咱们检查一下参数里边有没有员工的编号,若是没有员工的编号,咱们是无法搜索员工的
(2)先检查一下咱们的GET的url参数中有没有number这么一个字段,isset是检查变量是否设置,也就是这个number变量有没有,empty表明这个变量是否为空,在这里,若是这个变量没有或者为空,咱们都显示参数错误:echo "参数错误";也就是说页面直接返回“参数错误”,在浏览器中预览一下,咱们没有任何参数的状况下,表明的是一个get请求,当咱们没有加number参数的时候。它会直接返回参数错误,固然若是有参数错误,就直接查询了。查询,就把这个number参数获取到。
(3)查询结果,先是没有找到,而后遍历$staff多维数组
,若是数组中某条记录的number等于咱们传进来的员工编号,就把这个结果改为找到员工,并显示员工信息,而后终止循环,把结果打印出来。
//函数以外声明的变量拥有 Global 做用域,只能在函数之外进行访问。 //global 关键词用于访问函数内的全局变量,在函数中使用$staff这样一个全局变量。//咱们须要这样global $staff;来定义一下,不然直接使用$staff会报错 global $staff; //获取number参数 $number = $_GET["number"]; $result = "没有找到员工。"; //遍历$staff多维数组,查找key值为number的员工是否存在,若是存在,则修改//返回结果 foreach ($staff as $value) { if ($value["number"] == $number) { $result = "找到员工:员工编号:" . $value["number"] . ",员工姓名:" . $value["name"] . ",员工性别:" . $value["sex"] . ",员工职位:" . $value["job"]; break; } }
5)新建员工信息思路
(1)咱们先判断下信息是否填写彻底,name,number,sex,job等等这些字段是否是都有值。
(2)一旦某个字段没有值!isset($_POST["name"])
或者值为空empty($_POST["name"])
,就显示参数错误,员工信息填写不全echo "参数错误,员工信息填写不全";
//建立员工 function create(){ //判断信息是否填写彻底 if (!isset($_POST["name"]) || empty($_POST["name"]) || !isset($_POST["number"]) || empty($_POST["number"]) || !isset($_POST["sex"]) || empty($_POST["sex"]) || !isset($_POST["job"]) || empty($_POST["job"])) { echo "参数错误,员工信息填写不全"; return; } //TODO: 获取POST表单数据并保存到数据库 //提示保存成功 echo "员工:" . $_POST["name"] . " 信息保存成功!"; }
6.服务器端测试
你们在平常进行web开发的时候,有时候后台作好以后,老是等待依赖前台作好以后,能够去调试,其实彻底没有必要
咱们只须要约定好接口, 发送的报文和返回的报文,经过fiddler或者相似的工具,直接就能够进行调试了。不须要依赖前台是否完成
在没有客户端的状况下对服务端信息进行测试
1)
Excute执行以后,左边会有一条信息
双击这条信息,右侧的textview下方会有服务器返回的相应信息
2)http://localhost/ajaxdemo/server.php?number=101
获得结果
3).post请求
(1)由于是post请求,因此服务器地址不须要加上参数
(2)须要加上Content-Type:"application/x-www-form-urlencoded"
(3)须要在Request Body里填写息相关信息
获得结果
7.客户端测试
html页面:
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Demo</title> <style> body, input, select, button, h1 { font-size: 28px; line-height:1.7; } </style> </head> <body> <h1>员工查询</h1> <label>请输入员工编号:</label> <input type="text" id="keyword" /> <button id="search">查询</button> <p id="searchResult"></p> <h1>员工新建</h1> <label>请输入员工姓名:</label> <input type="text" id="staffName" /><br> <label>请输入员工编号:</label> <input type="text" id="staffNumber" /><br> <label>请选择员工性别:</label> <select id="staffSex"> <option>女</option> <option>男</option> </select><br> <label>请输入员工职位:</label> <input type="text" id="staffJob" /><br> <button id="save">保存</button> <p id="createResult"></p> alert <script> document.getElementById("search").onclick = function() { //发送查询请求并调用 //new一个XMLHttpRequest() var request; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari request=new XMLHttpRequest(); } else {// code for IE6, IE5 reques=new ActiveXObject("Microsoft.XMLHTTP"); } //请求的地址须要带参数,参数为id为keyword的input的值 //get方式添加数据 request.open("GET", "server.php?number="+encodeURI(document.getElementById('keyword').value)+"&" + new Date().getTime() ); request.send(); request.onreadystatechange = function() { //获取服务器上的readystate的改变,当他为4的时候说明请求已经结束了,当他为202的时候说明请求成功 //先判断他readystate是否为4,当他为202的时候id为searchResult的内容为 request.responseText,不然alert if (request.readyState===4) { if (request.status===200) { document.getElementById("searchResult").innerHTML = request.responseText; } else { alert("发生错误:" + request.status); } } } } document.getElementById("save").onclick = function() { //发送查询请求并调用 //new一个XMLHttpRequest() var request; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari request=new XMLHttpRequest(); } else {// code for IE6, IE5 reques=new ActiveXObject("Microsoft.XMLHTTP"); } //由于是post请求,请求的地址不须要带参数 request.open("POST", "server.php"); //post请求,数据的参数构造,传入id为id为staffName,id为staffNumber,id为staffSex和id为staffJob的值 var data = "name=" + document.getElementById("staffName").value + "&number=" + document.getElementById("staffNumber").value + "&sex=" + document.getElementById("staffSex").value + "&job=" + document.getElementById("staffJob").value; //由于是post请求,因此须要设置HTTP头信息.并且必须在open与send之间,不然出现异常. request.setRequestHeader("Content-type","application/x-www-form-urlencoded"); request.send(data); request.onreadystatechange = function() { if (request.readyState===4) { if (request.status===200) { document.getElementById("createResult").innerHTML = request.responseText; } else { alert("发生错误:" + request.status); } } } } </script> </body> </html>
注意:
GET方式:
(1)使用GET方式发送请求时,地址的参数须要编码,为避免乱码
数据以问号开始,名和值之间用等号连接,名值对之间用和号(&)分隔。使用GET方式发送的数据经常被称为查询字符串
xhr.open("get","example.php?name1=value1&name2=value2",true)
(2)避免缓存
为了保证参数的绝对惟一性,须要加 时间戳 或随机数
测试:
F12的network
在按钮中输入101,点击查询
双击左侧出现的那条信息,在右侧可看到服务器的信息
相关问题:
问:php地址栏输入参数问题,为何能够在地址栏直接搜索number查询员工,我没看到哪里有ajax请求啊??
答:
php页面中模拟了一个二维数组做为数据库存储的数据,在地址栏经过键值对的形式只是在php页面中增长这样一个员工信息,用来验证php页面是否有语法错误,是不须要经过客户端问:
向服务器发送请求的
POST http://localhost:8080/ajaxdemo/server.php User-Agent: Fiddler Host: localhost:8080 Content-Type: application/x-www-form-urldecoded Content-Length: 50 Request Body name=欧阳锋&number=104&sex=男&job=测试经理
结果是“参数错误,员工信息填写不全”这是怎么回事啊?
答:
post发送的信息是通过哈希值加密的,加密是encoded,解密是decoded.
Content-Type: application/x-www-form-urldecoded这是改为encoded。
JSON,就是一种数据传输格式而已,其实JSON最大的用处是处理JavaScript和web服务器端之间数据交换。
JSON结构共有2种:
(1)对象结构;
(2)数组结构;
1)JSON对象结构
对象结构是使用大括号“{}”括起来的,大括号内是由0个或多个用英文逗号分隔的“关键字:值”对(key:value)构成的。
语法:
var jsonObj = { "键名1":值1, "键名2":值2, …… "键名n":值n }
说明:
jsonObj指的是json对象。对象结构是以“{”开始,到“}”结束。其中“键名”和“值”之间用英文冒号构成对,两个“键名:值”之间用英文逗号分隔。
注意,这里的键名是字符串,可是值能够是数值、字符串、对象、数组或逻辑true和false。
(1)从JSON中读数据
jsonObj.key jsonObj["key"]
说明:
jsonObj指的是JSON对象,key指的是键名。读取JSON数据使用的是“.”操做符,这个跟JavaScript对象读取属性值是差很少的。
好比:
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> var obj = { "name":"123", "age":23, "hobby":"562", } } //读取JSON数据 document.write("名字是:"+obj.name+" "); document.write("第一项爱好是:"+obj.hobby); </script> </head> <body> </body>> </html>
结果:
输出:名字是:123 第一项爱好是:567
(2)向JSON写数据
对于JSON对象结构,要往JSON中增长一条数据,也是使用“.”操做符。
语法:
jsonObj.key = 值; jsonObj["key"] = 值;
说明:
jsonObj指的是JSON对象,key指的是键名
例子
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> var obj = { "name":"小名", "age":23, "hobby":"dance", } } obj.sex = "男"; //或者obj["sex"]="男"; document.write("性别是:"+obj.sex); </script> </head> <body> </body> </html>
结果:
输出 性别是:男
(3)修改JSON中的数据
对于JSON对象结构,要修改JSON中的数据,也是使用“.”操做符。
语法:
jsonObj.key = 新值;
举例:
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> var obj = { "name":"小名", "sex":"男", "age":23, "hobby":"dance", } } obj.name = "小杰"; //或者obj["name"]="小杰"; document.write("姓名是:"+obj.name); </script> </head> <body> </body> </html>
输出:姓名是:小杰
(4)删除JSON中的数据
对于JSON对象结构,咱们使用delete关键字来删除JSON中的数据。
语法:
delete jsonObj.key;
举例:
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> var obj = { "name":"小名", "sex":"男", "age":23, "hobby":"dance", } } delete obj.age; if(obj.age==null) { alert("年龄项已经被删除!"); } </script> </head> <body> </body> </html>
(5)遍历JSON对象
对于JSON对象结构,可使用for…in…循环来遍历JSON对象中的数据。
<!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> var obj = { "name":"小名", "age":23, "sex":"男", } for(var a in obj) { if(a=="name") { document.write("姓名是:"+obj[a]); } } </script> </head> <body> </body> </html>
弹出 姓名是:小名
1)JSON数组结构
JSON数组结构是用中括号“[]”括起来,中括号内部由0个或多个以英文逗号“,”分隔的值列表组成。
语法:
var arr = [ { "键名1":值1, "键名2":值2 }, { "键名3":值3, "键名4":值4 }, …… ]
说明:
arr指的是json数组。数组结构是以“[”开始,到“]”结束
注意,这里的键名是字符串,可是值能够是数值、字符串、对象、数组或逻辑true和false。
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script type="text/javascript"> var arr = [ { "name":"小光", "age":23, "sex":"男" }, { "name":"小红", "age":21, "sex":"女" } ] //读取JSON数据 document.write("第一个游客的名字是:"+arr[0].name+"<br>"); document.write("第二个游客的性别是:"+arr[1].sex+"<br>"); </script> </head> <body> </body> </html>
弹出 第一个游客的名字是:小光
第二个游客的性别是:女
3)json解析:将JSON字符串转换为JSON对象
eval()和parse()方法
因为eval方法不会检验join的格式是否正确,会把里面的一些JS方法也一并执行,因此很是危险,例如容易被指向而恶意网站,
-----不建议使用
JSON.parse()较好,会解析出错误。
//例子:首先定义了JSON字符串jsondata eval()方法: var jsondata='{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}'; var jsonobj=veal('('+jsondata+')'); alert(jsonobj.staff[0].name); parse()方法: var jsondata='{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}'; var jsonobj=JSON.parse(jsondata); alert(jsonobj.staff[0].name);
均可以,若把age后的70改为alert(123);若用eval()方法,发现页面是先弹出123,再弹出洪七;也就是说用eval不只解析了字符串,还执行了JS里的方法
用parse()解析字符串,发现会抛出一个错误。
这说明用eval()不会看json是否合法,eval很是危险。因此尽可能使用JSON.parse方法,来解析json里的字符串,并且还能够解析出json里的一些错误。
而JSON.parse在解释JSON时会检验JOIN的格式,若是格式不对,会报错,并且不会执行JSON里面的JS方法。咱们平时应该多用JOSN.parse,少用eval方法。
案例:
var people = { "programmers": [{ "firstName": "Brett", "lastName": "McLaughlin", "email": "aaaa" }, { "firstName": "Jason", "lastName": "Hunter", "email": "bbbb" }, { "firstName": "Elliotte", "lastName": "Harold", "email": "cccc" }], "authors": [{ "firstName": "Isaac", "lastName": "Asimov", "genre": "sciencefiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" }, { "firstName": "Frank", "lastName": "Peretti", "genre": "christianfiction" }], "musicians": [{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" }, { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }] };
要想访问 programmers 列表的第一个条目的姓氏,只需在 JavaScript 中使用下面这样的代码:
people.programmers[0].lastName;
注意,数组索引是从零开始的。因此,这行代码首先访问 people变量中的数据;而后移动到称为 programmers的条目,再移动到第一个记录([0]);最后,访问 lastName键的值。结果是字符串值 “McLaughlin”。
people.authors[1].genre // Value is "fantasy" people.musicians[3].lastName // Undefined. This refers to the fourth entry, and there isn't one people.programmers[2].firstName // Value is "Elliotte"
利用这样的语法,能够处理任何 JSON 格式的数据,而不须要使用任何额外的 JavaScript 工具包或 API。
资料:http://www.sojson.com/(在线检验JOSN语法是否正确)
参考资料:
Ajax全接触:http://www.imooc.com/learn/250