一.json基础知识点
1.什么是 JSON ?
(1).JSON 是英文(JavaScript Object Notation)即,JS对象表示法;
(2).JSON 是独立于编程语言的,通用的,轻量级的文本存储与交换的数据格式;
(3).JSON 使用JavaScript中的对象语法编写,可与js相互转换;
(4).JSON 本质上仍是字符串,仅仅是内部的书写格式受到js对象语法的限制;
----------------------------------------------------------------
2. JSON的二种数据结构:
(1). 对象(Object): 键值对集合,类似关联数组,参考了js对象语法,但做了一些规范;
(2). 数组(Array): 与js完全一致,是键值的有序的;
----------------------------------------------------------------
3. json 中支持的数据类型:
(1). 对象: 字面量表示 {...};
(2). 数组: 字面量表示 [...];
(3). 字符中: 双引号表示,支持转义 "name";
(4). 数值: 仅允许十进制 123;
(5). 布尔: true / false;
(6). null: 表示空/无.
----------------------------------------------------------------
4. json 字符串的校验: 在线工具: json.cn
5. 解析:
1. 解析分为二种情况:
(1)将json格式的字符串,解析为js对象: 适合于从服务器端接收数据
(2)将js对象解析来json格式的字符串: 适用于将向服务器端发送数据
第一情况: json字符串 To js对象: eval() 和 JSON.parse()
(1). eval()解析: 加上圆括号,将json字符串转为表达式 //这种方法不推荐
let json = '{"name":"朱老师","age":30,"course":["js","php","java"],"isMarried":true,"rich":null}';
let obj = eval('('+json+')');
typeof obj; // "object"
obj.name; // "朱老师"
obj.course[1]; // "php"
obj["age"]; // 可以用方括号访问: 30
eval()函数调用的是js的编译器,有一个问题,如果字符串有代码,会被执行,有可能会带来安全问题,所以js定义一些全局方法来专门处理json字符串
let str = "alert('我是一段恶意跳转代码');location.href='http://baidu.com'";
eval(str);
(2). JSON.parse(json): 只会识别json内容,非json内容不解析,比eval()函数更加安全
// 该方法非常适合于服务器端进行交互,因为从服务器接收的通常都是"字符串"
let json1 = '{"name":"朱老师","age":30,"course":["js","php","java"],"isMarried":true,"rich":null}';
let obj1 = JSON.parse(json1);
typeof obj1;
obj1.isMarried; // true
// 可以用 for in 遍历 json 中的内容
for (key in json1) {console.log(json1[key])} // 必须使用[]来访问属性名
// 可以更新
obj1.age = 50;
obj1.age; // 50
// 可以删除
delete obj1.age;
obj1.age; // undefined
(3). PHP中使用json_decode()进行转换, 一会我们会用ajax进行演示
<?php
$json_str='{"id":1,"name":"peter","hobby":["reading","cooking"]} ';
$obj=json_decode($json_str);
echo $obj->name; // "peter"
echo $obj->hobby[1]; // "cooking"
第二种情况: js对象 To json字符串:JSON.stringify()
let obj = {name:'peter',age:40,isMarried:true, salary:undefined};
let json = JSON.stringify(obj);
转换结果: "{"name":"peter","age":40,"isMarried":true}",值为undefined的数据不会出现在结果中
服务器端拿到这个json格式的字符串之后,例如php,会调用json_decode()将其解析来php对象进行访问
如果是数组格式的json字符串:
let json_arr = [10,20,30];
let str_arr = JSON.stringify(json_arr); // "[10,20,30]"
//服务器端,例如php,会直接解析来php数组类型来访问:
<?php
$str = "[10,20,30]";
$arr = json_decode($str);
print_r($arr);
二.ajax相关知识点
1. 传统的HTTP请求是什么样子的?
(1). 一次HTTP请求对应一个页面;
(2). 如果想在当前页面中发现请的http请求,页不跳转当前页面,就必须需要一个请求代 理;
(3). 这个请求代 理,代 理了用户的请求,向服务器发出新的http请求;
(4). 而这个代 理,我们可以用一段 javascript代码来完成,由js来发出http请求;
(5). 等js收到服务器端响应的数据后,再由js来刷新页面更新数据;
(6). 这时,给用户的感觉就是我仍停留在当前页面,而页面上的数据却在不停的更新中,用户体验超级棒;
(7). 这个代 理用户发出http请求的js代码,宏观上也可以叫作客 户端,因为任何能发起请求的实体都可以视为客 户端;
-----------------------------------------------------------------------------------------
2. Ajax 的工作原理
(1). Ajax 就是刚才我们所说的那个代 理用户发起http访问请求的js代码;
(2). Ajax 的全称是: Asynchronous JavaScript and XML[异步的 JavaScript 和 XML];
(3). 之前交互用xml格式比较多,现在json格式是主流,因为xml太臃肿了,我们就不再学习了;
(4). 同步与异步的区别:
[1].同步是指客 户端与服务器端处理的是同一个请求,服务器响应成功,客 户端也接收到返回的数据,这个请求才算完成;
[2].异步是指客 户端与服务器可以同时处理不同的请求,客 户端通过事件监听判断服务器端是否响应成功并返回数据;
(5). Ajax 是目前最主流的异步请求方式,得到了几乎所有的主流浏览器的支持,包括IE在内.
-----------------------------------------------------------------------------------------
3. Ajax 的主要应用场景?
(1). 表单验证;
(2). 数据实时更新,例如股票行情;
(3). 在线地图;
(4). 其它需要数据实时加载,无刷新的使用场景.
4. Ajax 中常用的属性和方法
(1). 对象: XMLHttpRequest() 简称 xhr对象;
(2). 事件: onreadystatechange() 监听就绪状态属性的变化;
(3). 属性: readyState 请求状态值,有四个值,我们只对数据就绪状态的值:4感兴趣;
(4). 属性: status 请求状态码, 返回 200 时,表示已从服务器上成功的获取到了返回的文本;
(5). 属性: responseText, 从服务器端返回的文本内容;
(5). 方法: open('请求类型','请求的url',请求方式,默认为true异步):设置请求参数
(6). 方法: send(): 发送请求,GET请求请填上参数null;
(7). 方法: 如果是post请求,需要设置一下请求头信息,请文档类型重置:
setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
3.Ajax实战:获取html内容
实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ajax实战:获取html内容</title> </head> <body> <button>我最喜欢的电影</button> <script> let btn = document.getElementsByTagName('button')[0]; btn.onclick = function () { //1.创建xhr对象 let xhr = new XMLHttpRequest(); //2.监听响应状态 xhr.onreadystatechange = function(){ if (xhr.readyState === 4) { // 准备就绪 // 判断响应结果: if (xhr.status === 200) { // 响应成功,通过xhr对象的responseText属性可以获取响应的文本,此时是html文档内容 let div = document.createElement('div'); //创建新元素放返回的内容 div.style.width = '600px'; // 设置内容区的宽和高 div.style.height = '600px'; div.innerHTML = xhr.responseText; // 将响应文本添加到新元素上 document.body.appendChild(div); // 将新元素插入到当前页面中 } else { // 响应失败,并根据响应码判断失败原因 alert('响应失败'+xhr.status); } } else { // http请求仍在继续,这里可以显示一个一直转来转去的图片 } } //3.设置请求参数 xhr.open('get','inc/index.html',true); //4.发送请求 xhr.send(null); //将点击按钮禁用,防止重复点击 btn.disabled = true; // btn.setAttribute('disabled',true); //等价语法 } </script> </body> </html>
运行实例 »
点击 "运行实例" 按钮查看在线实例
4.ajax案例实现登录检查
1.test.html 主页实现提交
实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ajax实战:表单验证</title> </head> <body> <h3>用户登录</h3> <form> <p>邮箱: <input type="email" name="email"></p> <p>密码: <input type="password" name="password"></p> <p><button type="button">提交</button></p> </form> <script> let btn = document.getElementsByTagName('button')[0]; btn.onclick = function () { //1.创建xhr对象 let xhr = new XMLHttpRequest(); //2.监听响应状态 xhr.onreadystatechange = function(){ if (xhr.readyState === 4) { // 准备就绪 // 判断响应结果: if (xhr.status === 200) { // 响应成功,通过xhr对象的responseText属性可以获取响应的文本,此时是html文档内容 let p = document.createElement('p'); //创建新元素放返回的内容 p.style.color = 'red'; let json = JSON.parse(xhr.responseText); if (json.status === 1) { p.innerHTML = json.msg; } else if (json.status == 0) { p.innerHTML = json.msg; } // 将响应文本添加到新元素上 document.forms[0].appendChild(p); // 将新元素插入到当前页面中 btn.disabled = true; setTimeout(function(){ document.forms[0].removeChild(p); btn.disabled = false; if (json.status == 1) { location.href = 'admin.php'; } },2000); } else { // 响应失败,并根据响应码判断失败原因 alert('响应失败'+xhr.status); } } else { // http请求仍在继续,这里可以显示一个一直转来转去的图片 } } //3.设置请求参数 xhr.open('post','inc/check.php',true); //4. 设置头信息,将内容类型设置为表单提交方式 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); //4.发送请求 let data = { email: document.getElementsByName('email')[0].value, password: document.getElementsByName('password')[0].value }; // data = 'email='+data.email+'&password='+data.password; let data_json=JSON.stringify(data); xhr.send('data='+data_json); } </script> </body> </html>
运行实例 »
点击 "运行实例" 按钮查看在线实例
2.后台数据验证 test.php
实例
<?php $user=json_decode($_POST['data']); $email=$user->email; $password=sha1($user->password); $pdo=new PDO('mysql:host=localhost;dbname=phpcn','root','root'); $sql="select count(*) from `user` where `email`='{$email}' and `password`='{$password}'"; $stmt=$pdo->prepare($sql); $stmt->execute(); if($stmt->fetchColumn(0)==1){ echo json_encode(['status'=>1,'msg'=>'登录成功,正在跳转']); exit; }else{ echo json_encode(['status'=>0,'msg'=>'登录失败,请重写登录']); exit; } ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例