复习:
见思维导图
练习:学生按分数级别显示
(1)编写SQL:tarena.sql,表student(sid, sname, pic, scoreGrade(A-B-C-D)),插入12条记录
(2)编写PHP:student_select.php,根据客户端请求分数级别,返回该级别下有哪些学生,以JSON格式
(3)编写HTML:student.select.html,页头提供ABCD四个级别,鼠标悬停在某个级别上,立即异步请求该级别有哪些学生
今日目标:
(1)PPT上的小知识点拾遗
(2)AJAX阶段项目 —— 重点
1. JS中如何处理JSON字符串
把JSON格式的字符串解析为JS对象:
var str = '{"ename":"Tom", "age":20}';
var obj = JSON.parse(str); //方法1
var obj = eval( '('+str+')' ); //方法2,不推荐使用
把JS对象编码为JSON字符串:
var obj = {ename:'Tom', age: 20};
var str = JSON.stringify(obj);
-ify: 使变为..., sheepify stoneify frogify
=================================
PHP中把数组编码为JSON字符串:
$list = [{},{},{}];
$str = json_encode( $list );
PHP中JSON字符串解析为PHP数组/对象:
$str = '{"ename":"Tom", "age":20}';
$obj = json_decode( $str );
2.面试题:跨域请求和JSONP
Cross Domain Request:从一个资源请求另一个资源,二者所在的请求地址不同,域名不同、端口号不同、请求协议不同。
http://www.tmooc.cn/list.html
http://www.tedu.cn/student_select.php
提示:localhost和127.0.0.1也算跨域!
浏览器允许跨域请求的情形:
IMG、LINK、SCRIPT、IFRAME ...
浏览器禁止跨域请求的情形:
XHR —— 浏览器处于安全考虑,禁用了XHR的跨域请求(其实服务器给出了响应消息,但浏览器不让使用)
面试题:我们公司项目很大,页面很多,出于性能考虑,把静态资源(html等)放在http://static.tmooc.cn服务器上了,把动态资源(php)放在http://dynamic.tmooc.cn服务器上了,如何让一个x.html异步请求x.php呢? |
如何解决浏览器的XHR跨域请求限制 —— 八种方案:
(1)
(2)
(3)
(4)
(5)
(6)
(7) 修改响应消息头部,添加Access-Control-Allow-Origin头部
(8) 使用JSONP——非常巧妙
JSON: JavaScript Object Notation,是一种字符串数据格式(羊肉)。
JSONP:JSON with Padding,填充式JSON,与JSON完全两码事,是一种使用JSON数据的方式(把羊肉红烧)。意思是在JSON字符串左右添加函数名: doResponse( {"ename":"Tom", "age":20} );
JSONP是专用于解决XHR跨域限制一种手段。基本原理:使用动态创建的一个SCRIPT标签代替XHR发起异步请求,要求服务器必须返回application/javascript,立即在客户端执行——要执行的函数本体在客户端浏览器中声明。
<script src="x.php" async></script>
面试题:jQuery中如何使用JSONP发起异步请求:
(1) $.getJSON()
用途1:使用XHR发起异步请求(不能跨域)
$.getJSON('x.php', doResponse)
用途2:使用JSONP发起跨域异步请求
$.getJSON('http://跨域地址/x.php?callback=?', doResponse)
(2) $.ajax()
用途1:使用XHR发起异步请求(不能跨域)
$.ajax({ })
用途2:使用JSONP发起跨域异步请求
$.ajax({ dataType: 'jsonp' })
3.AJAX阶段项目 —— 京东购物车
功能点描述
(1)异步的用户登录
(2)异步的显示商品列表,实现分页显示
(3)异步的添加到“我的购物车”
(4)查看“我的购物车”
(5)异步的修改“我的购物车”
项目标准: 根据注释,大家在前面写,我在后面提示——项目代码必须有自己的思路!
实现步骤: SQL => PHP => HTML/JS
(1)编写SQL:jd.sql,数据库名jd,
创建表:jd_user(uid, uname, upwd),插入2行记录:
10 qiangdong 123456
20 naicha 456789
创建表:jd_product(pid, pname, price, pic),插入36行记录;
创建表:jd_cart( cid, userId ),插入一行记录:
101 10
创建表:jd_cart_detail(did, cartId, productId, count),插入如下的3行测试记录:
1 101 15 3
2 101 18 1
3 101 21 2
(2)编写PHP:data/header.php,包含页头必需的HTML片段(第一阶段项目中寻找)——不是完整的HTML!
<?php header('Content-Type: text/html;charset=UTF-8'); ?>
<div>....</div><div>....</div>
(3)编写PHP:data/footer.php,包含页尾必需的HTML片段(第一阶段项目中寻找)——不是完整的HTML!
(4)编写HTML:productlist.html,待页面加载完成,异步加载页头和页尾。
$('#header').load('data/header.php')
注意:控制台不能有404错误!
(5)编写PHP:user_login.php,接收客户端提交的uname和upwd,执行数据库验证,返回 {"code":1, "uname":"qiangdong", "uid":10} 或 {"code":2, "msg":"用户名或密码错误" }
$str = "{"code":1, "uname":"$uname"}"; echo $str;
$arr = ['code'=>1, 'uname'=>$uname]; echo json_encode($arr);
-------------------文华的进度线---------------------
(6)修改HTML:productlist.html,默认显示出登录对话框,异步登录验证,失败则提示错误消息,成功则清除掉对话框,显示“欢迎回来:xxxx”
(7)编写PHP:product_select.php,向客户端输出所有的产品信息,以JSON格式:[{},{},{},....]
(8)修改HTML: productlist.html,页面加载完后,异步请求所有的产品
(9)编写PHP:cart_product_add.php,接收客户端提交uid、pid,添加入购物车详情表,若已有该商品,则购买数量+1 —— 需要执行多条SQL语句,有挑战性!
4.JS和CSS加载外部资源的路径问题
JS是运行于HTML网页中,JS中请求的资源的路径使用相对于HTML文件的路径;
CSS是独立被浏览器解释,CSS中使用外部资源(如图片)路径使用相对于CSS文件的路径;