博客列表 >ES6 JS获取元素api&& Dom 常用遍历方法 含源码(1107)

ES6 JS获取元素api&& Dom 常用遍历方法 含源码(1107)

高空中的云
高空中的云原创
2022年11月15日 13:18:58403浏览

ES6 实例演示二个获取元素的api

querySelector/querySelectorAllgetElementby相比较优势是:可以使用 CSS 风格的 Selectors;并且几乎支持所有CSS选择器的 syntax 风格

  • querySelector()
    文档对象模型Document引用的 querySelector() 方法返回文档中与指定选择器或选择器组匹配的第一个 Element对象。如果找不到匹配项,则返回null。
  1. const ul = document.querySelector('ul'); //等同于 document.getElementbyTagname('ul')[0]
  2. console.log(ul);
  3. //如果页面中有ul标签,则打印第一个<ul>...</ul>,如无,则打印null
  • querySelectorAll()

    返回与指定的选择器组匹配的文档中的元素列表 (使用深度优先的先序遍历文档的节点)。返回的对象是 NodeList 。

  1. const ul = document.querySelectorAll('ul'); // 等同于 document.getElementbyTagname('ul')
  2. console.log(ul);
  3. // 如果页面有ul标签,则打印所有ul的集合,例如:NodeList(2) [ul, ul]...

实例演示dom常用的遍历方法

nodeType 节点类型,常见值:1,元素节点;3,元素或属性中的文字;9,文档类型节点

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <ul class="list"><li>item1</li><li>item2</li><li>item3</li><li>item4</li><li>item5</li></ul>
  11. <ul class="listWithWrap">
  12. <li>listwithwrapItem1</li>
  13. <li>listwithwrapItem2</li>
  14. <li>listwithwrapItem3</li>
  15. </ul>
  16. <script>
  17. const list = document.querySelector('.list');
  18. const listWithWrap = document.querySelector('.listWithWrap');
  19. // nodeType 节点类型
  20. console.log("---------nodeType---------");
  21. console.log(
  22. "list nodeType:" + list.nodeType +
  23. "\nlistWithWrap nodeType: " + listWithWrap.nodeType);
  24. // 都是ul开头,所以都是html标签,即 nodeType == 1 == Node.ELEMENT_NODE
  25. // 1. 所有子节点: childNodes
  26. console.log("--------childNodes----------");
  27. let listItems = list.childNodes;
  28. let listWithWrapItems = listWithWrap.childNodes;
  29. console.log(
  30. "listItems.childNode[0].nodeType=" + listItems[0].nodeType
  31. +
  32. "\nlistWithWrapItems.childNode[0].nodeType=" + listWithWrapItems[0].nodeType
  33. )
  34. //list 没有换行,所以第一个childNode 是'li标签',是一个html标签, 即 nodeType == 1 == Node.ELEMENT_NODE
  35. // listWithwrap 有换行,所以第一个childNode 是 '\n',是一个文本,即 nodeType == 3 == Node.TEXT_NODE,
  36. // listWithWrap为什么是11个,因为有6个文本类型节点(text:`\n`),5个元素类型节点(`li`)
  37. // 类数组
  38. // 1. Array.from
  39. console.log("---------from-----------")
  40. console.log(Array.from(listItems))
  41. console.log(Array.from(listWithWrapItems))
  42. // 2. ...rest
  43. console.log("---------rest-----------")
  44. // ...在这里是把数组中的元素展开
  45. console.log([...listItems])
  46. console.log([...listWithWrapItems])
  47. // 转为数组之后,Array很多API都可以用
  48. // 要求只返回“元素类型的节点”
  49. let resultListItems = [...listItems].filter(item => item.nodeType === 1)
  50. let resultListWithWrapItems = [...listWithWrapItems].filter(item => item.nodeType === 1)
  51. console.log("-------只返回元素类型节点-------")
  52. console.log(resultListItems)
  53. console.log(resultListWithWrapItems)
  54. console.log("------------封装函数----------------")
  55. // 封装
  56. const getChildren = items => [...listItems].filter(item => item.nodeType === 1)
  57. // 使用这个API
  58. console.log(getChildren(listItems))
  59. console.log(getChildren(listWithWrapItems))
  60. // js已经给我们封装好一个属性 children
  61. console.log("---------js已定义属性children----------")
  62. // 2. children : 所有子元素节点
  63. console.log(list.children)
  64. console.log(listWithWrap.children)
  65. // children : 类数组
  66. // 3. 第一个子元素
  67. // ele.textContent: 元素内的文本
  68. console.log("----------------element.textContent----------------")
  69. console.log(list.children[0].textContent)
  70. console.log(listWithWrap.children[0].textContent)
  71. // 语法糖
  72. console.log("------------------语法糖-----------------------------")
  73. console.log("------------firstElementChild-----------------")
  74. let first = list.firstElementChild
  75. console.log(first.textContent)
  76. // 4. 后一个兄弟
  77. console.log("------------后一个兄弟:first-child + * ,与css选择器相同-----------------")
  78. let next = list.querySelector(':first-child + *')
  79. next.style.color = 'blue'
  80. next = first.nextElementSibling
  81. console.log(next.style);
  82. console.log("------------第三个兄弟:nth-of-type(3) ,与css选择器相同-----------------")
  83. let third = listWithWrap.querySelector(':nth-of-type(3)');
  84. third.style.color = '#2900e8';
  85. third.style.fontWeight = 'bolder';
  86. console.log(third.style)
  87. // 5. 最后一个
  88. console.log("----------------最后一个:lastElementChild ---------------")
  89. let last = list.lastElementChild
  90. last.style.color = 'red'
  91. console.log(last.style);
  92. // 6. 前一个兄弟
  93. console.log("------------------前一个兄弟:previousElementSibling--------------------------")
  94. let prev = last.previousElementSibling
  95. prev.style.color = 'violet'
  96. console.log(prev.style);
  97. // 7. 父节点: 一定是元素或文档类型
  98. console.log("------------------list父节点:parentNode-------------------------------")
  99. let parent = list.parentNode
  100. console.log(parent);
  101. parent.style.border = '1px solid';
  102. // 8. 遍历
  103. // 在 [],{},()前分号不能省
  104. // 正确写法
  105. [...list.children].forEach(item => (item.style.border = '1px solid red'));
  106. // 为什么不能让list直接用forEach,因为querySelector/querySelectorAll返回的是一个元素集,不是 NodeList
  107. // 需要先用...展开成一个数组
  108. // 以下代码会报错
  109. console.log(listWithWrap);
  110. listWithWrap.forEach(
  111. (item) =>
  112. alert('aaa')
  113. );
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议