Blogger Information
Blog 28
fans 0
comment 0
visits 25404
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JSON的解析,Ajax不刷新页面更新页面
,多思曩惜,
Original
1142 people have browsed it

JSON

解析 JSON

  • JSON 的常规用途是同 web 服务器进行数据传输。
  • 在从 web 服务器接收数据时,数据永远是字符串。
  • 通过 JSON.parse() 解析数据,这些数据会成为 JavaScript 对象。

  • 将JSON转化为js对象

  1. var jsonStr =
  2. '{"name":"Peter Zhu",\
  3. "age":29,\
  4. "isMarried":true,\
  5. "course":{"name":"JavaScript","grade":99}}';
  6. // json -> js对象
  7. var obj = JSON.parse(jsonStr);
  8. console.log(obj);
  • 示例

  • 处理对象中的值和将值渲染到浏览器中

  1. // 处理对象中的某一个值
  2. var obj = JSON.parse(jsonStr,function(key,value)
  3. {
  4. if(key === 'isMarried'){
  5. return '不知道';
  6. }
  7. //返回全部值
  8. return value;
  9. });
  10. console.log(obj);
  11. // 引用OBJ对象的值
  12. var person = {
  13. name :obj.name,
  14. age : obj.age,
  15. courseName : obj.course.name,
  16. couresGrade: obj.course.grade,
  17. };
  18. // 创建列表元素ul
  19. var ul=document.createElement('ul');
  20. var res = "";
  21. // 遍历对象
  22. for (var key in person){
  23. res += '<li>' + person[key]+ '<\li>';
  24. }
  25. // 添加到列表中
  26. ul.innerHTML =res;
  27. // 将列表添加到页面中
  28. document.body.appendChild(ul);
  • 示例

Ajax

  • 不刷新页面更新网页
  • 在页面加载后从服务器请求数据
  • 在页面加载后从服务器接收数据
  • 在后台向服务器发送数据

1. 同步与异步

以前端请求,后端响应为例

  • 同步: 前端发请求, 必须等到后端响应完成,才允许发送另一个请求
  • 异步: 前端发请求后不等待后端响应结果继续执行,后端响应完成通过事件通知前端处理

异步最常用的处理形式就是回调函数

2. XMLHttpRequest 对象

  • XMLHttpRequest是浏览器提供的,处理异步请求的宿主对象,而非 JS 内置对象
  • 基本流程:
  1. 创建请求对象: new XMLHttpRequest()
  2. 监听请求回调: onreadystatechange
  3. 初始化请求参数: open(请求类型,请求地址,是否异步)
  4. 发送请求: send()
  • 如果是POST请求,以上步骤略有不同
  1. 创建请求对象: new XMLHttpRequest()
  2. 监听请求回调: onreadystatechange()
  3. 初始化请求参数: open(请求类型,请求地址,是否异步)
  4. 设置请求头: setRequestHeader()
  5. 准备请求参数: 可选var data = ...
  6. 发送请求: send(data)

3. GET 请求

  • 服务器: 返回 JSON
  • 前端: JSON.parse()解析 JSON 字符串
  1. // - `XMLHttpRequest`是浏览器提供的,处理异步请求的宿主对象,而非 JS 内置对象
  2. // - 基本流程:
  3. // 1. 创建请求对象: `new XMLHttpRequest()`
  4. var xhr = new XMLHttpRequest();
  5. // 2. 监听请求回调: `onreadystatechange`
  6. xhr.onreadystatechange =function(){
  7. // status返回状态有200:ok,403:Forbidden,404:Not Found;
  8. if(xhr.readyState === 4 && xhr.status === 200){
  9. // 响应的数据存储在responseXML中
  10. console.log(xhr.responseText);
  11. }
  12. };
  13. // 3. 初始化请求参数: `open(请求类型,请求地址,是否异步)`
  14. xhr.open("GET","test1.php",true);
  15. // 4. 发送请求: `send()`
  16. xhr.send(null);
  1. <?php
  2. $user['name'] = 'admin';
  3. $user['email'] = 'admin@qq.com';
  4. // 将数组转为json字符串, 不能用retrun, 必须用打印语句,如echo
  5. echo json_encode($user);
  • 示例

4. POST 请求

  • 前端: 发送 JSON
  • 后端:

    • json 数据以表单数据类型发送,可$_POST 接收
    • json 数组就是以 JSON 发送, php://input 流文件方式接收

      1. // - `XMLHttpRequest`是浏览器提供的,处理异步请求的宿主对象,而非 JS 内置对象
      2. // - 基本流程:
      3. // 1. 创建请求对象: `new XMLHttpRequest()`
      4. var xhr =new XMLHttpRequest();
      5. // 2. 监听请求回调: `onreadystatechange`
      6. xhr.onreadystatechange = function () {
      7. if(xhr.readyState === 4 && xhr.status === 200){
      8. console.log(xhr.responseText);
      9. }
      10. };
      11. // 3. 初始化请求参数: `open(请求类型,请求地址,是否异步)`
      12. xhr.open('POST','test2.php',true);
      13. // 4. 设置请求头,模拟表单类型的数组进行发送,application/x-www-form-urlencoded默认
      14. xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");
      15. var user ={
      16. email :"admin@qq.com",
      17. password : "admin",
      18. };
      19. // js对象转为JSON对象
      20. var date = JSON.stringify(user)
      21. xhr.send(date);
  1. <?php
  2. // print_r($_POST);
  3. // 转化为字符串
  4. $data = key($_POST);
  5. echo $data;
  6. // 将$data转为php可处理数据
  7. $user =json_decode($data);
  8. print_r($user);
  9. // 转为数组方式
  10. $user =json_decode($data,true);
  11. print_r($user);
  • 示例

  • 方法二

  • 直接将表单类型xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");改为JSON格式xhr.setRequestHeader("content-type","application/json;charset=utf-8");
  1. <?php
  2. // print_r($_POST);
  3. // 使用php://input来接收数据流
  4. // file_get_contents将数据流改为文件流
  5. $data= file_get_contents('php://input');
  6. $user = json_decode($data);
  7. print_r($user);
  8. $user =json_decode($data,true);
  9. print_r($user);
  • 示例

5. FormData

  • 可直接序列化表单数据
  • 可直接被 Ajax 识别,所以可以不设置请求头
  • 除了表单数据外,也可用于普通数据
  1. // 1. 创建请求对象: `new XMLHttpRequest()`
  2. var xhr = new XMLHttpRequest();
  3. // 2. 监听请求回调: `onreadystatechange`
  4. xhr.onreadystatechange =function(){
  5. if(xhr.readyState ===4 && xhr.status ===200){
  6. console.log(xhr.responseText);
  7. }
  8. }
  9. // 3. 初始化请求参数: `open(请求类型,请求地址,是否异步)`
  10. xhr.open('POST','test4.php',true);
  11. // 创建对象
  12. var data = new FormData();
  13. // data.append(键,值);
  14. data.append("username","admin");
  15. data.append("password","admin");
  16. // 4. 发送请求: `send()`
  17. xhr.send(data);
  1. <?php
  2. print_r($_POST);
  • 示例

  • 使用FormData实现用表单用户登录验证

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <p>登录</p>
  10. <form action="" method="POST" onsubmit="return false">
  11. <input type="email" name="email" placeholder="ee@qq.com" required autofocus>
  12. <input type="password" name="password" placeholder="****" required >
  13. <button>提交</button>
  14. </form>
  15. <script>
  16. // 获取表单和按钮
  17. var form = document.querySelector("form");
  18. var btn = document.querySelector("form button");
  19. // 点击事件,进行Ajax请求
  20. btn.onclick = function(){
  21. // 创建请求对象:`new XMLHttpRequest()`
  22. var xhr = new XMLHttpRequest();
  23. // 2. 监听请求回调: `onreadystatechange`
  24. xhr.onreadystatechange =function(){
  25. if(xhr.readyState === 4 && xhr.status === 200){
  26. console.log(xhr.responseText);
  27. // 将解析后端数据并保存在对象res
  28. var res=JSON.parse(xhr.responseText);
  29. console.log(res);
  30. // 从后端获取status值
  31. switch(res.status){
  32. case 0:
  33. error = res.message;
  34. break;
  35. case 1:
  36. window.location.href="http://www.baidu.com";
  37. break;
  38. default:
  39. error = "未知错误";
  40. }
  41. var span = document.createElement('span');
  42. span.innerHTML=error;
  43. span.style.color="red";
  44. form.appendChild(span);
  45. };
  46. };
  47. // 3. 初始化请求参数: `open(请求类型,请求地址,是否异步)`
  48. xhr.open("POST","test4.php",true);
  49. // 传入表单数据
  50. var data =new FormData(form);
  51. // 在数据中加入时间戳
  52. data.append("login_time",new Date().getTime());
  53. // 4. 发送请求: `send()`
  54. xhr.send(data);
  55. };
  56. var input =document.querySelectorAll('input');
  57. for (var i = 0 ;i <input.length;i++){
  58. input[i].oninput =function(){
  59. if(btn.nextElementSibling !== null)
  60. form.removeChild(btn.nextElementSibling);
  61. };
  62. }
  63. </script>
  64. </body>
  65. </html>
  1. <?php
  2. // print_r($_POST);
  3. // 链接数据库
  4. $pdo = new PDO('mysql:host=localhost;dbname=phpedu', 'root', 'root');
  5. $stmt = $pdo->prepare("SELECT COUNT(`id`) FROM `users` WHERE `email`=? AND `password`=? LIMIT 1");
  6. $stmt->execute([$_POST['email'], $_POST['password']]);
  7. $user = $stmt->fetch(PDO::FETCH_NUM);
  8. // print_r($user);
  9. // 判断数据,并向前端发送
  10. if($user[0] == 1 ) echo json_encode(['status'=>1,'message'=>'验证通过']);
  11. else echo json_encode(['status'=>0,'message'=>'验证不通过']);

总结

  • 了解JSON字符串转为js对象操作,JSON.parse()的使用。
  • 会使用Ajax的基本流程。POST请求,GET请求
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:其实xhr对象是一个非常古老的东西了, 但是很经典, 有空了解一下fetch API
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!