一、类数组

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

它有两个特征:
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"));

更多相关文章

  1. 内容分发网络(Content Delivery Network,CDN)
  2. Kubernetes容器集群管理环境 - 完整部署(上篇)
  3. ElasticSearch实战系列四: ElasticSearch理论知识介绍
  4. 【jQuery基础入门】顶级对象$()和jQuery中常用的getter、setter
  5. 技术问答-20 ArrayList和LinkedList
  6. ZooKeeper 分布式锁
  7. css实现垂直居中的方式
  8. 一个可能让你的页面渲染速度提升数倍的CSS属性
  9. 一些鲜为人知的的CSS3属性

随机推荐

  1. Android 隐藏StatusBar
  2. Android界面布局开发使用的标签介绍
  3. 活动的启动模式汇总
  4. android ScrollView边界阴影方法
  5. android全屏设置代码:
  6. ListView 常用属性 详解
  7. Android UI设计随笔
  8. Android的status bar分析
  9. Android四大组件之 BroadcastReceiver
  10. android开发必看资源URL