JavaScript进阶班之DOM技术(四),2024年最新vue总结来了

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

var nav = document.querySelector(‘#nav’);

console.log(nav);

var li = document.querySelector(‘li’);

console.log(li);

// 3. querySelectorAll()返回指定选择器的所有元素对象集合

var allBox = document.querySelectorAll(‘.box’);

console.log(allBox);

var lis = document.querySelectorAll(‘li’);

console.log(lis);

2.6、获取特殊元素


①获取body元素

返回body元素对象

document.body;

②获取html元素

返回html元素对象

document.documentElement;

3、事件基础

========================================================================

3.1、事件概述


JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。

简单理解: 触发— 响应机制。

网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。

3.2、事件三要素


  1. 事件源(谁)

  2. 事件类型(什么事件)

  3. 事件处理程序(做啥)

3.3、执行事件的步骤


  1. 获取事件源

  2. 注册事件(绑定事件)

  3. 添加事件处理程序(采取函数赋值形式)

3.4、鼠标事件


| 鼠标事件 | 触发条件 |

| — | — |

| onclick | 鼠标点击左键触发 |

| onmouseover | 鼠标经过触发 |

| onmouseout | 鼠标离开触发 |

| onfocus | 获得鼠标焦点触发 |

| onblur | 失去鼠标焦点触发 |

| onmousemove | 鼠标移动触发 |

| onmouseup | 鼠标弹起触发 |

| onmousedown | 鼠标按下触发 |

4、操作元素

========================================================================

JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容 、属性等。注意以下都是属性

4.1、改变元素内容


从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会去掉。

element.innerText

起始位置到终止位置的全部内容,包括HTML标签,同时保留空格和换行

element.innerHTML

我是文字

123

在这里插入图片描述

4.2、改变元素属性


// img.属性

img.src = “xxx”;

input.value = “xxx”;

input.type = “xxx”;

input.checked = “xxx”;

input.selected = true / false;

input.disabled = true / false;

4.3、改变样式属性


我们可以通过 JS 修改元素的大小、颜色、位置等样式。

  • 行内样式操作

// element.style

div.style.backgroundColor = ‘pink’;

div.style.width = ‘250px’;

  • 类名样式操作

// element.className

注意:

  1. JS里面的样式采取驼峰命名法,比如 fontSize ,backgroundColor

  2. JS 修改 style 样式操作 ,产生的是行内样式,CSS权重比较高

  3. 如果样式修改较多,可以采取操作类名方式更改元素样式

  4. class 因为是个保留字,因此使用className来操作元素类名属性

  5. className 会直接更改元素的类名,会覆盖原先的类名

文本

4.4、总结


在这里插入图片描述

4.5、排他思想


如果有同一组元素,我们相要某一个元素实现某种样式,需要用到循环的排他思想算法:

  1. 所有元素全部清除样式(干掉其他人)

  2. 给当前元素设置样式 (留下我自己)

  3. 注意顺序不能颠倒,首先干掉其他人,再设置自己

按钮1

按钮2

按钮3

按钮4

按钮5

在这里插入图片描述

4.6、自定义属性


4.6.1、获取属性值

  • 获取内置属性值(元素本身自带的属性)

element.属性;

  • 获取自定义的属性

element.getAttribute(‘属性’);

4.6.2、设置属性值

  • 设置内置属性值

element.属性 = ‘值’;

  • 主要设置自定义的属性

element.setAttribute(‘属性’,‘值’);

4.6.3、移除属性

element.removeAttribute(‘属性’);

4.7、H5自定义属性


自定义属性目的:

  • 保存并保存数据,有些数据可以保存到页面中而不用保存到数据库中

  • 有些自定义属性很容易引起歧义,不容易判断到底是内置属性还是自定义的,所以H5有了规定

4.7.1 设置H5自定义属性

H5规定自定义属性 data-开头作为属性名并赋值

// 或者使用JavaScript设置

div.setAttribute(‘data-index’,1);

4.7.2 获取H5自定义属性

  • 兼容性获取 element.getAttribute('data-index')

  • H5新增的:element.dataset.indexelement.dataset['index'] IE11才开始支持

5、节点操作

========================================================================

获取元素通常使用两种方式:

| 1.利用DOM提供的方法获取元素 | 2.利用节点层级关系获取元素 |

| — | — |

| document.getElementById() | 利用父子兄节点关系获取元素 |

| document.getElementsByTagName() | 逻辑性强,但是兼容性较差 |

| document.querySelector 等 | |

| 逻辑性不强,繁琐 | |

这两种方式都可以获取元素节点,我们后面都会使用,但是节点操作更简单

一般的,节点至少拥有三个基本属性

5.1、节点概述


网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。

HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。

在这里插入图片描述

一般的,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

  • 元素节点:nodeType 为1

  • 属性节点:nodeType 为2

  • 文本节点:nodeType 为3(文本节点包括文字、空格、换行等)

我们在实际开发中,节点操作主要操作的是元素节点

利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系

5.2、父级节点


node.parentNode

  • parentNode属性可以返回某节点的父结点,注意是最近的一个父结点

  • 如果指定的节点没有父结点则返回null

我是div

我是span

    • 我是li
    • 我是li
    • 我是li
    • 我是li
    • ×

      5.3、子结点


      parentNode.childNodes(标准)

      • parentNode.childNodes 返回包含指定节点的子节点的集合,该集合为即时更新的集合

      • 返回值包含了所有的子结点,包括元素节点,文本节点等

      • 如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes

      parentNode.children(非标准)

      • parentNode.children 是一个只读属性,返回所有的子元素节点

      • 它只返回子元素节点,其余节点不返回 (这个是我们重点掌握的

      • 虽然 children 是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用

      • 我是li
      • 我是li
      • 我是li
      • 我是li
        1. 我是li
        2. 我是li
        3. 我是li
        4. 我是li
        5. 5.3.1、第一个子结点

          parentNode.firstChild

          • firstChild 返回第一个子节点,找不到则返回null

          • 同样,也是包含所有的节点

          5.3.2、最后一个子结点

          parentNode.lastChild

          • lastChild 返回最后一个子节点,找不到则返回null

          • 同样,也是包含所有的节点

          1. 我是li1
          2. 我是li2
          3. 我是li3
          4. 我是li4
          5. 我是li5
          6. 在这里插入图片描述

            5.3.3、第一个子结点(兼容性)

            parentNode.firstElementChild

            • firstElementChild 返回第一个子节点,找不到则返回null

            • 有兼容性问题,IE9以上才支持

            5.3.4、最后一个子结点(兼容性)

            parentNode.lastElementChild

            • lastElementChild 返回最后一个子节点,找不到则返回null

            • 有兼容性问题,IE9以上才支持

            5.3.5、解决方案

            实际开发中,firstChild 和 lastChild 包含其他节点,操作不方便,而 firstElementChild 和 lastElementChild 又有兼容性问题,那么我们如何获取第一个子元素节点或最后一个子元素节点呢?

            解决方案

            • 如果想要第一个子元素节点,可以使用 parentNode.chilren[0]

            • 如果想要最后一个子元素节点,可以使用

            // 数组元素个数减1 就是最后一个元素的索引号

            parentNode.chilren[parentNode.chilren.length - 1]

            • 示例:
            1. 我是li1
            2. 我是li2
            3. 我是li3
            4. 我是li4
            5. 5.4、兄弟节点


              5.4.1、下一个兄弟节点

              node.nextSibling

              • nextSibling 返回当前元素的下一个兄弟元素节点,找不到则返回null

              • 同样,也是包含所有的节点

              5.4.2、上一个兄弟节点

              node.previousSibling

              • previousSibling 返回当前元素上一个兄弟元素节点,找不到则返回null

              • 同样,也是包含所有的节点

              5.4.3、下一个兄弟节点(兼容性)

              node.nextElementSibling

              • nextElementSibling 返回当前元素下一个兄弟元素节点,找不到则返回null

              • 有兼容性问题,IE9才支持

              5.4.4、上一个兄弟节点(兼容性)

              node.previousElementSibling

              • previousElementSibling 返回当前元素上一个兄弟元素节点,找不到则返回null

              • 有兼容性问题,IE9才支持

              示例

              我是div

              我是span

              如何解决兼容性问题 ?

              答:自己封装一个兼容性的函数

              function getNextElementSibling(element) {

              var el = element;

              while(el = el.nextSibling) {

              if(el.nodeType === 1){

              return el;

              }

              }

              return null;

              }

              5.5、创建节点


              document.createElement(‘tagName’);

              • document.createElement() 方法创建由 tagName 指定的HTML 元素

              • 因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点

              5.5.1、添加节点

              node.appendChild(child)

              • node.appendChild() 方法将一个节点添加到指定父节点的子节点列表末尾。类似于 CSS 里面的 after 伪元素。

              node.insertBefore(child,指定元素)

              • node.insertBefore() 方法将一个节点添加到父节点的指定子节点前面。类似于 CSS 里面的 before 伪元素。

              示例

              • 123
              • 5.5.2、删除节点

                node.removeChild(child)

                • node.removeChild()方法从 DOM 中删除一个子节点,返回删除的节点

                5.5.3、复制节点(克隆节点)

                node.cloneNode()

                • node.cloneNode()方法返回调用该方法的节点的一个副本。 也称为克隆节点/拷贝节点

                • 如果括号参数为空或者为 false ,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点

                • 如果括号参数为 true ,则是深度拷贝,会复制节点本身以及里面所有的子节点

                示例

                • 1111
                • 2
                • 3
                • 在这里插入图片描述

                  5.5.4、面试题

                  三种动态创建元素的区别

                  • doucument.write()

                  • element.innerHTML

                  • document.createElement()

                  区别:

                  • document.write() 是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘

                  • innerHTML 是将内容写入某个 DOM 节点,不会导致页面全部重绘

                  • innerHTML 创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂

                  • createElement()创建多个元素效率稍低一点点,但是结构更清晰

                  总结:不同浏览器下, innerHTML 效率要比 createElement 高

                  6、DOM核心

                  =========================================================================

                  对于DOM操作,我们主要针对子元素的操作,主要有

                  • 创建

                  • 属性操作

                  • 时间操作

                  6.1、创建


                  1. document.write

                  2. innerHTML

                  3. createElement

                  6.2、增


                  1. appendChild

                  2. insertBefore

                  6.3、删


                  1. removeChild

                  6.4、改


                  • 主要修改dom的元素属性,dom元素的内容、属性、表单的值等
                  1. 修改元素属性:src、href、title 等

                  2. 修改普通元素内容:innerHTML、innerText

                  3. 修改表单元素:value、type、disabled

                  4. 修改元素样式:style、className

                  6.5、查


                  • 主要获取查询dom的元素
                  1. DOM提供的API方法:getElementById、getElementsByTagName (古老用法,不推荐)

                  2. H5提供的新方法:querySelector、querySelectorAll (提倡)

                  3. 利用节点操作获取元素:父(parentNode)、子(children)、兄(previousElementSibling、nextElementSibling) 提倡

                  6.6、属性操作


                  • 主要针对于自定义属性
                  1. setAttribute:设置dom的属性值

                  2. getAttribute:得到dom的属性值

                  3. removeAttribute:移除属性

                  7、事件高级

                  ========================================================================

                  7.1、注册事件(绑定事件)


                  给元素添加事件,称为注册事件或者绑定事件。

                  注册事件有两种方式:传统方式和方法监听注册方式

                  | 传统注册方式 | 方法监听注册方式 |

                  | — | — |

                  | 利用 on 开头的事件 onclick | w3c 标准推荐方式 |

                  | <button onclick = "alert("hi")"></button> | addEventListener() 它是一个方法 |

                  | btn.onclick = function() {} | IE9 之前的 IE 不支持此方法,可使用 attachEvent() 代替 |

                  | 特点:注册事件的唯一性 | 特点:同一个元素同一个事件可以注册多个监听器 |

                  | 同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数 | 按注册顺序依次执行 |

                  ①addEventListener事件监听方式

                  • eventTarget.addEventListener()方法将指定的监听器注册到 eventTarget(目标对象)上

                  • 当该对象触发指定的事件时,就会执行事件处理函数

                  eventTarget.addEventListener(type,listener[,useCapture])

                  该方法接收三个参数:

                  • type:事件类型字符串,比如click,mouseover,注意这里不要带on

                  • listener:事件处理函数,事件发生时,会调用该监听函数

                  • useCapture:可选参数,是一个布尔值,默认是 false。学完 DOM 事件流后,我们再进一步学习

                  传统注册事件

                  方法监听注册事件

                  ie9 attachEvent

                  ②attachEvent事件监听方式(兼容)

                  • eventTarget.attachEvent()方法将指定的监听器注册到 eventTarget(目标对象) 上

                  • 当该对象触发指定的事件时,指定的回调函数就会被执行

                  eventTarget.attachEvent(eventNameWithOn,callback)

                  该方法接收两个参数:

                  • eventNameWithOn:事件类型字符串,比如 onclick 、onmouseover ,这里要带 on

                  • callback: 事件处理函数,当目标触发事件时回调函数被调用

                  • ie9以前的版本支持

                  ③注册事件兼容性解决方案

                  兼容性处理的原则:首先照顾大多数浏览器,再处理特殊浏览器

                  function addEventListener(element, eventName, fn) {

                  // 判断当前浏览器是否支持 addEventListener 方法

                  if (element.addEventListener) {

                  element.addEventListener(eventName, fn); // 第三个参数 默认是false

                  } else if (element.attachEvent) {

                  element.attachEvent(‘on’ + eventName, fn);

                  } else {

                  // 相当于 element.onclick = fn;

                  element[‘on’ + eventName] = fn;

                  }

                  7.2、删除事件(解绑事件)


                  7.2.1、removeEventListener删除事件方式

                  eventTarget.removeEventListener(type,listener[,useCapture]);

                  该方法接收三个参数:

                  • type:事件类型字符串,比如click,mouseover,注意这里不要带on

                  • listener:事件处理函数,事件发生时,会调用该监听函数

                  • useCapture:可选参数,是一个布尔值,默认是 false。学完 DOM 事件流后,我们再进一步学习

                  7.2.2、detachEvent删除事件方式(兼容)

                  eventTarget.detachEvent(eventNameWithOn,callback);

                  该方法接收两个参数:

                  • eventNameWithOn:事件类型字符串,比如 onclick 、onmouseover ,这里要带 on

                  • callback: 事件处理函数,当目标触发事件时回调函数被调用

                  • ie9以前的版本支持

                  7.2.3、传统事件删除方式

                  eventTarget.onclick = null;

                  事件删除示例:

                  1
                  2
                  3

                  7.2.4、删除事件兼容性解决方案

                  function removeEventListener(element, eventName, fn) {

                  // 判断当前浏览器是否支持 removeEventListener 方法

                  if (element.removeEventListener) {

                  element.removeEventListener(eventName, fn); // 第三个参数 默认是false

                  } else if (element.detachEvent) {

                  element.detachEvent(‘on’ + eventName, fn);

                  } else {

                  element[‘on’ + eventName] = null;

                  }

                  7.3、DOM事件流


                  • 事件流描述的是从页面中接收事件的顺序

                  • 事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流

                  总结一下

                  面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。

                  还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。

                  万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。

                  为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

                  前端面试题汇总

                  JavaScript

                  性能

                  linux

                  前端资料汇总

                  前端工程师岗位缺口一直很大,符合岗位要求的人越来越少,所以学习前端的小伙伴要注意了,一定要把技能学到扎实,做有含金量的项目,这样在找工作的时候无论遇到什么情况,问题都不会大。

                  网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

                  需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
                  img

                  一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
                  n() {

                  alert(11);

                  // 1. 传统方式删除事件

                  divs[0].onclick = null;

                  }

                  // 2.removeEventListener 删除事件

                  divs[1].addEventListener(‘click’,fn); //里面的fn不需要调用加小括号

                  function fn(){

                  alert(22);

                  divs[1].removeEventListener(‘click’,fn);

                  }

                  // 3.IE9 中的删除事件方式

                  divs[2].attachEvent(‘onclick’,fn1);

                  function fn1() {

                  alert(33);

                  divs[2].detachEvent(‘onclick’,fn1);

                  }

                  7.2.4、删除事件兼容性解决方案

                  function removeEventListener(element, eventName, fn) {

                  // 判断当前浏览器是否支持 removeEventListener 方法

                  if (element.removeEventListener) {

                  element.removeEventListener(eventName, fn); // 第三个参数 默认是false

                  } else if (element.detachEvent) {

                  element.detachEvent(‘on’ + eventName, fn);

                  } else {

                  element[‘on’ + eventName] = null;

                  }

                  7.3、DOM事件流


                  • 事件流描述的是从页面中接收事件的顺序

                  • 事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流

                  总结一下

                  面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。

                  还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。

                  万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。

                  为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

                  前端面试题汇总

                  JavaScript

                  性能

                  linux

                  前端资料汇总

                  前端工程师岗位缺口一直很大,符合岗位要求的人越来越少,所以学习前端的小伙伴要注意了,一定要把技能学到扎实,做有含金量的项目,这样在找工作的时候无论遇到什么情况,问题都不会大。

                  网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

                  需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
                  [外链图片转存中…(img-Lvl4dqOV-1713314381727)]

                  一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

                • 21
                  点赞
                • 13
                  收藏
                  觉得还不错? 一键收藏
                • 0
                  评论

                “相关推荐”对你有帮助么?

                • 非常没帮助
                • 没帮助
                • 一般
                • 有帮助
                • 非常有帮助
                提交
                评论
                添加红包

                请填写红包祝福语或标题

                红包个数最小为10个

                红包金额最低5元

                当前余额3.43前往充值 >
                需支付:10.00
                成就一亿技术人!
                领取后你会自动成为博主和红包主的粉丝 规则
                hope_wisdom
                发出的红包
                实付
                使用余额支付
                点击重新获取
                扫码支付
                钱包余额 0

                抵扣说明:

                1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
                2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

                余额充值