博客列表 >JSON的解析,Ajax不刷新页面更新页面

JSON的解析,Ajax不刷新页面更新页面

,多思曩惜,
,多思曩惜,原创
2020年05月24日 10:29:571159浏览

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请求
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议