博客列表 >front 19 DOM选择、添加、删除(0813thu)

front 19 DOM选择、添加、删除(0813thu)

老黑
老黑原创
2020年08月20日 21:19:39485浏览

主要内容:

  1. 查看DOM对象
  2. 选择、获取DOM对象(标签、id、class、querySelector、querySelectorAll)
  3. nodelist:child、parent
  4. DOM元素的动态添加与删除
  5. 事件,及一个典型的ToDoList操作

1. DOM基本知识 (DOM与事件)

1-1. DOM

  • DOM: 文档对象模型
  • JS 将整个 HTML/XML 文档看一个对象,也称为 DOM 树
  • DOM 树由各种类型的节点组成

1-2. 获取 DOM 元素

  • 标签: document.getElementsByTagName()
  • ID: document.getElementById()
  • class: document.getElementsByClassName()
  • API(推荐用): document.querySelector() / document.querySelectorAll()

1-3. 节点与元素集合

  • NodeList: 所有类型的节点集合,包括了元素,文本,注释,片断,文档,属性…
  • HTMLColletion: HTML 元素的节点集合 NodeList > HTMLCollection, 是 NodeList 一个子集

1-4. 元素的新增,删除

  • 创建元素: createElement()
  • 创建一个元素的片断: createDocumentFragment()

1-5. 事件

  • 事件属性: on事件名称
  • 监听器: addEventListernaer()
  • 事件方法: 函数表达式/匿名函数

2. 查看DOM对象

    1. 节点是dom中的最小单元
    1. 节点有: 元素, 文本节点, 注释节点, 片断节点, 文档节点
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>dom对象</title>
  5. </head>
  6. <body>
  7. <!-- 我们的网站 -->
  8. <h3>hello php.cn</h3>
  9. <p>大家晚上好呀</p>
  10. <script>
  11. // 文档节点
  12. console.log(document);
  13. // 节点类型
  14. console.log(document.nodeType);
  15. // 节点名称
  16. console.log(document.nodeName);
  17. // 节点的值
  18. console.log(document.nodeValue);
  19. // 查看文档类型
  20. console.log(document.doctype);
  21. // 根节点<html>
  22. console.log(document.documentElement);
  23. // 头元素
  24. console.log(document.head);
  25. // 标题
  26. console.log(document.title);
  27. // 主体
  28. console.log(document.body);
  29. document.body.style.backgroundColor = "yellow";
  30. </script>
  31. </body>
  32. </html>

3. 选择、获取DOM对象

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>如何获取页面元素</title>
  5. </head>
  6. <body>
  7. <div id="list">
  8. <ul class="poster">
  9. <li name="active">战胜疫情, 指日可待</li>
  10. <li>全民动员, 支持国家</li>
  11. <li>我宅家,我骄傲,我为国家省口罩</li>
  12. </ul>
  13. </div>
  14. <!-- <div id="list">hello</div>
  15. <div id="list">world</div> -->
  16. <script>
  17. // 1. 标签: 返回的是一个元素对象的集合
  18. var ul = document.getElementsByTagName("ul");
  19. // console.log(ul);
  20. // console.log(ul[0]);
  21. // console.log(ul.item(0));
  22. // 以上三者的结果是一样的,因为只有一个ul
  23. // 2. id: 只返回具有指定id的第一个元素(唯一)
  24. var list = document.getElementById("list");
  25. // console.log(list);
  26. // id的替代语法
  27. var div = document.getElementsByTagName("div");
  28. // 在返回的div集合中, 选择具有'list'这个标识符的div
  29. // namedItem(id)
  30. console.log(div.namedItem("list"));
  31. console.log(div.namedItem("list") === list);
  32. // namedItem(name)
  33. var lis = document.getElementsByTagName("li");
  34. console.log(lis);
  35. console.log(lis.namedItem("active"));
  36. // 这个很管用,下面是链式获取,并进行格式属性修改。
  37. var active = document.getElementsByTagName("li").namedItem("active");
  38. console.log(active);
  39. active.style.color = "red";
  40. // 在元素级别调用以上的api方法来获取元素
  41. var lis = ul.item(0).getElementsByTagName("li");
  42. console.log(lis);
  43. lis.namedItem("active").style.backgroundColor = "yellow";
  44. // 3. class, 返回一个html集合
  45. var poster = document.getElementsByClassName("poster");
  46. console.log(poster);
  47. poster.item(0).style.border = "1px solid";
  48. // 4. 推荐使用下面的方式
  49. // querySelector(css选择器): 获取满足条件的集合中的第一个元素(类似于id)
  50. // querySelectorAll(css选择器): 获取满足条件的全部元素组成的集合
  51. var div = document.querySelector("#list");
  52. console.log(div);
  53. var li = document.querySelector("#list li");
  54. var li = document.querySelector("#list li:nth-of-type(2)");
  55. var li = document.querySelector("#list li:last-of-type");
  56. console.log(li);
  57. // 获取多个
  58. var lis = document.querySelectorAll(".poster > *");
  59. // 这个地方返回的是nodelist节点列表,而非数组。
  60. console.log(lis);
  61. console.log(lis.item(2));
  62. lis.item(2).style.backgroundColor = "green";
  63. </script>
  64. </body>
  65. </html>

4. node及nodelist:child、parent

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>node, nodelist</title>
  5. </head>
  6. <body>
  7. <div id="box">
  8. <h2>JavaScript</h2>
  9. <p>通用前端脚本语言</p>
  10. <li>学习让我感到很充实</li>
  11. </div>
  12. <p><a href="https://www.php.cn">PHP中文网</a></p>
  13. <script>
  14. // 页面元素返回类型: HTMLCollection,NodeList
  15. var div = document.querySelector("div");
  16. console.log(div.childNodes);
  17. // nodeType = 3: 文本节点
  18. // console.log(div.childNodes.item(0).nodeType);
  19. // nodeType = 1: 元素节点
  20. // console.log(div.childNodes.item(1).nodeType);
  21. // 过滤掉节点集合中的非元素节点
  22. for (var i = 0; i < div.childNodes.length; i++) {
  23. var currentNode = div.childNodes.item(i);
  24. if (currentNode.nodeType === 1) {
  25. console.log(currentNode.tagName.toLowerCase());
  26. }
  27. }
  28. // chirdren: 只返回父节点中的元素子节点
  29. console.log(div.children);
  30. console.log(div.firstChild); // #text, 文本节点
  31. // 如果只想获取第一个子元素级的节点
  32. console.log(div.firstElementChild);
  33. console.log(div.lastElementChild);
  34. console.log(div.children.item(1));
  35. var li = document.querySelector('li');
  36. console.log(li.parentNode);
  37. // 充当父节点永远不可能是文本或属性,只能是元素或文档
  38. console.log(li.parentElement);
  39. console.log(li.parentElement === li.parentNode);
  40. // 这两个的意思其实是相同的。
  41. </script>
  42. </body>
  43. </html>

5. DOM元素的动态添加与删除

  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. <ul></ul>
  10. <script>
  11. // 创建元素并添加到页面中
  12. var h2 = document.createElement('h2');
  13. // 给元素添加内容
  14. h2.innerText = '大家辛苦了';
  15. // 如果添加的内容带有html标签
  16. // h2.innerText = '大家<span style="color:red">辛苦了</span>';
  17. h2.innerHTML = '大家<span style="color:red">辛苦了</span>';
  18. // 添加到页面中, 必须在父节点上面进行添加
  19. document.body.appendChild(h2);
  20. // 添加多个
  21. var ul = document.querySelector('ul');
  22. // for (var i = 0; i < 10; i++) {
  23. // var li = document.createElement('li');
  24. // li.innerText = '列表项 ' + (i + 1);
  25. // ul.appendChild(li);
  26. // }
  27. // 为防止每添加一个元素导致页面dom树重新渲染一次
  28. // 借助文档片断来解决这个问题
  29. // 先创建一个临时文档片断
  30. var frag = document.createDocumentFragment();
  31. // 将生成的10个li添加到内存中的这个文档片断节点中
  32. for (var i = 0; i < 10; i++) {
  33. var li = document.createElement('li');
  34. li.innerText = '列表项 ' + (i + 1);
  35. frag.appendChild(li);
  36. }
  37. // 将这个文档片断一次性添加到页面, 此时页面只会渲染一次
  38. ul.appendChild(frag);
  39. </script>
  40. </body>
  41. </html>

6. 事件基础

  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. <!-- 将事件作为元素的一个特殊属性添加到元素上面,用 on为前缀 -->
  10. <button onclick="alert(this.firstChild.nodeValue)">点击我</button>
  11. <button>点我试试看</button>
  12. <a href="https://php.cn">php中文网</a>
  13. <script>
  14. // 获取第二个按钮
  15. var btn = document.querySelector('button:nth-of-type(2)');
  16. // 绑定事件
  17. // addEventListener(type, callback, false)
  18. // 鼠标移入事件: mouseover
  19. btn.addEventListener('mouseover', function (ev) {
  20. // console.log(ev.target);
  21. // ev.target: 触发事件的对象
  22. // console.log(this === ev.target);
  23. ev.target.style = 'width:100px;height:50px;background: lightgreen;outline:none;border:none';
  24. }, false);
  25. // 鼠标移出事件: mouseout
  26. // btn.addEventListener('mouseout', function (ev) {
  27. // // console.log(ev.target);
  28. // // ev.target: 触发事件的对象
  29. // // console.log(this === ev.target);
  30. // ev.target.style = 'none';
  31. // }, false);
  32. // 获取链接
  33. var link = document.links.item(0);
  34. link.onclick = function (ev) {
  35. // 禁止原对象的默认行为
  36. ev.preventDefault();
  37. btn.style = 'none';
  38. };
  39. </script>
  40. </body>
  41. </html>

7. 实战-经典的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="" name="comment" method="post" onsubmit="return false">
  10. <label for="content">请留言:</label>
  11. <input type="text" name="content">
  12. <button>提交</button>
  13. </form>
  14. <ul></ul>
  15. <script>
  16. // 获取表单
  17. var form = document.forms.namedItem('comment');
  18. // 获取留言区
  19. var ul = document.querySelector('ul');
  20. // 监听表单的提交事件
  21. form.addEventListener('submit', function (ev) {
  22. // 禁止原对象的默认行为
  23. ev.preventDefault();
  24. // console.log('事件被监听到了');
  25. // 1. 创建一条新留言
  26. var li = document.createElement('li');
  27. // form.content.value: 留言板内容
  28. if (form.content.value.trim().length === 0) {
  29. alert('内容不能为空');
  30. // 留言框重新获取焦点
  31. form.content.focus();
  32. return false;
  33. } else {
  34. li.innerHTML = form.content.value;
  35. }
  36. // 将留言添加到列表中
  37. // 将最新留言放在最前面显示
  38. // 当留言板为空的时候,直接插入,否则就插入到新一条留言之前
  39. if (ul.childElementCount === 0) {
  40. ul.appendChild(li);
  41. } else {
  42. // insertBefore(要插入的元素, 插入的位置)
  43. ul.insertBefore(li, ul.firstElementChild);
  44. }
  45. // 清空留言框
  46. form.content.value = null;
  47. form.content.focus();
  48. }, false);
  49. </script>
  50. </body>
  51. </html>

8. 实战:添加了删除功能的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-Plus:添加delete功能</title>
  7. </head>
  8. <body>
  9. <form action="" name="comment" method="post" onsubmit="return false">
  10. <label for="content">请留言:</label>
  11. <input type="text" name="content">
  12. <button>提交</button>
  13. </form>
  14. <ul></ul>
  15. <script>
  16. // 获取表单
  17. var form = document.forms.namedItem('comment');
  18. // 获取留言区
  19. var ul = document.querySelector('ul');
  20. // 监听表单的提交事件
  21. form.addEventListener('submit', function (ev) {
  22. // 禁止原对象的默认行为
  23. ev.preventDefault();
  24. // console.log('事件被监听到了');
  25. // 1. 创建一条新留言
  26. var li = document.createElement('li');
  27. // form.content.value: 留言板内容
  28. if (form.content.value.trim().length === 0) {
  29. alert('内容不能为空');
  30. // 留言框重新获取焦点
  31. form.content.focus();
  32. return false;
  33. } else {
  34. li.innerHTML = form.content.value + '<a href="" onclick="del(this)">删除</a>';
  35. }
  36. // 将留言添加到列表中
  37. // 将最新留言放在最前面显示
  38. // 当留言板为空的时候,直接插入,否则就插入到新一条留言之前
  39. if (ul.childElementCount === 0) {
  40. ul.appendChild(li);
  41. } else {
  42. // insertBefor(要插入的元素, 插入的位置)
  43. ul.insertBefore(li, ul.firstElementChild);
  44. }
  45. // 清空留言框
  46. form.content.value = null;
  47. form.content.focus();
  48. }, false);
  49. function del(ele) {
  50. // 禁止原对象的默认行为
  51. this.event.preventDefault();
  52. // console.log(ele.parentElement);
  53. // removeChild()删除子节点
  54. // if (confirm('是否删除?')) {
  55. // ul.removeChild(ele.parentElement);
  56. // }
  57. return confirm('是否删除?') ? ul.removeChild(ele.parentElement) : false;
  58. }
  59. </script>
  60. </body>
  61. </html>

9. 作业

  1. 实例演示获取页面元素的5种方式(操作了下,基本的东西懂了,后面就看怎么传数据)
  2. [选做]:
    按自己理解重写课堂上的: todolist案例, 实现一个简单的在线客服系统,做一个留言与自动回复功能, 自动回复可以创建一个数组,内置一些写好的文本, 随机打乱输出即可, 试试看
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议