博客列表 >JS核心知识:DOM操作和事件

JS核心知识:DOM操作和事件

李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰原创
2020年05月27日 23:26:521031浏览

随堂知识总结:

一、DOM操作:

1、节点时DOM树种的最小单元:节点是有类型的:元素、属性、文本、文档、注释、片段等

  1. document:(window.document)获取文档;定义的快速入口:
  2. document.doctype:获得文档类型
  3. document.documentElement:获取文档种的根节点
  4. document.head:获取head节点
  5. document.body:获取body节点
  6. document.title:获取head中的title节点
  7. document.links:获取a链接的节点集合;

2、DOM操作选择函数

  1. document.getElementsByTagName("元素标签名"); //返回HTMLCollection集合
  2. document.getElementById("ID值"); //返回html代码(元素)
  3. document.getElementsByName("name属性值"); //返回Nodelist集合,节点也可以通过数组和item()方法访问
  4. document.getElementsByClassName("class属性值"); //返回HTMLCollection集合
  5. document.querySelector("Css选择器"); //返回html代码
  6. document.querySelectorAll("css选择器"); //返回Nodelist集合

3、属性操作:

  1. .innerText:操作元素中的文字
  2. .innerHTML:可以操作元素中的文字且可以添加html代码
  3. .style.css属性:可以操作css属性值

4、HTMLCollection(HTML元素)集合和Nodelist(节点)集合可以通过for()循环遍历,Nodeslist可以通过forEach()遍历,而HTMLCollection不可以通过forEach()遍历,可以通过Array.from()把HTMLCollection转换成数组来遍历
5、HTMLCollection(HTML元素)集合和Nodelist(节点)集合都可以通过数组方式访问;也可以通过item()方法访问,两都有length()方法获取长度(数量);
6、节点集合操作函数:

  1. 节点集合.childNodes; //返回包含所有节点类型的集合
  2. 节点集合.children; //只包含元素节点类型的集合
  3. 节点集合.childElementCount; //统计元素节点的数量
  4. 节点集合.childNodes.length; //统计所有类型节点的数量

7、节点操作函数:

  1. 节点.nodeName; //返回元素标签
  2. 节点.nodeType; //返回元素类型
  3. 节点.nodeValue; //返回元素值
  4. 节点集合.firstChild; //返回第一个节点
  5. 节点集合.firstElementChild; //返回第一个元素节点
  6. 节点集合.lastChild; //返回最后一个节点
  7. 节点集合.lastElementChild; //返回最后一个元素节点
  8. 节点.previousSibling; //返回当前节点的前一个节点
  9. 节点.nextSibling; //返回当前节点的前一个节点
  10. 节点.previousElementSibling; //返回当前节点的前一个元素节点
  11. 节点.nextElementSibling; //返回当前节点的前一个元素节点
  12. 节点.parentElement;//返回当前节点的父级元素;

8、DOM属性操作,在JS中class是关键字所以使用className代替class属性值,但由于class属性操作经常被使用,classList对象来操作class属性值,更方便
classList对象中的方法:

  1. classList.add()增加值
  2. classList.remove()移除值
  3. classList.toggle()判断,有此值则移除,无则添加
  4. classList.replace()替换

9、在操作HMTL自定义的属性(例如:data-index)时,常用dataset对象来获取其属性值(例如:dataset.index);如果自定义属性是由两个单词通过-连接组成时;在获取其属性值,把-去掉,把第二个单词字母大写即可(例如:data-index-num,获取:dataset.indexNum)
10、append()appendChild()添加元素和节点;
11、在某个元素中子元素之前插入元素:
parentElement.insertBefore(element,element);在某个元素执行插入操作,第一个元素为要插入的元素,第二个参数为以那个元素为参照

二、事件监听

1、addEventListener('事件',function(){},false);事件监听函数,最后一个值false时为冒泡事件,为true为捕获事件
2、常见的事件:
(1)输入文本时:

  1. onchange内容改变事件
  2. onfocus获得焦点事件
  3. onblur失去焦点事件
  4. onkeydown键盘按键按下事件
  5. onkeypress释放键盘按键事件

(2)鼠标事件

  1. onclick点击事件
  2. ondbclick表示鼠标快速点击了两次。
  3. mouseover表示鼠标经过。
  4. mouseout表示鼠标离开区域

3、new Event('事件')创建事件对象,dispatchEvent('事件对象');委派事件对象来触发元素事件;
4、回调函数中事件对象和类型:

  1. ev.type; //监听事件类型
  2. ev.targe; //触发事件元素
  3. ev.currentTarget; //绑定事件元素

5、事件委托把子级事件委托父级来触发,主要通过触犯事件的元素(ev.targe)经行区分是那个子级元素触发的,而非帮绑定事件的元素;
6、冒泡和捕获事件的区别:

代码练习

1.demo

  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>获取dom元素</title>
  7. </head>
  8. <body>
  9. <ul id="list">
  10. <li class="item" name="first">item1</li>
  11. <li class="item">item2</li>
  12. <li class="item">item3</li>
  13. <li class="item active">item4</li>
  14. <li class="item">item5</li>
  15. <a href="#"></a>
  16. </ul>
  17. </body>
  18. </html>
  19. <script>
  20. var cl = console.log.bind(console);
  21. //标签
  22. var lis = document.getElementsByTagName("li"); //返回HTMLCollection集合
  23. cl(lis);
  24. //ID
  25. var ul = document.getElementById("list"); //返回html代码(元素)
  26. cl(ul);
  27. ul.style.fontSize = "18px";
  28. //name
  29. var li1 = document.getElementsByName("first"); //返回Nodelist集合,节点也可以通过数组和item()方法访问
  30. cl(li1[0]);
  31. li1.item(0).innerText = "我是第一个元素"; //通过.innerText可以操作元素中的文字
  32. li1.item(0).innerHTML = "<span style='color:red'>我是第二个元素</span>"; //通过.innerText可以操作元素中的文字且可以添加html代码
  33. //class
  34. var lis = document.getElementsByClassName("item"); //返回HTMLCollection集合
  35. cl(lis);
  36. lis1 = Array.from(lis); //HTMLCollection类型无法使用forEach();可以通过Array.from()转换成数组使用;
  37. cl("转换成数组", lis1);
  38. cl(lis.length); //总数量
  39. cl(lis[0]); //以数组的方式访问HTMLCollection
  40. cl(lis.item(1)); //以类数组对象中的item()的方法访问HTMLCollection
  41. //选中的元素和标签可以通过的对象方法操作其属性:.style操作样式;
  42. // CSS选择器
  43. var ul = document.querySelector("#list"); //返回html代码
  44. cl(ul);
  45. var lis = document.querySelectorAll(".item"); //返回Nodelist集合
  46. cl(lis);
  47. lis.forEach(function (item) {
  48. item.style.background = "lightgreen";
  49. });
  50. var first = document.querySelectorAll("#list>:nth-of-type(-n+2)");
  51. var last = document.querySelectorAll("#list>:nth-of-type(n+4)");
  52. cl(first);
  53. cl(last);
  54. cl(document.doctype); //获取文档类型
  55. cl(document.documentElement); //获取html文档内容不包含(文档类型);
  56. cl(window.document); //获取html文档所有内容(包含文档类型);
  57. cl(document.title); //获取html文档标题title .body获取主体内容部分,.head获取头部信息内容;
  58. cl(document.links); //获取文档链接返回HTMLCollection集合
  59. </script>

2.demo2

  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>Document</title>
  7. </head>
  8. <body>
  9. <ul id="fisrt">
  10. <li>item01</li>
  11. <li>item02</li>
  12. <li>item03</li>
  13. <li>item04</li>
  14. <li>item05</li>
  15. </ul>
  16. </body>
  17. <script>
  18. var cl = console.log.bind(console);
  19. /*js节点类型:
  20. 1.元素
  21. 2.属性
  22. 3.文本
  23. 6.注释
  24. 9.文档
  25. 11.文档片段
  26. */
  27. var ul = document.querySelector("ul");
  28. /* var li = document.createElement("li");
  29. li.innerHTML = "item6";
  30. //append和appendChild区别在于,append可以添加多个节点,而appendchild只能添加一个节点且不能直接添加字符串;
  31. //且不会重复添加一个元素
  32. ul.append(li);
  33. ul.appendChild(li);*/
  34. // nodeslist
  35. cl(ul);
  36. var lis = document.querySelectorAll("li");
  37. cl(lis);
  38. cl(ul.childNodes); //返回包含所有节点类型的集合
  39. cl(ul.children); //只包含元素节点类型的集合
  40. cl(ul.childElementCount); //统计元素节点的数量
  41. cl(ul.childNodes.length); //统计所有类型节点的数量
  42. cl(ul.childNodes[0]);
  43. cl(ul.childNodes[1].nodeName); //返回元素标签
  44. cl(ul.childNodes[1].nodeType); //返回元素类型
  45. cl(ul.childNodes[1].nodeValue); //返回元素值
  46. cl(ul.firstChild); //返回第一个节点
  47. cl(ul.firstElementChild); //返回第一个元素节点
  48. cl(ul.lastChild); //返回最后一个节点
  49. cl(ul.lastElementChild); //返回最后一个元素节点
  50. cl("返回前一个节点(previousSibling)和下一个节点(nextSibling)");
  51. cl(ul.childNodes[3]); //返回当前节点
  52. cl(ul.childNodes[3].previousSibling); //返回当前节点的前一个节点
  53. cl(ul.childNodes[3].nextSibling); //返回当前节点的前一个节点
  54. cl("^…………");
  55. cl(ul.childNodes[3]); //返回当前节点
  56. cl(ul.childNodes[3].previousElementSibling); //返回当前节点的前一个元素节点
  57. cl(ul.childNodes[3].nextElementSibling); //返回当前节点的前一个元素节点
  58. </script>
  59. </html>

3.demo3

  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>节点中className和classList</title>
  7. <style>
  8. .red {
  9. color: red;
  10. }
  11. .item {
  12. background-color: lightskyblue;
  13. }
  14. .blue {
  15. color: limegreen;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <ul id="first">
  21. <li class="item">item1</li>
  22. <li class="item">item2</li>
  23. <li class="item">item3</li>
  24. <li class="item">item4</li>
  25. <li class="item">item5</li>
  26. <li class="item">item6</li>
  27. </ul>
  28. </body>
  29. <script>
  30. var cl = console.log.bind(console);
  31. var ul = document.querySelector("ul");
  32. cl(ul.id); //输出元素中的id值
  33. cl(ul.children[0].className); //输出节点的class值,在JS中class是关键字所以使用className代替class
  34. cl(ul.children[1].classList); //返回的是DOMTokenList对象
  35. /*
  36. classList对象中的方法:
  37. 1.add()增加值
  38. 2.remove()移除值
  39. 3.toggle()判断,有此值则移除,无则添加
  40. 4.replace()替换
  41. */
  42. ul.children[3].classList.add("red");
  43. ul.children[4].classList.remove("item");
  44. ul.children[3].classList.toggle("red"); //有则移除
  45. ul.children[4].classList.toggle("red"); //无则添加
  46. ul.children[2].classList.replace("item", "blue"); //把元素中的item替换成blue;
  47. </script>
  48. </html>

4.demo4

  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>data-属性</title>
  7. </head>
  8. <body>
  9. <!-- html5中可以使用自定义数据属性保存标签的附加信息,data-做为前缀 -->
  10. <ul data-index="1">
  11. <li data-index="1">item1</li>
  12. <li data-index="2">item2</li>
  13. <li data-index-num="three">item3</li>
  14. <li data-index="4">item4</li>
  15. <li data-index="5">item5</li>
  16. </ul>
  17. </body>
  18. <script>
  19. var cl = console.log.bind(console);
  20. var ul = document.querySelector("ul");
  21. cl(ul);
  22. cl(ul.children);
  23. //data-index获取其属性时去掉data即dataset.index;
  24. cl(ul.children[0].dataset.index);
  25. //如果属性名data-index-num时将中间线去掉,第二个单词字母大写,例如:dataset.indexNum;
  26. cl(ul.children[2].dataset.indexNum); //获取其属性值
  27. ul.children[2].dataset.indexNum = "3"; //修改其属性值
  28. </script>
  29. </html>

5.demo5

  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>Document</title>
  7. </head>
  8. <body>
  9. <!-- 事件触犯和执行都在元素上 -->
  10. <span onclick="alert(this.innerText)">你好</span>
  11. <br />
  12. <!-- 事件触犯在元素上,通过函数调用执行JS中函数执行 -->
  13. <span onclick="show(this)">php中文网</span>
  14. <p id="p">你好</p>
  15. <span>种业圈</span>
  16. </body>
  17. <script>
  18. function show(item) {
  19. var text = item.innerText;
  20. alert(text);
  21. }
  22. // 通过获取元素绑定事件,并执行
  23. var p = document.querySelector("#p");
  24. p.onclick = function () {
  25. alert(this.nodeName);
  26. };
  27. //监听事件
  28. var span = document.querySelector("body>span:last-of-type");
  29. console.log(span);
  30. span.addEventListener(
  31. "click",
  32. function (ev) {
  33. alert(ev.target.innerText);
  34. },
  35. false
  36. );
  37. //创建委托事件来触发
  38. var ev = new Event("click"); //创建点击事件对象
  39. span.dispatchEvent(ev); //委派点击事件来触发span事件
  40. </script>
  41. </html>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议