博客列表 >front 24 jQuery事件绑定、Ajax获得数据,分页实战(0820thu)

front 24 jQuery事件绑定、Ajax获得数据,分页实战(0820thu)

老黑
老黑原创
2020年08月28日 20:34:08586浏览

主要内容:

  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>

上一条:初学jQuery下一条:js经典案例实战
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议