博客列表 >DOM对象获取页面元素的方式以及ToDoList实战案例

DOM对象获取页面元素的方式以及ToDoList实战案例

longlong
longlong原创
2020年08月14日 17:18:27933浏览

1. DOM对象获取页面元素的方式

使用DOM Document对象获取页面元素的方式主要有以下五种:

  • document.getElementById():通过元素的id获取

  • document.getElementsByClassName():通过元素的类名获取

  • document.getElementByTagName():通过元素的标签名获取

  • document.querySelector():通过CSS选择器获取,只返回满足条件的第一个

  • document.querySelectorAll():通过CSS选择器获取,返回满足条件的全部元素组成的集合

1.1 获取方式一

document.getElementsByTagName(),返回元素组成的HTML集合

  1. <body>
  2. <h3>我是三级标题</h3>
  3. <h3 name="title">我是有名字的三级标题</h3>
  4. <script>
  5. // 获取方式一:document.getElementsByTagName(),返回元素组成的HTML集合
  6. let hs = document.getElementsByTagName("h3");
  7. console.log(hs);
  8. // 若要访问第一个h3
  9. hs.item(0).style.color = "red";
  10. // 若要访问第二个h3
  11. // hs.item(1).style.color = "green";
  12. hs.namedItem("title").style.color = "blue";
  13. // 查看集合的长度(就是有几个元素)
  14. console.log(hs.length);
  15. </script>
  16. </body>

1.2 获取方式二

document.getElementsByClassName():返回HTML集合

  1. <body>
  2. <p class="p1">我是第一个段落,类名是p1</p>
  3. <p class="p2">我是第二个段落,类名是p2</p>
  4. <p class="p2">我是第三个段落,类名是p2</p>
  5. <script>
  6. // 获取方式二:document.getElementsByClassName():返回HTML集合
  7. let ps = document.getElementsByClassName("p2");
  8. console.log(ps);
  9. // 访问第三个段落
  10. ps.item(1).style.background = "lightgreen";
  11. // 查看集合的长度
  12. console.log(ps.length);
  13. </script>
  14. </body>

1.3 获取方式三

document.getElementById():返回一个元素

  1. <body>
  2. <ul>
  3. <li id="watermellon">西瓜</li>
  4. <li>葡萄</li>
  5. <li>香蕉</li>
  6. </ul>
  7. <script>
  8. // 获取方式三:document.getElementById():返回一个元素
  9. let fruit = document.getElementById("watermellon");
  10. console.log(fruit);
  11. // 此时HTML集合的属性和方法就不能使用了
  12. // 可直接设置元素的样式
  13. fruit.style.color = "blue";
  14. fruit.style.cssText = "color:red;font-size:30px;";
  15. </script>
  16. </body>

1.4 获取方式四和五

  • 获取方式四:document.querySelector():只返回一个元素

  • 获取方式五:document.querySelectorAll():返回NodeList,相当于数组

  1. <body>
  2. <div class="container">
  3. <p class="p1">我是段落一</p>
  4. <p name="p2">我是段落二</p>
  5. <h4>我是标题</h4>
  6. <div>
  7. <span>span1</span>
  8. <span>span2</span>
  9. </div>
  10. </div>
  11. <script>
  12. // 获取方式四:document.querySelector()
  13. // 获取方式五:document.querySelectorAll()
  14. // 都是通过CSS选择器来获取元素,不同的是方式四只能获取到一个,而方式五是获取到的NodeList(相当于数组)
  15. let span1 = document.querySelector(".container div span");
  16. // 虽然div中有两个span,但是此方式只会得到满足条件的第一个
  17. console.log(span1);
  18. span1.style.color = "red";
  19. let ps = document.querySelectorAll(".container p");
  20. console.log(ps);
  21. // 获取到的NodeList相当于数组,不过可以用HTML集合中的item()方法
  22. console.log(ps.item(1));
  23. console.log(ps[1]);
  24. console.log(ps.length);
  25. </script>
  26. </body>

2. ToDoList课堂案例

  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>ToDoList实战案例</title>
  7. </head>
  8. <body>
  9. <form action="" method="POST">
  10. <label for="content">请留言:</label>
  11. <input type="text" name="" id="content" />
  12. <button>提交</button>
  13. </form>
  14. <ul></ul>
  15. <script>
  16. // 目的: 点击提交后将留言内容显示到无序列表中,所以需要获取到三个元素
  17. // 1. 获取表单元素,监听它的提交事件
  18. // 2. 获取列表元素,用于后期将留言内容添加到列表中
  19. // 3. 获取输入框
  20. // 获取列表
  21. let ul = document.querySelector("ul");
  22. // 获取输入框
  23. let content = document.querySelector("#content");
  24. // 获取表单
  25. let form = document.forms.item(0);
  26. // 监听表单提交事件
  27. form.addEventListener(
  28. "submit",
  29. function (ev) {
  30. // 禁用事件默认行为
  31. ev.preventDefault();
  32. // console.log("111");
  33. // 判断输入框的内容是否为空
  34. if (content.value.trim().length === 0) {
  35. alert("输入内容不能为空");
  36. content.focus();
  37. } else {
  38. // 创建li节点;
  39. let li = document.createElement("li");
  40. li.innerHTML = content.value;
  41. // 将最新留言内容放在第一行显示
  42. // 判断ul节点下的子节点li是否存在
  43. if (ul.childElementCount === 0) {
  44. ul.appendChild(li);
  45. } else {
  46. ul.insertBefore(li, ul.firstElementChild);
  47. }
  48. }
  49. // 点了提交按钮后,清空一下输入框的内容,同时输入框获得焦点
  50. content.value = null;
  51. content.focus();
  52. },
  53. false
  54. );
  55. </script>
  56. </body>
  57. </html>

3. ToDoList实战之自动回复

  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>ToDoList实战案例之自动回复</title>
  7. <style>
  8. li {
  9. list-style-type: decimal;
  10. }
  11. ul button {
  12. cursor: pointer;
  13. padding: 5px 10px;
  14. margin-top: 10px;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <form action="" method="POST">
  20. <label for="content">请输入您的问题: </label>
  21. <input type="text" name="content" id="content" />
  22. <button>发送</button>
  23. <button onclick="delAll(this)">删除全部记录</button>
  24. </form>
  25. <ul></ul>
  26. <script>
  27. // 获取DOM对象:表单,列表,输入框
  28. let form = document.forms.item(0);
  29. let ul = document.querySelector("ul");
  30. let content = document.querySelector("#content");
  31. // 监听表单提交事件
  32. form.addEventListener(
  33. "submit",
  34. function (ev) {
  35. // 禁用默认行为
  36. ev.preventDefault();
  37. // 1. 创建Ajax对象
  38. let xhr = new XMLHttpRequest();
  39. // 2. 监听请求
  40. xhr.onreadystatechange = function () {
  41. if (xhr.readyState === 4 && xhr.status === 200) {
  42. // console.log(xhr.responseText);
  43. // 如果输入框没有输入内容
  44. if (content.value.trim().length === 0) {
  45. alert("请输入内容再提交");
  46. content.focus();
  47. } // 若有内容,则创建节点并将li节点加入ul
  48. else {
  49. // 创建节点,存放自动回复的内容
  50. let li = document.createElement("li");
  51. li.innerHTML =
  52. xhr.responseText +
  53. "<button onclick='del(this)'>删除此条回复记录</button><hr>";
  54. // 每次搜索的问题,放在第一行显示,所以判断ul中是否有子节点
  55. // 若没有字节点,直接添加
  56. if (ul.childElementCount === 0) {
  57. ul.appendChild(li);
  58. } // 若有子节点,插入到ul第一个子节点之前
  59. else {
  60. ul.insertBefore(li, ul.firstElementChild);
  61. }
  62. // 最后,清空输入框内容并获得焦点,便于下次直接输入
  63. content.value = null;
  64. content.focus();
  65. }
  66. }
  67. };
  68. // 3. 初始化请求参数
  69. xhr.open("POST", "check.php", true);
  70. // 4. 使用FormData(表单数据对象)来组织数据,最终还是表单数据形式发送的,所以可以用POST接收数据
  71. let data = new FormData(form);
  72. // 5. 发送数据
  73. xhr.send(data);
  74. },
  75. false
  76. );
  77. // 删除
  78. function del(ele) {
  79. this.event.preventDefault();
  80. return confirm("是否删除?") ? ul.removeChild(ele.parentElement) : false;
  81. }
  82. function delAll(ele) {
  83. this.event.preventDefault();
  84. // console.log(ul);
  85. let childs = ul.childNodes;
  86. // console.log(childs);
  87. // console.log(childs.length);
  88. // 循环执行删除节点操作,每次删除ul节点的最后一个节点,直至删完
  89. if (confirm("确定删除全部记录吗")) {
  90. for (let i = childs.length - 1; i >= 0; i--) {
  91. // ul.removeChild(ul.lastElementChild);
  92. ul.removeChild(childs[i]);
  93. }
  94. } else {
  95. return false;
  96. }
  97. content.focus();
  98. }
  99. </script>
  100. </body>
  101. </html>
  1. <?php
  2. // echo $_POST['content'];
  3. // 模拟数据库数据
  4. $answers = [
  5. '亲爱的小主,你好啊!很高兴认识你!请问有什么可以帮您!',
  6. '让我来给你推荐一些好玩的地方把',
  7. '最近有很多火爆的电影哦,让我给小主推荐一下把',
  8. '请先简单的描述一下您的问题,即将为您转接人工服务',
  9. ];
  10. if($_POST['content']){
  11. foreach ($answers as $message){
  12. if(strpos($message,trim($_POST['content'])) !== false ){
  13. echo
  14. '您输入的问题: '
  15. .'<span style="color:red">'.trim($_POST['content']).'</span>'
  16. .'<br>'
  17. .'智能回复: '
  18. .'<span style="color:green">'.$message.'</span><br>';
  19. }
  20. }
  21. }else{
  22. echo false;
  23. }
  • 自动回复效果:

4. ToDoList实战之记事本

  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>ToDoList实战案例之记事本</title>
  7. </head>
  8. <body>
  9. <form action="" method="POST">
  10. <label for="content">请输入您的笔记: </label><br />
  11. <textarea name="content" id="content" cols="30" rows="10"></textarea
  12. ><br />
  13. <button>保存笔记</button>
  14. <button onclick="delChecked(this)">删除选择笔记</button>
  15. <button onclick="delAll(this)">删除全部笔记</button>
  16. </form>
  17. <div></div>
  18. <script>
  19. // 获取DOM对象:表单,列表,输入框
  20. let form = document.forms.item(0);
  21. // 获取文本域
  22. let content = document.querySelector("#content");
  23. // 获取保存笔记部分
  24. let note = document.querySelector("div");
  25. // 监听表单提交事件
  26. form.addEventListener(
  27. "submit",
  28. function (ev) {
  29. // 禁用默认行为
  30. ev.preventDefault();
  31. // 判断文本域是否有输入
  32. if (content.value.trim().length === 0) {
  33. alert("请输入内容再提交");
  34. content.focus();
  35. } else {
  36. // 将文本域的内容保存下来
  37. let div = document.createElement("div");
  38. let checkbox = document.createElement("input");
  39. checkbox.type = "checkbox";
  40. div.appendChild(checkbox);
  41. let text = document.createElement("input");
  42. text.value = content.value;
  43. div.appendChild(text);
  44. if (note.childElementCount === 0) {
  45. note.appendChild(div);
  46. } else {
  47. note.insertBefore(div, note.firstElementChild);
  48. }
  49. // 清空文本域
  50. content.value = null;
  51. content.focus();
  52. }
  53. },
  54. false
  55. );
  56. // 删除全部笔记
  57. function delAll(ele) {
  58. this.event.preventDefault();
  59. // console.log("111");
  60. let divs = document.querySelectorAll("div");
  61. // console.log(divs);
  62. if (confirm("确定删除所有笔记吗")) {
  63. for (let i = 0; i < divs.length; i++) {
  64. // console.log(divs[i]);
  65. for (let j = divs[i].childNodes.length - 1; j >= 0; j--) {
  66. // ul.removeChild(ul.lastElementChild);
  67. divs[i].removeChild(divs[i].childNodes[j]);
  68. }
  69. }
  70. } else {
  71. return false;
  72. }
  73. content.value = null;
  74. content.focus();
  75. }
  76. // 选择复选框中勾选的笔记
  77. function delChecked(ele) {
  78. this.event.preventDefault();
  79. let divs = document.querySelectorAll("div");
  80. for (let i = 0; i < divs.length; i++) {
  81. // console.log(divs[i]);
  82. // console.log(divs[i].childNodes);
  83. // console.log(divs[i].childNodes[0]);
  84. console.log(divs[i].childNodes[0].checked);
  85. if (divs[i].childNodes[0].checked) {
  86. for (let j = divs[i].childNodes.length - 1; j >= 0; j--) {
  87. divs[i].removeChild(divs[i].childNodes[j]);
  88. }
  89. }
  90. }
  91. content.value = null;
  92. content.focus();
  93. // 这个循环执行完还有一个问题没有得到解决:
  94. // 第一次 删除选择笔记时 能够正常执行,但是继续点击 删除选择笔记 会出现问题
  95. // 相当于这个循环只有第一次执行的时候才发挥了作用,感觉就是需要刷新页面才行,
  96. // 但是现在刷新页面数据会丢失,所以暂定解决办法就是将数据通过某种方式保存起来
  97. // 然后执行页面刷新操作,刷新完了又把数据恢复过来,再执行 删除选择笔记 这个操作才行
  98. }
  99. </script>
  100. </body>
  101. </html>
  • 记事本效果如下:

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