Blogger Information
Blog 60
fans 5
comment 3
visits 65266
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
DOM对象获取页面元素的方式以及ToDoList实战案例
longlong
Original
932 people have browsed it

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>
  • 记事本效果如下:

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:js核心类型只有6个, 但是在浏览器环境下, 又增加了不少, 比较难记
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