Blogger Information
Blog 17
fans 0
comment 0
visits 14802
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
js基础知识:JS对DOM元素的基本操作,遍历、增删改查。
未来星
Original
857 people have browsed it

一、类数组

类数组其实是一个对象,这种特殊的对象类似数组,象数组但又不是数组。

它有两个特征:
1、有一个length属性;
2、有递增的正整数索引;

  1. console.log(document.querySelectorAll(".item"));
  2. // 类数组,其实是一个对象
  3. const brand = {
  4. 0: "HUAWEI",
  5. 1: "Apple",
  6. 2: "XiaoMi",
  7. length: 3,
  8. };
  9. console.log(brand);
  10. console.log(brand.length);
  11. console.log(brand[0], brand[1], brand[2]);
  12. console.log(Array.isArray(brand));
  13. console.log(brand instanceof Object);
  14. // 数组有一个push(): 从尾部向数组追加一个成员
  15. // const arr = [1, 2, 3];
  16. // console.log(arr);
  17. // arr.push(4);
  18. // console.log(arr);
  19. // brand.push("OnePlus");

将“类数组”转为真正的数组,方便我们使用强大的数组方法来操作。
Array.from()方式转换,push方法添加项目。

  1. // 将“类数组”转为真正的数组,方便我们使用强大的数组方法来操作
  2. //Array.from()
  3. let arr1 = Array.from(brand);
  4. console.log(Array.isArray(arr1));
  5. arr1.push("OnePlus");
  6. console.log(arr1);

二、获取DOM元素

DOM(Document Object Model——文档对象模型)是用来呈现以及与任意 HTML 或 XML文档交互的API。DOM 是载入到浏览器中的文档模型,以节点树的形式来表现文档,每个节点代表文档的构成部分(例如:页面元素、字符串或注释等等)。

获取DOM满足条件的单个元素使用querySelector,获取DOM满足条件的元素集合使用querySelectorAll

  1. <h2>Hello World</h2>
  2. <script>
  3. // querySelector 单元素
  4. let h2 = document.querySelector('h2');
  5. h2.style.backgroundColor = 'cyan';
  6. </script>
  1. <ul>
  2. <li>基础元素1</li>
  3. <li>基础元素2</li>
  4. <li>基础元素3</li>
  5. <li>基础元素4</li>
  6. <li>基础元素5</li>
  7. </ul>
  8. <script>
  9. let lis = document.querySelectorAll('ul li');
  10. lis.forEach((env) => env.style.backgroundColor = 'red');
  11. </script>

注意:querySelector()和querySelectorAll()方法括号中的取值都是css选择器,但两个方法是有区别的。当有多个class相同的元素时,使用querySelector()方法只能获取到第一个class为box的元素,而querySelectorAll()获取到了所有class为box的元素集合。

三、DOM树的遍历

我们一般用下列这些来获取相应的元素节点。

1、childElementCount 返回当前子节点个数

  1. let ul = document.querySelector("ul");
  2. console.log(ul.childElementCount); // 6
  3. cosnole.log(ul.children.length); // 6

2、parentElement 返回当前元素的父元素节点

  1. let li = document.querySelector("li");
  2. console.log(li.parentElement);

3、children 返回当前元素的元素子节点

  1. let ul = document.querySelector("ul");
  2. console.log(ul.children);

4、firstElementChild 返回的是第一个元素子节点

  1. let ul = document.querySelector("ul");
  2. console.log(ul.firstElementChild);

5、lastElementChild 返回的是最后一个元素子节点

  1. let ul = document.querySelector("ul");
  2. console.log(ul.lastElementChild);

6、nextElementSibling 返回的是后一个兄弟元素节点

  1. let li3 = document.querySelector("ul li:nth-of-type(3)");
  2. console.log(li3.nextElementSibling);

7、previousElementSibling 返回的是前一个兄弟元素节点

  1. let li3 = document.querySelector("ul li:nth-of-type(3)");
  2. console.log(li3.previousElementSibling);
  1. <script>
  2. // dom树中的所有内容都是:节点
  3. // 节点是有类型的: 元素,文本,文档,属性..
  4. let nodes = document.querySelector(".list");
  5. console.log(nodes.childNodes);
  6. // 通常只关注元素类型的节点
  7. console.log(nodes.children);
  8. let eles = nodes.children;
  9. // 遍历
  10. // 将类数组转为真正的数组类型
  11. console.log([...eles]);
  12. [...eles].forEach((ele) => console.log(ele));
  13. // 获取第一个
  14. let firstItem = eles[0];
  15. firstItem.style.background = "yellow";
  16. // 最后一个
  17. // let lastItem = eles[4];
  18. let lastItemIndex = eles.length - 1;
  19. let lastItem = eles[lastItemIndex];
  20. lastItem.style.background = "lightblue";
  21. // js提供一些快捷方式来获取第一个和最后一个
  22. const list = document.querySelector(".list");
  23. firstItem = list.firstElementChild;
  24. firstItem.style.background = "seagreen";
  25. lastItem = list.lastElementChild;
  26. lastItem.style.background = "yellow";
  27. console.log(eles.length);
  28. console.log(list.childElementCount);
  29. console.log(list.childElementCount === eles.length);
  30. // 如何想获取第二个元素怎么办?
  31. // 第二个元素就是第一个元素的下一个兄弟节点
  32. let secondItem = firstItem.nextElementSibling;
  33. secondItem.style.background = "red";
  34. // 获取第5个, 是最后一个元素的前一个兄弟节点
  35. let fiveItem = lastItem.previousElementSibling;
  36. fiveItem.style.background = "cyan";
  37. </script>

四、DOM的增删改

  • append:在尾部追加
  • prepend:在头部追加
  • before:在参考点之前添加一个新节点
  • after:在参考点之后添加一个新节点
  • replaceWith:替换元素
  • remove(无参数):删除元素
  • afterBegin: 开始标签之后,第一个子元素
  • beforeBegin: 开始标签之前,是它的前一个兄弟元素
  • afterEnd: 结束标签之后,它的下一个兄弟元素
  • beforeEnd: 结束标签之前,它的最后一个子元素
  1. <script>
  2. // 创建dom元素
  3. let div = document.createElement("div");
  4. let span = document.createElement("span");
  5. // console.log(div, span);
  6. span.textContent = "hello";
  7. // append(ele,'text'),将参数做为父元素的最后一个子元素追加到列表中,无返回值
  8. // span 添加到div中
  9. div.append(span);
  10. div.append(span, " world");
  11. console.log(div);
  12. // document.body.append(div);
  13. // document.body.append(span, " world");
  14. // 为什么div中的span消失了?
  15. // 新元素span只能插入到一个地方
  16. // span在div,现在span在body中,相当于剪切操作
  17. // 如果想保留span在div中,要克隆span
  18. // true: 是完整的保留元素内部结构
  19. document.body.append(span.cloneNode(true), " world");
  20. // append()创建一个列表
  21. const ul = document.createElement("ul");
  22. // 循环来生成多个列表项li
  23. for (let i = 1; i <= 5; i++) {
  24. let li = document.createElement("li");
  25. li.textContent = `item${i}`;
  26. ul.append(li);
  27. }
  28. document.body.append(ul);
  29. // 和append()在尾部追加, 对应的,prepend(): 在头部追加
  30. li = document.createElement("li");
  31. li.textContent = "first item";
  32. li.style.color = "red";
  33. ul.prepend(li);
  34. // 如果想在除了头尾之外的地方添加怎么操作?
  35. // 必须要有一个参考节点的位置,否则就不知道要添加到哪个节点的前面或后面了
  36. // 我以第四个节点为参考
  37. const referNode = document.querySelector("li:nth-of-type(4)");
  38. referNode.style.background = "cyan";
  39. // 在它之前添加一个新节点
  40. li = document.createElement("li");
  41. li.textContent = "在参考节点之前插入";
  42. li.style.background = "yellow";
  43. // referNode.before(el),在插入位置(参考节点)上调用
  44. referNode.before(li);
  45. // 在它之后添加一个新节点
  46. li = document.createElement("li");
  47. li.textContent = "在参考节点之后插入";
  48. li.style.background = "violet";
  49. // referNode.after(el),在插入位置(参考节点)上调用
  50. referNode.after(li);
  51. // 替换节点
  52. // 将最后一个节点用链接替换
  53. let lastItem = document.querySelector("ul li:last-of-type");
  54. let a = document.createElement("a");
  55. a.textContent = "php中文网";
  56. a.href = "https://php.cn";
  57. lastItem.replaceWith(a);
  58. // 删除节点,在被删除的节点上直接调用
  59. // 将ul的第6个删除,remove(无参数)
  60. ul.querySelector(":nth-of-type(6)").remove();
  61. // 再介绍几个更牛B的
  62. // insertAdjacentElement('插入位置', 元素)
  63. // 插入位置有四个
  64. // afterBegin: 开始标签之后,第一个子元素
  65. // beforeBegin: 开始标签之前,是它的前一个兄弟元素
  66. // afterEnd: 结束标签之后,它的下一个兄弟元素
  67. // beforeEnd: 结束标签之前,它的最后一个子元素
  68. // 插入第一个子元素之前(在起始标签之后);
  69. li = document.createElement("li");
  70. li.textContent = "第一个子元素";
  71. ul.insertAdjacentElement("afterbegin", li);
  72. ul.insertAdjacentElement("beforebegin", li);
  73. // 还有一个plus,可以直接使用html字符串当元素,省去了创建元素的过程
  74. // 追加到结尾
  75. ul.insertAdjacentHTML("beforeEnd", '<li style="color:red">最后一个子元素</li>');
  76. // 还可以直接插入文本
  77. const h2 = document.createElement("h2");
  78. h2.insertAdjacentText("beforeend", ul.lastElementChild.textContent);
  79. console.log(h2);
  80. document.body.insertAdjacentElement("afterend", h2);
  81. </script>

五、设置节点内容

  • innerText返回的是元素内包含的文本内容(只返回文本节点类型);
  • innerHTML返会元素内HTML结构,包括元素节点、注释节点、文本节点;
  • outerHTML返回包括元素节点自身和里面的所有元素节点、注释节点、文本节点;

六、设置元素样式

1、行内样式

  1. <p>Hello World</p>
  2. <script>
  3. // 1. 行内样式
  4. const p = document.querySelector("p");
  5. p.style.color = "red";
  6. p.style.fontSize = "30px";
  7. console.log(p);
  8. </script>
  9. // <p style="color: red; font-size: 30px;">Hello World</p>

2、类样式
className是类别选择器的名字,使用这个className可以进行动态更改某个标签的类的属性值。

  1. // 直接修改元素的类名,多个以空格隔开
  2. p.className = 'one content';

使用元素的 classList 属性可以访问或添加、删除及修改元素的 class 属性。

classList.add()添加
classList.remove()移除
classList.replace()替换
classList.toggle()切换

  1. const ul = document.querySelector('ul');
  2. // 一个子元素
  3. const firstLi = ul.firstElementChild;
  4. // 最后一个子元素
  5. const lastLi = ul.lastElementChild;
  6. // 添加class类
  7. firstLi.classList.add('cgreen', 'f32');
  8. lastLi.classList.add('cpink');
  9. // 移除class类
  10. firstLi.classList.remove('f32');
  11. // 替换class 类
  12. lastLi.classList.replace('cpink', 'cred');
  13. // 切换类样式(没有则添加,有则移除)
  14. // 点击按钮切换item1的类样式
  15. const btn = document.querySelector("input[type='button']");
  16. btn.addEventListener('click', function() {
  17. firstLi.classList.toggle('f32')
  18. })

3、计算样式
一个元素最终应该渲染成什么样式,由浏览器来决定; 浏览器根据一个元素的行内样式,内部样式,外部样式表来计算出最终的样式。

  1. // 第一个参数是要查看样式的元素,第二个参数是伪元素
  2. let styles = window.getComputedStyle(p, null);
  3. // let styles = document.defaultView.getComputedStyle("p", null);
  4. // 计算样式都是只读的
  5. // console.log(styles);
  6. console.log(styles.getPropertyValue("height"));
  7. console.log(styles.getPropertyValue("background-color"));
  8. console.log(styles.getPropertyValue("color"));
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
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