Blogger Information
Blog 62
fans 2
comment 1
visits 42123
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
front 24 jQuery事件绑定、Ajax获得数据,分页实战(0820thu)
老黑
Original
587 people have browsed it

主要内容:

  1. jQuery事件绑定
  2. 7种获得获得数据的方式,包括Ajax
  3. 实战:Ajax-post无刷新分页技术

1. jQuery事件绑定

  • 通过事件绑定来进行匹对检验、提醒、提醒去除等
  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>事件</title>
  7. </head>
  8. <body>
  9. <p>User Login:</p>
  10. <!-- onsubmit="return false": 禁用表单的默认提交行为 -->
  11. <form style="width: 200px; display: grid; gap: 10px;">
  12. <input type="text" placeholder="UserName" autofocus />
  13. <input type="password" placeholder="Password" />
  14. <button>Submit</button>
  15. </form>
  16. <script src="../220818/lib/jquery-3.5.1.js"></script>
  17. <script>
  18. // 事件绑定,绑定一个禁用当前默认操作的事件
  19. $("form").submit(function (ev) {
  20. ev.preventDefault();
  21. });
  22. // 用户名文本框应该是失去焦点的进行验证
  23. var user = $('input[type="text"]');
  24. // blur()失去焦点时触发
  25. user.blur(function () {
  26. // 提示
  27. var tips = "";
  28. // 用户名列表 - 这个按理是跟数据库中的比较的
  29. var users = ["admin", "peter", "zhu"];
  30. // 非空验证
  31. if ($(this).val().length === 0) {
  32. tips = "用户名不能为空";
  33. // 焦点重新定位到用户名文本框上
  34. $(this).focus();
  35. // 存在验证,必须在非空验证完成之后才可进行,如果在列表中没有,index就会是-1
  36. } else if (users.indexOf($(this).val()) === -1) {
  37. tips = "用户名不存在" + ' <button type="button">请注册</button>';
  38. } else {
  39. tips = '<i style="color:green;">用户名正确<i>';
  40. $("input[type=password]").focus();
  41. }
  42. // 将提示信息添加到页面
  43. // 防止重复添加 - 因此需要现有一个检查,如果没有再添加
  44. // 一旦重新的时候,需要再将信息(span)删除掉
  45. if ($(this).next().get(0).tagName !== "SPAN") {
  46. $("<span>").html(tips).css("color", "red").insertAfter($(this));
  47. }
  48. // 如果输入错误,用户修改的时候,应该将提示信息删除
  49. // keyDown(): 当用户按下键盘时触发
  50. // user.keydown(function () {
  51. // // remove()删除元素
  52. // // next():获取下一个兄弟元素
  53. // $(this).next("span").remove();
  54. // });
  55. // on(): 与原生 addEventListener()功能一样
  56. user.on("input", function () {
  57. $(this).next("span").remove();
  58. });
  59. });
  60. </script>
  61. </body>
  62. </html>

2. 7种获得获得数据的方式,包括Ajax

  • 中间用到的一个users.php
  1. <?php
  2. // 二维数组模拟数据表的查询结果
  3. $users = [
  4. ['id' => 1, 'name' => '熊大', 'age' => 20],
  5. ['id' => 2, 'name' => '熊二', 'age' => 18],
  6. ['id' => 3, 'name' => '光头强', 'age' => 38],
  7. ];
  8. // $_REQUEST = $_GET + $_POST + $_COOKIE
  9. // $id = intval($_REQUEST['id']);
  10. if (in_array($_REQUEST['id'], array_column($users, 'id'))) {
  11. foreach ($users as $user) {
  12. if ($user['id'] == $_REQUEST['id'] ) {
  13. // vprintf('%s : %s %s 岁', $user);
  14. // 除了json部分用下面这个外,其他都用上面的
  15. // $_getJSON()返回返回json格式字符串
  16. echo json_encode($user);
  17. }
  18. }
  19. } else {
  20. echo '<span style="color: red">没有找到</span>';
  21. }

  • demo2.php
  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>Ajax</title>
  7. <style>
  8. body {
  9. display: grid;
  10. gap: 15px;
  11. }
  12. button {
  13. text-align: left;
  14. height: 26px;
  15. width: 250px;
  16. background-color: aquamarine;
  17. }
  18. button:hover {
  19. background-color: #ddd;
  20. cursor: pointer;
  21. }
  22. </style>
  23. </head>
  24. <body>
  25. <button type="button">1. load()请求数据</button>
  26. <button type="button">2. $.get()请求数据</button>
  27. <button type="button">3. $.post()请求数据</button>
  28. <button type="button">4. $.getJSON()请求JSON数据</button>
  29. <button type="button">5. $.ajax()请求数据</button>
  30. <button type="button">6. $.ajax()-jsonp-跨域请求数据1</button>
  31. <button type="button">7. $.ajax()-jsonp-跨域请求数据2</button>
  32. <script src="../220818/lib/jquery-3.5.1.js"></script>
  33. <script>
  34. // 1. $.load():获取html片断
  35. $("button:first-of-type").click(function () {
  36. $(this).after("<div>").next().load("nav.html");
  37. });
  38. // 将nva中的导航load过来
  39. // 2. $.get()
  40. $("button:nth-of-type(2)").click(function (ev) {
  41. // http://php.cn/users.php?id=2
  42. // 与之前的data: xhr.responseText有类似的功能,可以祛暑
  43. $.get("users.php", { id: 3 }, function (data) {
  44. console.log(data);
  45. // console.log($(this)[0]);
  46. console.log($(this) === $(ev.target));
  47. // 这个地方的this跟后面不等,因为从上面一行可以看出来this好像是一个字符串之类。
  48. $(ev.target).after("<div>").next().html(data);
  49. });
  50. });
  51. // 3. $.post()
  52. $("button:nth-of-type(3)").click(function (ev) {
  53. $.post("users.php", { id: 7 }, function (data) {
  54. // console.log(data);
  55. $(ev.target).after("<div>").next().html(data);
  56. });
  57. });
  58. // 4. $.getJSON()
  59. $("button:nth-of-type(4)").click(function (ev) {
  60. $.getJSON("users.php?id=3", function (data) {
  61. // var data = JSON.parse(data);这步操作Jquery代劳了
  62. // 我们操作的data已经是js对象
  63. console.log(data);
  64. var str = data.id + ": " + data.name + ", " + data.age + "岁";
  65. $(ev.target).after("<div>").next().html(str);
  66. });
  67. });
  68. // 5. $.ajax():终级杀器,只要掌握这一个就可以了
  69. // $.ajax({
  70. // // 请求类型
  71. // type: "GET",
  72. // // 请求的URL
  73. // url: url,
  74. // // 发送的数据
  75. // data: data,
  76. // // 希望服务器返回的类型
  77. // dataType: "json",
  78. // // 请求成功的回调
  79. // success: callback,
  80. // });
  81. $("button:nth-of-type(5)").click(function (ev) {
  82. // $.get("users.php", { id: 2 }, function (data) {
  83. // console.log(data);
  84. // // console.log($(this)[0]);
  85. // console.log($(this) === $(ev.target));
  86. // $(ev.target).after("<div>").next().html(data);
  87. // });
  88. $.ajax({
  89. type: "GET",
  90. url: "users.php",
  91. data: { id: 2 },
  92. dataType: "html",
  93. success: function (data) {
  94. console.log(data);
  95. $(ev.target).after("<div>").next().html(data);
  96. },
  97. });
  98. });
  99. // 6. $.ajax() - jsonp - 1
  100. $("button:nth-of-type(6)").click(function (ev) {
  101. $.ajax({
  102. type: "get",
  103. // jsonp=? ?是回调函数的占位符
  104. url: "http://php.io/test2.php?jsonp=?&id=1",
  105. // dataType: 返回类型必须是jsonp
  106. dataType: "jsonp",
  107. success: function (data) {
  108. var data = JSON.parse(data);
  109. console.log(data);
  110. },
  111. });
  112. });
  113. // 7. $.ajax() - jsonp - 2
  114. $("button:last-of-type").click(function (ev) {
  115. $.ajax({
  116. type: "get",
  117. // jsonp=? ?是回调函数的占位符
  118. url: "http://php.io/test2.php?jsonp=?&id=1",
  119. // dataType: 返回类型必须是jsonp
  120. dataType: "jsonp",
  121. jsonpCallback: "handle",
  122. });
  123. });
  124. function handle(data) {
  125. var data = JSON.parse(data);
  126. console.log(data);
  127. var data =
  128. "<p>" +
  129. data.title +
  130. "</p><p>" +
  131. data.user.name +
  132. ",邮箱:" +
  133. data.user.email +
  134. "</p>";
  135. $("button:last-of-type").after("<div>").next().html(data);
  136. }
  137. </script>
  138. </body>
  139. </html>

3. Ajax-post无刷新分页技术

  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>Ajax-post无刷新分页技术</title>
  7. <style>
  8. table {
  9. border-collapse: collapse;
  10. border: 1px solid;
  11. text-align: center;
  12. margin: auto;
  13. width: 500px;
  14. }
  15. table caption {
  16. font-size: 1.2rem;
  17. margin-bottom: 10px;
  18. }
  19. th,
  20. td {
  21. border: 1px solid;
  22. padding: 5px;
  23. }
  24. thead tr:first-of-type {
  25. background-color: #ddd;
  26. }
  27. p {
  28. text-align: center;
  29. }
  30. p a {
  31. text-decoration: none;
  32. border: 1px solid;
  33. padding: 0 8px;
  34. }
  35. .active {
  36. background-color: #f00;
  37. }
  38. </style>
  39. </head>
  40. <body>
  41. <table>
  42. <caption>
  43. 用户信息表
  44. </caption>
  45. <thead>
  46. <tr>
  47. <th>id</th>
  48. <th>姓名</th>
  49. <th>年龄</th>
  50. <th>性别</th>
  51. <th>职位</th>
  52. <th>手机号</th>
  53. </tr>
  54. </thead>
  55. <tbody></tbody>
  56. </table>
  57. <!-- 分页条 -->
  58. <p></p>
  59. <script src="../0818/lib/jquery-3.5.1.js"></script>
  60. <script>
  61. // 默认是第一页
  62. var page = 1;
  63. // 默认显示的是第一页
  64. getPageData(page);
  65. // 获取分页数据的函数
  66. function getPageData(page) {
  67. $.ajax({
  68. type: "post",
  69. url: "page_data.php",
  70. data: { page: page },
  71. dataType: "json",
  72. success: show,
  73. });
  74. }
  75. // show()显示数据
  76. function show(data) {
  77. console.log(data);
  78. // 将json中的数据解析出来填充到表格中
  79. console.log(data.users);
  80. // 1. 将当前面的数据渲染出来
  81. var str = "";
  82. data.users.forEach(function (user) {
  83. str += "<tr>";
  84. str += "<td>" + user.id + "</td>";
  85. str += "<td>" + user.name + "</td>";
  86. str += "<td>" + user.age + "</td>";
  87. str += "<td>" + user.sex + "</td>";
  88. str += "<td>" + user.position + "</td>";
  89. str += "<td>" + user.mobile + "</td>";
  90. str += "</tr>";
  91. });
  92. $("tbody").html(str);
  93. // 2. 将分页条显示出来
  94. var str = "";
  95. for (var i = 1; i < data.pages; i++) {
  96. str += '<a href="" data-index=' + i + ">" + i + "</a>";
  97. }
  98. $("p").html(str).find("a").first().addClass("active");
  99. // 3. 添加分页点击事件
  100. $("p a").click(function (ev) {
  101. ev.preventDefault();
  102. // 获取当前要显示的新页面,根据自定义属性
  103. var page = $(this).attr("data-index");
  104. // $("tbody").html("");
  105. getPageData(page);
  106. });
  107. }
  108. </script>
  109. </body>
  110. </html>

  • page_data.php
  1. <?php
  2. // 1. 连接数据库
  3. $pdo = new PDO('mysql:host=localhost;dbname=liangtest', 'liang', '123456');
  4. // 2. 获取页码
  5. $page = $_POST['page'] ?? 1;
  6. // 3. 每页显示数量
  7. $num = 8;
  8. // 4. 每页显示偏移量
  9. $offset = ($page - 1) * $num;
  10. // 5. 总页数
  11. $sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `shao`";
  12. // echo $sql;
  13. $pages = $pdo->query($sql)->fetch()['total'];
  14. // echo $pages;
  15. // 6. 分页数据
  16. $sql = "SELECT * FROM `shao` LIMIT {$num} OFFSET {$offset}";
  17. $users = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  18. // ajax分页数据一定是返回二部分
  19. // 1. 总页数, 提供给前端自动生成分页条
  20. // 2. 分页数据
  21. echo json_encode(['pages' => $pages, 'users' => $users]);
  22. die;

4. 作业,实现高亮跟着点击走

将无刷新分页案例,添加当前页码高亮的功能

  • 数据库连接操作的php文件
  1. <?php
  2. // 1. 连接数据库
  3. $pdo = new PDO('mysql:host=localhost;dbname=liangtest', 'liang', '123456');
  4. // 2. 获取页码
  5. $page = $_POST['page2'] ?? 1;
  6. // 3. 每页显示数量
  7. $num = 8;
  8. // 4. 每页显示偏移量
  9. $offset = ($page - 1) * $num;
  10. // 5. 总页数
  11. $sql = "SELECT CEIL(COUNT(`id`)/{$num}) AS `total` FROM `shao`";
  12. // echo $sql;
  13. $pages = $pdo->query($sql)->fetch()['total'];
  14. // echo $pages;
  15. // 6. 分页数据
  16. $sql = "SELECT * FROM `shao` LIMIT {$num} OFFSET {$offset}";
  17. $users = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
  18. // ajax分页数据一定是返回二部分
  19. // 1. 总页数, 提供给前端自动生成分页条
  20. // 2. 分页数据
  21. echo json_encode(['pages' => $pages, 'users' => $users]);
  22. die;

  • 前端的html
  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>Ajax-post无刷新分页技术</title>
  7. <style>
  8. table {
  9. border-collapse: collapse;
  10. border: 1px solid;
  11. text-align: center;
  12. margin: auto;
  13. width: 500px;
  14. }
  15. table caption {
  16. font-size: 1.2rem;
  17. margin-bottom: 10px;
  18. }
  19. th,
  20. td {
  21. border: 1px solid;
  22. padding: 5px;
  23. }
  24. thead tr:first-of-type {
  25. background-color: #ddd;
  26. }
  27. p {
  28. text-align: center;
  29. }
  30. p a {
  31. text-decoration: none;
  32. border: 1px solid;
  33. padding: 0 8px;
  34. }
  35. .active {
  36. background-color: #f00;
  37. }
  38. </style>
  39. </head>
  40. <body>
  41. <table>
  42. <caption>
  43. 用户信息表
  44. </caption>
  45. <thead>
  46. <tr>
  47. <th>id</th>
  48. <th>date</th>
  49. <th>title</th>
  50. <th>label</th>
  51. <th>others</th>
  52. </tr>
  53. </thead>
  54. <tbody></tbody>
  55. </table>
  56. <!-- 分页条 -->
  57. <p></p>
  58. <script src="../220818/lib/jquery-3.5.1.js"></script>
  59. <script>
  60. // 默认是第一页
  61. var page1 = 1;
  62. getData(page1);
  63. // 获取分页数据的函数
  64. function getData(page1) {
  65. $.ajax({
  66. type: "post",
  67. url: "my.php",
  68. data: {page2: page1},
  69. // 关键:这个地方的page1发送到php sever那边的。
  70. // page1其实是一个数值,需要通过前面的page2过去。
  71. // page2必须跟php文件中的$_post后面的变量保持一致
  72. dataType: "json",
  73. success: dataShow,
  74. });
  75. }
  76. // dataShow()显示数据
  77. function dataShow(data1) {
  78. console.log(data1.pages);
  79. console.log(data1.users);
  80. var str = "";
  81. data1.users.forEach(function (user) {
  82. str += "<tr>";
  83. str += "<td>" + user.id + "</td>";
  84. str += "<td>" + user.date + "</td>";
  85. str += "<td>" + user.title + "</td>";
  86. str += "<td>" + user.label + "</td>";
  87. str += "<td>" + user.others + "</td>";
  88. str += "</tr>";
  89. });
  90. $("tbody").html(str);
  91. }
  92. // 2. 将分页条显示出来(这部分原来是在上面的dataShow函数中的,自己拿出来了)
  93. // 但问题来了?????? 这个时候就无法用data1.pages了。后面需要看下function中的变量如何拿出来用。
  94. var str = "";
  95. for (var i=1; i <= 22; i++){
  96. str += '<a href="" data-index=' + i + '>' + i + '</a>';
  97. // $('p').html(str).find("a").eq(page1-1).addClass('active');
  98. $('p').html(str).find("a").first().addClass('active');
  99. }
  100. // 3. 添加分页点击事件(这部分同样原来是在上面的dataShow函数中的,自己拿出来了)
  101. // 拿出来的的原因是下面的getData本来就是调用dataShow的,结果dataShow里面又调取getData,感觉是一个死循环
  102. // 刚开始老师的first高亮一直去不掉原因也是这个。
  103. $("p a").click(function (ev) {
  104. ev.preventDefault();
  105. page1 = $(ev.target).attr("data-index");
  106. getData(page1);
  107. $("p a").removeClass("active");
  108. $(ev.target).addClass("active");
  109. });
  110. </script>
  111. </body>
  112. </html>

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:关于异步编程, 我们这个案例应该是目前 最全的, 一定要多写几次, 直到背下来
Statement of this Website
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