金色小芝麻

vuePress-theme-reco 金色小芝麻    2021 - 2023
金色小芝麻 金色小芝麻

Choose mode

  • dark
  • auto
  • light
主页
分类
  • JavaScript
  • BUG复盘
  • SVG笔记
  • TypeScript
  • 个人总结
  • CSS笔记
  • 开发工具
  • 前端入门
  • Vue2.0
  • 性能优化
  • 架构学习
  • 每日一题
标签
时间轴
社交
  • 掘金 (opens new window)
author-avatar

金色小芝麻

83

文章

27

标签

主页
分类
  • JavaScript
  • BUG复盘
  • SVG笔记
  • TypeScript
  • 个人总结
  • CSS笔记
  • 开发工具
  • 前端入门
  • Vue2.0
  • 性能优化
  • 架构学习
  • 每日一题
标签
时间轴
社交
  • 掘金 (opens new window)
  • 前端入门

    • 博客搭建过程及相关配置
    • 数组中的16种常用方法
    • JS中的数据类型简析——基本数据类型值
    • JS中的数据类型object基础
    • JS中三种常见的判断
    • 数据类型之间的区别(堆内存Heap VS 栈内存Stack)
    • JS基础练习题及解析
    • 开关灯的小案例
    • JS中数据类型检测方法——typeof
    • 条件判断几个小练习
    • JS循环——for循环
    • 自定义属性实现选项卡小案例
    • 字符串中的12种常用方法
    • DOM操作的简单原理
    • JS实现隔行变色鼠标跟随小案例
    • JS中function的基础知识
    • JS中数组去重的三种方法
    • JS中时间格式化的三种方法
    • JS中URL参数处理的三种方法
    • JS小案例——获取随机验证码
    • DOM操作之——获取DOM标签的9种方式
    • DOM操作之——DOM节点类型及属性
    • DOM操作之——元素的增删改、样式修改、插入内容
    • JS中THIS相关问题梳理
    • JS中的变量提升机制
    • 在全局:私有上下文中:带VAR和不带VAR的区别
    • 作用域和作用域链查找机制
    • JS中堆栈内存的释放问题
    • JS中的闭包机制
    • ES3和ES6定义变量的区别
    • JS中的单例和工厂设计模式
    • JS中的面向对象OOP理论基础
    • 构造函数创建自定义类
    • JS中的原型和原型链
    • Math中常用的9种方法
    • 从一道阿里经典面试题剖析函数三种角色
    • 重写内置call
    • 重写一个内置new
    • 浏览器渲染页面的主体流程
    • 减少DOM的回流和重绘
    • JS中的多种继承方式
    • JS中数据类型检测四种方式的优缺点
    • JS中的正则表达式&&全面梳理
    • 非严格模式 🆚 严格模式的区别
    • 数组方法reduce、filter、flat
    • 获取数组中最大值/最小值的三种基础方法
    • 轮播图——渐隐渐显版
    • 深克隆 VS 浅克隆|深比较 VS 浅比较|回调函数
    • 轮播图——左右切换版
    • 事件及事件绑定、事件对象及事件传播
    • 从在地址栏输入网址到看到页面的过程&&AJAX基础
    • 想自学JS吗?想提升JS底层原理吗?76张脑图带你彻底搞懂原生JS
    • 面试手写API系列
    • 30张脑图带你从零开始学VUE
    • JS中的盒子模型
    • 初识JS-基础中的基础
    • 前端发展简史
    • JS中的三大类输出方式

DOM操作的简单原理

vuePress-theme-reco 金色小芝麻    2021 - 2023

DOM操作的简单原理

金色小芝麻 2020-04-11

JS的三大组成部分:

  • ECMAScript:定义了JS的语法规范;
  • DOM:提供操作文档的属性和方法;
  • BOM:提供操作浏览器的属性和方法;

我们以document.getElementsByTagName为例简单了解下通过JS操作DOM的原理:

# 一、以给第一个LI标签设置背景颜色为例解析:

  • 1、首先在页面中写入几个li标签,

  • 2、通过document.getElementsByTagName("li")获取到所有li标签

  • 3、在控制台打印

    可以看到此时我们已经获取到所有的li标签;

  • 4、并且每个li标签前面都有一个数字索引,我们可以通过相应的索引,获取到每个li,这个获取到的li集合,我们称之为类数组。

    list[0](代表第一个li)打开索引为0的这个li,我们看到如下:

  • 5、展开后,我们看到里面包含了很多键值对,所以说,li又是一个对象;

  • 6、既然是对象,那么就需要开辟一个堆内存,用来储存这个对象;

  • 7、实际上我们的li指向的是存储这个对象的堆内存的空间地址;

    仔细查看我们会看到几个熟悉的身影:

  • 8、上面说到li的指向是一个空间地址,那么如果我们想给当前的li改变一个背景颜色;

  • 9、那么我们首先需要通过这个空间地址找到li所指向的这个堆内存;

  • 10、然后在堆内存中修改背景颜色(背景颜色属于样式信息);

  • 11、既然我们已经知道背景颜色属于样式信息,那么我们就需要先通过style找到它

  • 12、打开style发现,它也是一个对象,

  • 13、既然是对象,那么就需要开辟一个堆内存,用来储存这个对象....

  • 14、我们想要修改背景颜色,还需要基于style指向的空间地址,找到这个堆,在进行修改。

  • 15、上图中我们已经找到这个背景颜色这个属性,当前为空字符串,是因为我们之前并没有设置过背景颜色。

  • 16、我们现在想要设置

    • 先找到第一个li所指向的堆list[0];
    • 然后找到这个堆中的style:list[0].style;
    • 在基于style所指向的空间地址找到backgroundColor:list[0].style.backgroundColor;
    • 当前为空字符串,重新赋值为我们需要的颜色字符串的red;

终于大功告成了

# 二、原理总结

根据上面给LI换背景颜色的案例,我们已经清楚,

  • 实际上就是利用对象通过属性名查找对应属性值的原理,完成值的获取和替换操作。
  • 既然是对象,上面说完可以查找和替换,当然也可以新增,在这里我们叫做自定义属性

理解完上面的原理,我们在看之前做过的一个题,就更好理解了

let box = document.getElementById('box');
    box.style.color = 'red';

let boxSty = box.style; //=>获取的是STYLE对应的对象  BBBFFF000
    boxSty.color = 'red';

let text = box.style.color; //=>获取的是color初始值'',基本类型值,直接存在栈内存中
    text = 'red'; */

欢迎来到 金色小芝麻
看板娘