JavaScript-核心与进阶
JavaScript-核心与进阶
JavaScript-基础
-
Vscode插件 -
error lens效果 
-
快捷键修改
按下组合键 ctrl+k,ctrl+s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27// Place your key bindings in this file to override the defaultsauto[]
// ctrl + l: 格式化
// ctrl + d: 向下复制一行
// ctrl+shift+u: 转换为大写
// ctrl+shift+i: 转换为 小写
[
{
"key": "ctrl+l",
"command": "editor.action.formatDocument",
"when": "editorHasDocumentFormattingProvider && editorTextFocus && !editorReadonly && !inCompositeEditor"
},
{
"key": "ctrl+d",
"command": "editor.action.copyLinesDownAction",
"when": "editorTextFocus && !editorReadonly"
},
{
"key": "ctrl+shift+u",
"command": "editor.action.transformToUppercase",
"when": "editorTextFocus"
},
{
"key": "ctrl+shift+i",
"command": "editor.action.transformToLowercase",
"when": "editorTextFocus"
}
]
-
-
介绍
-
是什么
JavaScript是一种运行在客户端 ( 浏览器)的编程语言, 实现人机交互效果 -
作用
- 网页特效
(监听用户的一些行为让网页做出对应的反馈) - 表单验证
(针对表单数据的合法性进行判断) - 数据交互
(获取后台的数据,渲染到前端) - 服务端编程
( node.js)
- 网页特效
-
组成
组成 
ECMAScript- 规定了
js基础语法核心知识 - 比如:便来给你、分支语句、循环语句、对象等
- 规定了
Web ApisDOM: 操作文档,比如对页面元素进行移动、大小、添加删除等操作 BOM: 操作浏览器,比如页面弹窗、检测窗口宽度、存储数据到浏览器等等
-
书写位置
-
内联
1
<button onclick="alert('内联..........');">
点击触发 </button> -
内部
注意:
将
script标签放在 HTML附近的原因是浏览器会按照代码在文件中的文件的底部 顺序加载 HTML.如果先加载 Js期望修改其下方的 HTML,那么他由于HTML尚未被加载而失效。因此, 将 Js代码放在 HTML页面的底部附件通常是最好的策略。 推荐 
-
外部
1
2
3
4
5
6
7
8
9<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- 外部文件引入 -->
<script src="./index.js"></script>
</head>script标签中间无需写代码、否则会被忽略 - 外部
Js会使代码更加有序,更易于复用、且没有了脚本的混合, HTML也会更加易读
-
-
-
输入输出
-
输出
1
2
3
4
5
6
7<script>
/* *********** 页面输出 *********** */
document.write("输出语句");
document.write("
");支持标签解析: 输出语句
/* *********** 控制台输出 *********** */
console.log("不支持标签解析: 输出.........");
</script> -
输入
1
2
3<script>
prompt("请输入: ");
</script>
-
-
变量
-
变量是一个容器
-
作用: 用来存放数据的。变量是指容器
而不是数据 -
基本使用
-
声明变量
1
let 变量名
-
变量赋值
1
let age = 20;
-
更新变量
1
age = 30;
-
-
-
数组
-
声明语法
1
let arr = [value1,value2,...];
- 术语
- 元素: 数组中保存的每个数据都叫做数据元素
- 下标: 数组中数据的编号
- 长度: 数组中数据的个数,通过数组的
length属性获得
- 术语
-
求最大值
1
2
3
4
5
6
7
8
9
10
11
12
13<body>
<script>
let arr = [20, 1, 0, 100, 67, 50];
let max = arr[0]
for (let idx = 1; idx < arr.length; idx++) {
if (max < arr[idx]) {
max = arr[idx];
}
}
console.log(max)
</script>
</body> -
修改
1
arr[0] = 10
-
新增
1
2arr.push(); // 末尾
arr.unshift(); // 首个 -
删除
1
2
3arr.pop(); // 删除末尾
arr.shift(); // 删除首个
arr.splice(操作的下标,删除的个数);
-
-
常量
- 使用
const声明的变量就是 常量 - 当某个变量永远
不会发生改变的时候,就可以使用 const声明 - 常量不允许重新赋值,
声明的时候就必须赋值
- 使用
-
数据类型
- 基本数据类型
number数字型string字符串型 boolean布尔型undefined未定义型null空类型
- 引用数据类型
Object对象 function函数array数组
- 基本数据类型
-
数组遍历
1
2
3
4
5
6
7<script>
let arr = [1, 2, 3, 4, 5];
for (let index = 0; index < array.length; index++) {
console.log(array[index]);
}
</script> -
对象遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// for in 不适合遍历数组,
因为 k 是字符串类型
<script>
let info = {
age: 12,
name: "张三"
};
for (k in info) {
// String
console.log(typeof k);
// 输出元素值
console.log(info[k]);
}
</script> -
随机数
-
Math.random()随机数函数,返回一个 0~1之间, 并且包含 0不包含 1的随机小数 -
生成
0 ~ 10的随机数 1
Math.floor(Math.random()) * (10 + 1)
-
生成
5 ~ 10的随机数 1
2// bound = 10 - 5 +1 +5
Math.floor(Math.random() * (5 + 1)) + 5 -
生成
N~M之间的随机数 1
Math.floor(Math.random() * (M - N + 1)) + N
-
Apis
DOM-获取元素
-
Web API基本认知 -
声明变量
- 建议:
const优先使用 - 原因
const语义化更好 - 很多变量我们声明的时候就知道他不会被更改了
- 建议:
-
作用和分类
- 作用: 就是使用
JS去操作 html和浏览器 - 分类:
DOM(文档对象模型)、BOM(浏览器对象模型)
- 作用: 就是使用
-
什么是
DOM树 DOM(Document Object Model-文档对象模型)是用来呈现以及与任意 HTML或 XML文档交互的 API- 作用: 开发网页内容特效和实现用户交互
-
DOM树 -
将
HTML文档以树状结构直观的表现出来, 我们称之为文档树或 DOM树 -
描述网页内容关系的名词
-
作用:
文档树直观的体现了标签与标签之间的关系DOM树 
-
-
DOM对象: 浏览器根据 html标签生成的 JS对象 - 所有的标签属性都可以在这个对象上面找到
- 修改这个对象的属性会自动映射到标签身上
DOM对象 
-
DOM的核心思想: 把网页内容当做 对象来处理 -
document对象 - 是
DOM里提供的一个对象 - 所以它提供的属性和方法都是
用来访问和操作网页内容的
- 是
-
-
获取
DOM对象 -
根据
CSS选择器获取 1
2
3
4
5
6
7
8
9
10<body>
<div class="box">1</div>
<div class="box">2</div>
<script>
// 选择匹配的第一个
const boxEl = document.querySelector(".box"); // 1
</script>
</body>1
2
3
4
5
6
7
8
9<body>
<div class="box">1</div>
<div class="box">2</div>
<script>
// 获取所有
const boxEls = document.querySelectorAll(".box");
console.log(boxEls)
</script>
</body>
-
-
操作元素内容
-
文本替换
-
innerHTML -
innerText1
2
3
4
5
6
7
8<body>
<div class="box">文字内容 </div>
<script>
const boxEl = document.querySelector(".box");
boxEl.innerText = 'vba'
</script>
</body>
-
-
区别
-
innerText不解析标签 1
2
3
4
5
6
7
8
9
10
11
12<body>
<div class="box1">文字内容 </div>
<div class="box2">文字内容 </div>
<div class="box3">文字内容 </div>
<script>
const boxE1 = document.querySelector(".box1");
const boxE2 = document.querySelector(".box2");
boxE1.innerHTML = '<strong>InnerHTML</strong>'
boxE2.innerText = '<strong>InnerText</strong>'
</script>
</body>
-
-
-
操作元素属性
-
操作元素常用属性
-
href、title、src1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<body>
<a href="http://www.baidu.com">百度 </a><br />
<img src="./bg.png" alt="" width="100">
<div title="div">div content</div>
<script>
/* ****************** 属性值修改 *************** */
const aE1 = document.querySelector("a");
const aE2 = document.querySelector("img");
const aE3 = document.querySelector("div");
aE1.href = "http://jd.com"
aE2.src="bg2.png"
/* ******************************************** */
</script>
</body>
-
-
操作元素样式属性
-
通过
style属性操作 css1
aE2.style.border = "1px solid blue";
-
操作类名操作
css1
2
3
4
5
6
7
8
9
10
11
12
13
14<style>
img{
border: 1px solid red;
padding: 10px;
}
.jsAdd{
border: 2px solid green;
}
</style>
<script>
const aE2 = document.querySelector("img");
aE2.className = 'jsAdd'
</script> -
通过
classList操作类控制 css-
追加一个类
1
2const aE1 = document.querySelector("a");
aE1.classList.add("jsAdd1"); -
删除一个类
1
aE1.classList.remove("jsAdd2");
-
切换一个类
1
aE1.classList.toggle("jsAdd2");
-
-
-
操作表单元素属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
span {
display: block;
cursor: pointer;
}
</style>
</head>
<body>
<form action="">
<input type="text" name="username" id="username">
<input type="password" name="password" id="password">
<span>v</span>
</form>
<script>
// 获取元素
const username = document.querySelector("#username");
const password = document.querySelector("#password");
const span = document.querySelector("span");
span.onclick = function () {
console.log(username.value)
password.type = password.type == "password" ? "text" : "password"
}
</script>
</body>
</html> -
自定义属性
-
在
html5中推出来了专门的 data-自定义属性 -
在标签上一律以
data-开头 -
在
DOM对象上一律以 dataset对象方式获取 1
2
3
4
5
6
7
8
9
10<body>
<div data-id="1"></div>
<div data-name="lisi"></div>
<script>
const divEl = document.querySelector("div");
console.log(divEl.dataset.id)
</script>
</body>
-
-
-
定时器-间歇函数
-
setInterval1
2
3
4
5
6
7<script>
// setInterval(函数, 间歇时间(ms))
let timer = setInterval(() => {
console.log("1.......")
}, 1000);
clearInterval(timer)
</script>
-
-
综合案例
DOM-事件基础
-
事件监听
-
什么是事件
事件是在编程时系统内发生的
动作或者发生的事情 -
什么是事件监听
就是让程序检测是否有事件产生,一旦有事件触发,
就立即调用一个函数做出响应, 也成为 绑定事件或注册事件 -
语法
1
元素对象.addEventListener('事件类型', 要执行的函数) - 事件监听三要素
- 事件源: 那个
dom元素被事件触发了, 要获取 dom元素 - 事件类型: 用什么方式触发,比如鼠标单机
click、鼠标经过mouseover等 - 事件调用的函数: 要做什么事
- 事件源: 那个
- 事件监听三要素
-
-
事件类型
- 鼠标事件
click鼠标点击 mouseenter鼠标经过 mouseleave鼠标离开
- 焦点事件
focus: 获取焦点blur: 失去焦点
- 键盘触发
keydown: 键盘按下触发keyup: 键盘抬起触发
- 表单输入触发
input用户输入事件
- 鼠标事件
-
事件对象
-
是什么
- 也是个对象,
这个对象里面有事件触发时的相关信息 - 例如: 鼠标点击事件中,事件对象就存了鼠标点在那个位置等信息
- 也是个对象,
-
获取事件对象
- 在事件绑定的回调函数的第一个参数就是事件对象
- 一般命名为
event、ev、e
-
事件对象常用属性
-
type: 获取当前的事件类型 -
clientX/clientY: 获取光标相对于浏览器可见窗口左上角的位置 -
offsetX/offsetY: 获取光标相对于当前DOM元素最上交的位置 -
key-
用户按下的键盘键的值
-
现在不提倡使用
keyCode1
2
3
4
5
6
7
8
9
10
11<body>
<input type="text" name="" id="">
<script>
const input = document.querySelector("input");
input.addEventListener("keyup", (e) => {
if (e.key === 'Enter') {
console.log(e)
}
})
</script>
</body>
-
-
-
-
环境对象
- 指的是函数内部特殊的
变量 this,它代表当前函数运行时所处的环境 - 作用
- 函数的调用方式不同,
this指代的对象也不同 谁调用,this是判断就是谁 this指向的粗略规则 - 直接调用函数,
其实相当于使用 window.,函数 所以 this指向 window
- 函数的调用方式不同,
- 指的是函数内部特殊的
-
回调函数
如果将函数
A作为参数传递给函数 B时, 我们称函数 A为 回调函数 -
综合案例
Tab-栏切换- 全选、反选
DOM-事件进阶
-
事件流
-
事件流与两个阶段说明
-
事件流指的是事件完整执行过程中的流动路径事件流与两个阶段 
-
-
-
事件冒泡
- 当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发。这一过程被称为事件冒泡
-
阻止冒泡
1
2// 此方法可以阻断事件流动传播 不光在冒泡阶段有效,
在捕获阶段也同样有效
e.stopPropagation(); -
解绑事件
-
on1
2
3
4
5
6
7
8
9
10
11<body>
<button>点击 </button>
<script>
const btlEl = document.querySelector("button");
btlEl.onclick = function () {
alert(1);
// 事件解绑
btlEl.onclick = null;
}
</script>
</body> -
addEventListener1
2
3
4
5
6
7
8
9
10
11
12
13// 匿名函数无法解绑
<body>
<button>点击 </button>
<script>
const btlEl = document.querySelector("button");
function test() {
alert(2)
btlEl.removeEventListener('click', test)
}
btlEl.addEventListener('click', test)
</script>
</body>
-
-
鼠标经过事件
mouseover和 mouseout会有冒泡效果 mouseenter和 mouseleave没有冒泡效果【 推荐】
-
事件委托
-
事件委托是利用事件流的特征解决一些开发需求的只是技巧
-
有点: 减少注册次数,
可以提高程序性能 -
原理: 事件委托其实是利用事件冒泡的特点
-
给
父元素注册事件,当我们触发子元素的时候, 会冒泡到父元素身上, 从而触发父元素的事件 -
实现:
事件对象.target.tagName可以获得真正触发事件的元素 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
li {
float: left;
width: 25px;
height: 25px;
margin: 5px;
font-size: 12px;
background-color: skyblue;
line-height: 25px;
text-align: center;
list-style: none;
}
ul {
overflow: hidden;
}
</style>
</head>
<body>
<ul>
<li data-id="1">1</li>
<li data-id="2">2</li>
<li data-id="3">3</li>
<li data-id="4">4</li>
<li data-id="5">5</li>
<p>我不需要变色 </p>
</ul>
<script>
const ulEl = document.querySelector("ul");
const _this = this;
ulEl.addEventListener('click', (e) => {
// e.target 点击对象
console.dir(e.target)
if (e.target.tagName === "LI") {
e.target.style.backgroundColor = "red"
}
});
</script>
</body>
</html>dir => tagName
-
-
点击那个那个背景颜色发生变化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
li {
float: left;
width: 25px;
height: 25px;
margin: 5px;
font-size: 12px;
background-color: skyblue;
line-height: 25px;
text-align: center;
list-style: none;
}
ul {
overflow: hidden;
}
.active {
background-color: red;
}
</style>
</head>
<body>
<ul>
<li data-id="1" class="active">1</li>
<li data-id="2">2</li>
<li data-id="3">3</li>
<li data-id="4">4</li>
<li data-id="5">5</li>
<p>我不需要变色 </p>
</ul>
<script>
const ulEl = document.querySelector("ul");
ulEl.addEventListener('click', (e) => {
// e.target 点击对象
console.dir(e.target)
if (e.target.tagName === "LI") {
// 排除其他的
document.querySelector("ul .active").classList.remove("active")
e.target.classList.add("active")
}
});
</script>
</body>
</html> -
Tab栏切换 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
li {
float: left;
width: 25px;
height: 25px;
margin: 5px;
font-size: 12px;
background-color: skyblue;
line-height: 25px;
text-align: center;
list-style: none;
}
ul {
overflow: hidden;
}
.tab ul .active {
display: block;
background-color: rgb(204, 146, 146);
}
.tab ul {
/* width: 310px; */
height: 310px;
/* overflow: hidden; */
}
.tab ul li {
display: none;
width: 300px;
height: 300px;
border: 1px solid #000;
}
</style>
</head>
<body>
<ul>
<li data-id="1" class="active">1</li>
<li data-id="2">2</li>
<li data-id="3">3</li>
<li data-id="4">4</li>
<li data-id="5">5</li>
</ul>
<div class="tab">
<ul>
<li class="item active" data-id="1">1</li>
<li class="item" data-id="2">2</li>
<li class="item" data-id="3">3</li>
<li class="item" data-id="4">4</li>
<li class="item" data-id="5">5</li>
</ul>
</div>
<script>
const ulEl = document.querySelector("ul");
// 实现 2 allTabs => []
const allTabs = document.querySelectorAll(".tab .item")
console.log(allTabs)
ulEl.addEventListener('click', (e) => {
// e.target 点击对象
console.dir(e.target)
// id => number
const id = +e.target.dataset.id;
if (e.target.tagName === "LI") {
// 排除其他的
document.querySelector("ul .active").classList.remove("active")
document.querySelector(".tab .active").classList.remove("active")
e.target.classList.add("active")
// 实现 1
// document.querySelector(`.tab .item:nth-child(${id})`).classList.add("active")
// id - 1 是因为数组下标从 0 开始
allTabs[id - 1].classList.add("active")
}
});
</script>
</body>
</html>Tab栏切换 
-
-
阻止默认行为
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<body>
<a href="http://www.baidu.com">Baidu</a>
<form action="http://www.baidu.com">
<input type="submit" value="提交">
</form>
<script>
const form = document.querySelector("form");
const a = document.querySelector("a");
/************************ form submit **************************/
form.addEventListener("submit", (e) => {
e.preventDefault();
})
/************************ a click *******************************/
a.addEventListener("click", (e) => {
e.preventDefault();
})
</script>
</body> -
其他事件
-
页面加载事件
加载外部资源
(入图片、外联 CSS、JavaScript等) 加载完毕时触发的事件 -
事件名:
load-
作用: 监听页面所有资源加载完毕
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
window.addEventListener("load", () => {
const btnEl = document.querySelector("button");
btnEl.addEventListener("click", () => {
alert("btn click............")
})
})
</script>
</head>
<body>
<button>点击 </button>
</body>
</html>
-
-
事件名:
DOMContentLoaded-
作用: 当初始的
HTML文档被完全加载和解析完成之后, DOMContentLoaded事件被触发, 而无需等待样式表、图像等完全加载 1
2
3
4
5<script>
document.addEventListener("DOMContentLoaded",()=>{
})
</script>
-
-
-
元素滚动事件
-
事件名:
scroll-
scrollLeft、scrollTop:获取被 卷去的大小scrollTop
-
获取元素内容往左、往上滚出去看不到的距离
-
这两个值
可以读写
-
-
-
html元素的获取方式 1
const html = document.documentElement;
html
1
2
3
4
5
6
7
8
9
10
11
12<style>
html {
height: 3000px;
}
</style>
<script>
window.addEventListener("scroll", () => {
console.log(document.documentElement.scrollTop);
})
</script>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.header {
width: 100%;
height: 80px;
line-height: 80px;
text-align: center;
background-color: cornflowerblue;
transition: all ease-in-out .2s;
}
.box {
position: absolute;
left: 0;
right: 0;
top: 80px;
width: 960px;
height: 1500px;
background-color: #e5e5e5;
border: 2px solid red;
margin: auto;
}
.flag {
margin-top: 300px;
width: 100px;
height: 100px;
background-color: red;
}
.header-pro {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1;
}
</style>
</head>
<body>
<div class="header">
顶部导航
</div>
<div class="box">
<div class="flag"></div>
</div>
<script>
const header = document.querySelector(".header");
const flag = document.querySelector(".flag");
window.addEventListener("scroll", () => {
if (document.documentElement.scrollTop >= flag.offsetTop) {
header.classList.add("header-pro")
}
})
</script>
</body>
</html> -
页面尺寸事件
-
事件名:
resize-
作用: 会在窗口改变的时候触发事件
1
2
3
4
5<script>
window.addEventListener("resize", () => {
console.log(1);
})
</script>
-
-
获取宽高
- 获取元素的可见部分宽高
( 不包含边框、margin、滚动条等) clentWidth && clientHeight
- 获取元素的可见部分宽高
-
-
元素的尺寸与位置
-
获取宽高
- 获取元素的自身宽高、包含元素自身设置的宽高、
padding、border offsetWidth && offsetHeight- 获取出来的是数值,方便计算
- 获取元素的自身宽高、包含元素自身设置的宽高、
-
获取位置
-
获取元素距离自己定位父级元素的左、上距离
-
offsetLeft 、offsetTop是只读属性 1
2
3
4
5
6
7<script>
const div = document.querySelector("div")
const offLeft = div.offsetLeft;
const offTop = div.offsetHeight;
console.log(offLeft);
console.log(offTop);
</script>offsetLeft
-
滑块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.box {
position: relative;
display: flex;
text-align: center;
width: 400px;
}
.box a {
flex: 1;
padding: 5px 10px;
margin: 3px;
}
.box .line {
position: absolute;
left: 3px;
top: 32px;
width: 61px;
height: 2px;
background-color: red;
transition: all .3s;
}
</style>
</head>
<body>
<div class="box">
<a href="javascript:void(0);">首页 </a>
<a href="javascript:void(0);">首页 </a>
<a href="javascript:void(0);">首页 </a>
<a href="javascript:void(0);">首页 </a>
<a href="javascript:void(0);">首页 </a>
<a href="javascript:void(0);">首页 </a>
<div class="line"></div>
</div>
<script>
const box = document.querySelector(".box");
const line = document.querySelector(".box .line");
box.addEventListener("click", (e) => {
if (e.target.tagName === "A") {
// 获取点击对象
console.log(e.target.offsetLeft)
line.style.left = `${e.target.offsetLeft}` + "px";
}
})
</script>
</body>
</html>下划线移动 
-
-
-
-
总结
属性 作用 说明 scroll和 scrollTop 被卷去的头部和左侧 配合页面滚动来用, 可读写 clientWidth和 clientHeight 获得元素宽度和高度 不包含 border、margin滚动条用于 js获取元素大小,只读属性 offsetwidth和 offsetHeight 获得元素宽度和高度 包含 border、padding、滚动条等、只读offsetLeft和 offsetTop 获取元素距离自己定位父级元素的左、上距离 获取元素位置的时候使用, 只读属性
DOM-节点操作
-
节点操作
-
DOM节点: DOM树里面每一个内容都称之为节点 -
节点类型
- 元素节点
- 所有的标签比如
body、div html是根节点
- 所有的标签比如
- 属性节点
- 所有的属性比如
href
- 所有的属性比如
- 文本节点
- 所有的文本
- 元素节点
-
创建节点
1
2
3
4
5
6
7
8
9
10
11<body>
<ul>
<li>first</li>
</ul>
<script>
let ul = document.querySelector("ul")
let li = document.createElement("li")
// ul.appendChild(li) 末尾
ul.insertBefore(li, ul.children[0]) // 指定位置
</script>
</body> -
节点克隆和删除
-
cloneNode会克隆出一个跟原标签一样的元素, 括号内传入布尔值 -
若为
true,则代表克隆时会包含后代节点一起克隆 -
若为
false,则达标克隆时不包含后代节点 -
默认为
false1
2
3
4
5
6
7
8
9
10
11
12<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
const ul = document.querySelector("ul")
let cll = ul.children[0].cloneNode(true)
ul.appendChild(cll)
</script>
</body> -
删除节点
-
语法
1
父元素.removeChild(要删除的元素); -
注意
- 如不存在父子关系则删除不成功
- 删除节点和隐藏节点
( display:none)有区别
-
-
-
-
数组高阶函数
-
map: 遍历、数据处理1
2
3
4
5
6
7
8
9
10<body>
<script>
let arr = [1, 2, 3, 4]
let newArr = arr.map((item, index) => {
// 数据处理
return item + 10
})
console.log(newArr);
</script>
</body> -
join
日期对象
-
日期对象: 用来表示事件的对象
-
作用: 可以得到当前系统的时间
-
创建一个时间对象并获取时间
1
2
3
4
5<script>
const date = new Date();
// Fri Feb 24 2023 20:06:53 GMT+0800 (中国标准时间)
console.log(date)
</script> -
获取时间戳
1
2
3
4
5
6
7
8
9
10<body>
<script>
let date1 = new Date()
// 1. getTime()
console.log(date1.getTime())
// 2. +
let date2 = +new Date()
console.log(date2)
</script>
</body> -
倒计时实现
-
分析
- 用将来时间减去现在时间就是剩余的时间
- 核心: 使用将来的时间戳减去现在的时间戳
- 把剩余的时间转换为天时分秒
-
注意
-
通过时间戳得到的是
毫秒,需要转换为秒在计算 -
转换公式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32<body>
<script>
let d = parseInt(总秒数 / 60 / 60 / 24) // 计算天数
let h = parseInt(总秒数 / 60 / 60 % 24) // 计算小时
let m = parseInt(总秒数 / 60 % 60) // 计算分数
let s = parseInt(总秒数 % 60) // 计算当前秒数
</script>
</body>
<body>
<script>
// 获取当前的毫秒数
let now = +new Date();
// 获取将来时间的毫秒数
let last = +new Date("2023-2-27 16:00:00");
// 剩余秒数
let count = (last - now) / 1000;
let d = parseInt(count / 60 / 60 / 24) // 计算天数
let h = parseInt(count / 60 / 60 % 24) // 计算小时
h = h < 10 ? '0' + h : h;
let m = parseInt(count / 60 % 60) // 计算分数
m = m < 10 ? '0' + m : m;
let s = parseInt(count % 60) // 计算当前秒数
s = s < 10 ? '0' + s : s;
console.log(d, h, m, s)
</script>
</body>
-
-
Window 对象
-
BOM(browser Object Model)是浏览器对象模型 BOM
-
延迟函数
1
2
3
4
5<script>
setTimeout(() => {
console.log(1)
}, 2000)
</script> -
JS执行机制 JavaScript语言的一大特点就是 单线程,也就是说, 同一个时间只能做一件事 这是因为
JavaScript这门脚本语言诞生的使命所致- Javascript是为处理页面中用户的交互, 以及操作 DOM而产生的。比如我们对某个 DOM元素进行添加和删除操作, 不能同时进行。应该先进行添加,之后在删除。 单线程就意味着,所有任务需要排队, 前一个任务结束,才会执行后一个任务。这样所导致的问题是 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。 为了解决这个问题,
利用多核 CPU的计算能力, HTML5提出 Web Worker标准, 允许 JavaScript脚本创建多个线程, 于是 JS中出现了 同步和异步-
同步: 前一个任务结束后再执行后一个任务
-
异步: 在处理这件事时可以去处理其他事
-
事件循环
事件循环流程 
由于主线程不断地重复获得任务、执行任务、再获取任务、再执行,所以这种机制被称为
事件循环(event loop)
-
-
location对象 -
location的数据类型是对象, 他拆分并保存了 URL地址的各个组成部分 -
href实现自动跳转 1
location.href="http://www.baidu.com"
-
案例实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35// 需求: 用户点击可以跳转,
如果不点击, 则 5s 后自动跳转, 要求里面有秒数倒计时
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
span {
color: rgb(236, 171, 87);
}
</style>
</head>
<body>
<a href="http://www.baidu.com">前往百度, 剩余 <span>5</span> 秒 </a>
<script>
const aEl = document.querySelector("a");
let time = 15;
let timer = setInterval(() => {
time--;
aEl.innerHTML = `前往百度,剩余 ${time}</span> 秒钟后跳转到百度`;
if (time === 0) {
location.href = "http://www.baidu.com";
clearInterval(timer);
}
}, 1000);
aEl.addEventListener("click", () => {
location.href = "http://www.baidu.com";
});
</script>
</body>
</html>
-
-
location.search获取 表单等 ? 后面的部分获取参数
1
2
3
4
5
6
7
8
9
10
11<body>
<form action="">
<input type="text" name="uname" id="" />
<button>提交 </button>
</form>
<script>
// ?uname=coder-itl
console.log(location.search);
</script>
</body> -
location.hash -
location.reload刷新 -
navigator和 history 对象 -
navigator的数据类型是对象,该对象记录了浏览器自身的相关信息 -
navigator常用属性和方法 -
通过
userAgent检测浏览器的版本以及平台 1
console.log(navigator);
-
-
history的数据类型是对象, 主要管理历史记录, 该对象与浏览器地址栏的操作相对应, 如前进、后退、历史记录等 go()前进后退,参数如果是 1,前进一个页面,如果是 -1后退一个页面 forward前进 back后退
-
-
-
本地存储
localStorage
实战项目
-
小兔仙儿
1
https://megasu.gitee.io/erabbit-client-pc-document/guide/01-intro.html#_01-%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D
-
放大镜效果实现
- 业务分析
- 鼠标经过对应小盒子,
左侧中等盒子显示对应中等图片 - 鼠标经过小盒子,
右侧会显示放大镜效果的大盒子 - 黑色遮罩盒子跟着鼠标来移动
- 鼠标在小盒子上移动,
大盒子的图片跟着显示对应位置
- 鼠标经过对应小盒子,
- 业务分析