先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
正文
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);
①获取body元素
返回body元素对象
document.body;
②获取html元素
返回html元素对象
document.documentElement;
========================================================================
JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为。
简单理解: 触发— 响应机制。
网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。
-
事件源(谁)
-
事件类型(什么事件)
-
事件处理程序(做啥)
-
获取事件源
-
注册事件(绑定事件)
-
添加事件处理程序(采取函数赋值形式)
| 鼠标事件 | 触发条件 |
| — | — |
| onclick | 鼠标点击左键触发 |
| onmouseover | 鼠标经过触发 |
| onmouseout | 鼠标离开触发 |
| onfocus | 获得鼠标焦点触发 |
| onblur | 失去鼠标焦点触发 |
| onmousemove | 鼠标移动触发 |
| onmouseup | 鼠标弹起触发 |
| onmousedown | 鼠标按下触发 |
========================================================================
JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容 、属性等。注意以下都是属性
从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会去掉。
element.innerText
起始位置到终止位置的全部内容,包括HTML标签,同时保留空格和换行
element.innerHTML
我是文字
123
// img.属性
img.src = “xxx”;
input.value = “xxx”;
input.type = “xxx”;
input.checked = “xxx”;
input.selected = true / false;
input.disabled = true / false;
我们可以通过 JS 修改元素的大小、颜色、位置等样式。
- 行内样式操作
// element.style
div.style.backgroundColor = ‘pink’;
div.style.width = ‘250px’;
- 类名样式操作
// element.className
注意:
-
JS里面的样式采取驼峰命名法,比如 fontSize ,backgroundColor
-
JS 修改 style 样式操作 ,产生的是行内样式,CSS权重比较高
-
如果样式修改较多,可以采取操作类名方式更改元素样式
-
class 因为是个保留字,因此使用
className
来操作元素类名属性 -
className 会直接更改元素的类名,会覆盖原先的类名
如果有同一组元素,我们相要某一个元素实现某种样式,需要用到循环的排他思想算法:
-
所有元素全部清除样式(干掉其他人)
-
给当前元素设置样式 (留下我自己)
-
注意顺序不能颠倒,首先干掉其他人,再设置自己
按钮1
按钮2
按钮3
按钮4
按钮5
4.6.1、获取属性值
- 获取内置属性值(元素本身自带的属性)
element.属性;
- 获取自定义的属性
element.getAttribute(‘属性’);
4.6.2、设置属性值
- 设置内置属性值
element.属性 = ‘值’;
- 主要设置自定义的属性
element.setAttribute(‘属性’,‘值’);
4.6.3、移除属性
element.removeAttribute(‘属性’);
自定义属性目的:
-
保存并保存数据,有些数据可以保存到页面中而不用保存到数据库中
-
有些自定义属性很容易引起歧义,不容易判断到底是内置属性还是自定义的,所以H5有了规定
4.7.1 设置H5自定义属性
H5规定自定义属性 data-
开头作为属性名并赋值
// 或者使用JavaScript设置
div.setAttribute(‘data-index’,1);
4.7.2 获取H5自定义属性
-
兼容性获取
element.getAttribute('data-index')
-
H5新增的:
element.dataset.index
或element.dataset['index']
IE11才开始支持
========================================================================
获取元素通常使用两种方式:
| 1.利用DOM提供的方法获取元素 | 2.利用节点层级关系获取元素 |
| — | — |
| document.getElementById() | 利用父子兄节点关系获取元素 |
| document.getElementsByTagName() | 逻辑性强,但是兼容性较差 |
| document.querySelector 等 | |
| 逻辑性不强,繁琐 | |
这两种方式都可以获取元素节点,我们后面都会使用,但是节点操作更简单
一般的,节点至少拥有三个基本属性
网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。
HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。
一般的,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。
-
元素节点:nodeType 为1
-
属性节点:nodeType 为2
-
文本节点:nodeType 为3(文本节点包括文字、空格、换行等)
我们在实际开发中,节点操作主要操作的是元素节点
利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
node.parentNode
-
parentNode
属性可以返回某节点的父结点,注意是最近的一个父结点 -
如果指定的节点没有父结点则返回null
我是span
- 我是li
- 我是li
- 我是li
- 我是li
×
parentNode.childNodes(标准)
-
parentNode.childNodes
返回包含指定节点的子节点的集合,该集合为即时更新的集合 -
返回值包含了所有的子结点,包括元素节点,文本节点等
-
如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用
childNodes
parentNode.children(非标准)
-
parentNode.children
是一个只读属性,返回所有的子元素节点 -
它只返回子元素节点,其余节点不返回 (这个是我们重点掌握的)
-
虽然 children 是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用
-
- 我是li
- 我是li
- 我是li
- 我是li
- 我是li
- 我是li
- 我是li
- 我是li
5.3.1、第一个子结点
parentNode.firstChild
-
firstChild
返回第一个子节点,找不到则返回null -
同样,也是包含所有的节点
5.3.2、最后一个子结点
parentNode.lastChild
-
lastChild
返回最后一个子节点,找不到则返回null -
同样,也是包含所有的节点
-
- 我是li1
- 我是li2
- 我是li3
- 我是li4
- 我是li5
-
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]
- 示例:
-
- 我是li1
- 我是li2
- 我是li3
- 我是li4
-
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;
}
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 高
=========================================================================
对于DOM操作,我们主要针对子元素的操作,主要有
-
创建
-
增
-
删
-
改
-
查
-
属性操作
-
时间操作
-
document.write
-
innerHTML
-
createElement
-
appendChild
-
insertBefore
- removeChild
- 主要修改dom的元素属性,dom元素的内容、属性、表单的值等
-
修改元素属性:src、href、title 等
-
修改普通元素内容:innerHTML、innerText
-
修改表单元素:value、type、disabled
-
修改元素样式:style、className
- 主要获取查询dom的元素
-
DOM提供的API方法:getElementById、getElementsByTagName (古老用法,不推荐)
-
H5提供的新方法:querySelector、querySelectorAll (提倡)
-
利用节点操作获取元素:父(parentNode)、子(children)、兄(previousElementSibling、nextElementSibling) 提倡
- 主要针对于自定义属性
-
setAttribute:设置dom的属性值
-
getAttribute:得到dom的属性值
-
removeAttribute:移除属性
========================================================================
给元素添加事件,称为注册事件或者绑定事件。
注册事件有两种方式:传统方式和方法监听注册方式
| 传统注册方式 | 方法监听注册方式 |
| — | — |
| 利用 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.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;
事件删除示例:
1237.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;
}
-
事件流描述的是从页面中接收事件的顺序
-
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
总结一下
面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。
还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。
万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。
为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。
前端面试题汇总
JavaScript
性能
linux
前端资料汇总
前端工程师岗位缺口一直很大,符合岗位要求的人越来越少,所以学习前端的小伙伴要注意了,一定要把技能学到扎实,做有含金量的项目,这样在找工作的时候无论遇到什么情况,问题都不会大。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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;
}
-
事件流描述的是从页面中接收事件的顺序
-
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流
总结一下
面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。
还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。
万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。
为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。
前端面试题汇总
JavaScript
性能
linux
前端资料汇总
前端工程师岗位缺口一直很大,符合岗位要求的人越来越少,所以学习前端的小伙伴要注意了,一定要把技能学到扎实,做有含金量的项目,这样在找工作的时候无论遇到什么情况,问题都不会大。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-Lvl4dqOV-1713314381727)]一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-