JavaScript入门

1、什么是javascript

  • JavaScript 是一种脚本,一门编程语言,它可以在网页上实现复杂的功能,网页展现给你的不再是简单的静态信息,而是实时的内容更新,交互式的地图,2D/3D 动画,滚动播放的视频等等。
  • ES6就是ECMAScript6是新版本JavaScript语言的标准,它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
  • javaScript历史:https://blog.csdn.net/kese7952/article/details/79357868

2、快速入门

2.1、引入javaScript

1、内部标签

1
2
3
<script>
js代码块
</script>

2、外部引入

hello.js

1
2
alert("hello,world");
alert("😣✅❌");

helloword.html

1
2
3
4
5
6
<!--外部引入
注意:script必须成对出现-->
<script src="js/hello.js"></script>

<!--不用显示定义type,也默认就是javaScript-->
<script type="text/javascript"></script>

2.2、基本语法入门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--JavaScript语法严格区分大小写-->
<script>
// 1、定义变量 变量类型 变量名=变量值;
var score = 71;
// 2、条件控制
if(score>60 && score<70){
alert("60~70");
}else if (score>70 && score<80){
alert("70~80");
}else {
alert("other");
}
// 3、浏览器控制台打印日志:console.log(score);
</script>
</head>
<body>
</body>

浏览器必备调试须知:

2.3、数据类型

数值,文本,图形,音频,视频

==变量==

1
var a

==number==

1
2
3
4
5
6
123 // 整数123
123.1 // 浮点数123.1
1.123e3 // 科学计数法
-99 // 负数
NaN // not a number
Infinity // 表示无限大

==字符串==

1
// 'abc' "abc"

==布尔值==

1
// true,false

==逻辑运算符==

1
2
3
4
5
// && 两个都为真,结果为真

// || 一个为真,结果为真

// ! 真即假,假即真

==比较运算符==

1
2
3
4
=
1"1"
== // 等于(类型不一样,值一样,也会判断为true)
=== // 绝对等于(类型一样,值一样,结果为true) typeof 可以检查类型

这是一个JS的缺陷,坚持不要使用 == 比较
须知:

  • NaN === NaN,这个与所有的数值都不相等,包括自己
  • 只能通过isNaN(NaN)来判断这个数是否是NaN

浮点数问题

1
console.log((1/3) === (1-2/3));

尽量避免使用浮点数进行运算,存在精度问题!

1
Math.abs(1/3-(1-2/3))<0.00000001

==null 和 undefined==

  • null 空
  • undefined 未定义

==数组==

Java的数组必须是相同类型的对象~,JS中不需要这样

1
2
3
4
//保证代码的可读性,尽量使用[]
var arr = [1,2,3,4,5,'hello',null,true];
//第二种定义方法
new Array(1,2,3,4,5,'hello');

取数字下标:如果越界了,就会 报undefined

1
undefined

==对象==

对象是大括号,数组是中括号

每个属性之间使用逗号隔开,最后一个属性不需要逗号

1
2
3
4
5
6
7
// Person person = new Person(1,2,3,4,5);

var person = {
name:'Tom',
age:3,
tags:['js','java','web','...']
}

取对象值

1
2
3
4
person.name
> "Tom"
person.age
> 3

2.4、严格检查模式

前提:IDEA 设置中JavaScript开启支持ES6语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<!--
'use strict'; 严格检查模式,预防javascript的随意性导致产生问题,必须协助javascript代码第一行
局部变量建议使用 let 定义
-->
<script>
'use strict';
let i = 1;
</script>
<body>
</body>
</html>

3、数组类型

3.1、字符串

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<!--字符串是不可变的-->
<script>
'use strict';
// 转义:\
console.log('a\'');
// 换行:\n
console.log('a\nb');
// Tab:\t
console.log('a\tb');
// unicode:\u42d
console.log('\u4e2d');
// Ascll:\x41
console.log('\x41');
// 多行字符串编写
let a=`
你好
hh
我的厉害
`
let name = '刘hanhan'
// 类似EL表达式${}引用变量
let msg = `你好呀:${name}`;

// 字符串长度
console.log(`字符串长度:${name.length}`);

// 大小写转换
console.log("转化大写:"+name.toUpperCase());
console.log("转化小写:"+name.toLowerCase());

// 获取下标索引
console.log("获取:"+name.indexOf("刘"));

// 截取 [)
console.log("截取:"+name.substring(1)); //从下标1开始截取到最后一个字符
console.log("截取:"+name.substring(1,4)); // [1,3)
</script>
<body>
</body>
</html>

3.2、数组

数组:存储数据(如何存,如何取,方法都可以自己实现!)

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--数组是可变的-->
<script>
'use strict'
let arr = [1,2,3,4,5,6];
// 数组长度
console.log(arr.length);
// 改变数组长度
arr.length = 10;
console.log(arr.length);
console.log(arr[9]);
arr.length = 2;
console.log(arr);
// 获取下标索引
console.log(arr.indexOf(2));
// 截取[):返回一个新数组,类似String中的subString
console.log(arr.slice(1))
console.log(arr.slice(0,1))
// 数组尾部追加
arr.push("a","b","c");
// 数组尾部弹出
arr.pop();
arr.pop();
// 数组头部追加
arr.unshift("a","b","c");
// 数组头部弹出
arr.shift();
arr.shift();
// 数组排序
arr.sort();
// 元素反转
arr.reverse();
// 合并数组:不会改变原数组,返回新合成数组
let arr2 = arr.concat([1,2,3]);
// 打印拼接数组
console.log(arr.join("_"));
// 多维数组
let arr3 = [[1,2],['a','b'],[4,3]];
console.log(arr3[2][1])
// 填充
arr3.fill(1);
</script>
</head>
<body>
</body>
</html>

3.3、对象

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
'use strict'
// 定义对象格式
let person = {
name : "小王",
age : 12,
score : 60
};
// 获取一个对象下的属性值
person.name;
// 给属性赋值
person.age = 18;
// 属性不存在,不会报错,显示undefined
person.emal;
// 动态删减属性
delete person.score;
// 动态添加属性
person.emal = "12@qq.com";
// 判断属性值是否在这个对象中:属性名都是String类型
'age' in person;
// 继承关系
'toString' in person;
// 判断一个属性是否是这个对象自身拥有的 hasOwnProperty()
per.hasOwnProperty("age");
per.hasOwnProperty("toString");
</script>
</body>
</html>

3.4、流程控制

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--和java差不多-->
<script>
var score = 71;
// if判断
if(score>60 && score<70){
alert("60~70");
}else if (score>70 && score<80){
alert("70~80");
}else {
alert("other");
}
// while循环
let age = 3;
while (age<80){
age++;
}
// do-while循环
do{
age++;
} while (age<50)
alert(age);
// for循环
for (let i = 0; i < 3; i++) {
alert(i);
}
// forEach循环
var arr = [2,4,6,"a"];
arr.forEach(function (value) {
console.log(value)
})
// for-in循环:index是下标
for (let index in arr){
console.log(arr[index]);
}
// for-of循环:index是具体值
for (let index of arr){
console.log(index);
}
</script>
</body>
</html>

3.5、Map和Set集合

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<!--ES6新特性-->
<script>
'use strict'
// map集合
let map = new Map([['tom',100],['jack',90],['hanhan',70]]);
// 取值
var score = map.get('tom');
console.log(score);
// 存值或改值
map.set('yuji',40);
// 删值
map.delete('hanhan');

// set集合:无序不重复的集合 会自动排重
let set = new Set([2,1,11,1,1,1]);
// 存值
set.add(6);
// 删值
set.delete(2);
// 判断是否包含
set.has(1);
// 转化成数组
let arr = Array.from(set);

// forEach:遍历set集合
set.forEach(function (value) {
// alert(value);
})
// forEach:遍历map集合
map.forEach(function (value,key) {
// alert(key+value);
})
// for-of:遍历set集合
for(let i of set){
// alert(i);
}
// for-of:遍历map集合
for(let i of map){
// alert(i);
}
</script>
<body>
</body>
</html>

4、函数

4.1、函数

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
'use strict'
// 函数定义方式一
function abc(x) {
// 不传参数不会报错,返回NuN
if(x>=0){
return x;
}else {
return -x;
}
}
// 函数定义方式二
var abs = function(x){
// 手动抛出异常
if(typeof x != 'number'){
throw 'Not a number';
}
if(x>=0){
return x;
}else {
return -x;
}
}
// arguments: 代表传递的所有参数是一个数组
var abd = function(x){
console.log('x==>'+x);
console.log(arguments)
for (let i in arguments){
console.log(arguments[i]);
}
if(x>=0){
return x;
}else {
return -x;
}
}
// rest: ES6新特性,获取除了已经定义之外的所有参数是一个数组
// rest参数只能写在最后面,必须要'...'表示
var abq = function(x,y,...rest){
console.log('x==>'+x);
console.log('y==>'+y);
console.log(rest);
}

</script>
</head>
<body>
</body>
</html>

4.2、变量的作用域

js变量:

  • var:定义全局变量
  • ES6语法规范:
    • let:定义局部变量
    • const:定义常量
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<script>
// 内部函数可以访问外部函数的成员,反之则不行
function a() {
var x = 1;
function b() {
var y = x + 1;
}
var z = y + 1; // 报错:Uncaught ReferenceError: y is not defined
}

// 结果:x undefined
// 说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值;
function b() {
var x = "x" + y;
console.log(x);
var y = "y";
}

// 全局变量
var x = 'xxx';
alert(x);
alert(window.x); // 默认所有的全局变量,都会自动绑定在window对象下 ==> window代表浏览器
window.alert('alert'); // alert方法本身也是window对象下的
tc = window.alert;
tc('hhhhh');
// javascript实际上只有一个全局作用域,任何变量(函数也可以视为变量)
// 假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错 Refrence

// 唯一全局变量 自定义全局变量,不绑定到window对象下 解决问题:不同的js文件使用了相同全局变量会冲突
var liuRenWei = {};
// 定义全局变量
liuRenWei.name = '刘仁伟';
// 定义函数
liuRenWei.add = function (a,b) {
return a + b;
}

function f() {
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log(i+10); // 出了for循环作用于还可以用 解决问题:使用let局部变量定义i
}

// ES6 let关键字 定义局部变量
function q() {
for (let i = 0; i < 10; i++) {
console.log(i);
}
console.log(i+10); // 报错:Uncaught ReferenceError: i is not defined
}

// ES6 const关键字 定义常量
const PI = 3.14;
// PI = 56; const定义的常量不允许赋值 报错:Uncaught TypeError: Assignment to constant variable.
console.log(PI);

</script>
<body>
</body>
</html>

4.3、方法

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<script>

var liurenwei = {
// 定义属性
name: '刘仁伟',
birth: '2000',
// 定义方法
age: function () {
var now = new Date().getFullYear(); // 获取当前年份
return now - this.birth; // this指当前调用它的对象
}
};

// apply : 设置当前函数指向其他对象
function getAge() {
var now = new Date().getFullYear();
return now - this.birth;
};
var liurenwei2 = {
name: '刘仁伟',
birth: '2000',
age: getAge
};
console.log(getAge.apply(liurenwei2,[]));
</script>
<body>

</body>
</html>

5、内部对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*  typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof NaN
"number"
typeof []
"object"
typeof {}
"object"
typeof Math.abs
"function"
typeof undefined
"undefined" */

5.1、Date

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
// date对象使用
var date = new Date();
date.getFullYear(); // 年
date.getMonth(); // 月 0~11
date.getDate(); // 日
date.getDay(); // 星期
date.getHours(); // 时
date.getMinutes(); // 分
date.getSeconds(); // 秒
date.getTime(); // 时间戳
console.log(new Date(1617096485343)); // 通过时间戳转化时间
//时间格式
var date1 = new Date()
date1.toDateString()
//"Tue Mar 30 2021"
date1.toGMTString()
//"Tue, 30 Mar 2021 13:27:52 GMT"
date1.toLocaleString()
//"2021/3/30下午9:27:52"
date1.toTimeString()
//"21:27:52 GMT+0800 (中国标准时间)"
</script>
</head>
<body>

</body>
</html>

5.2、JSON

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
// JSON对象使用
var user = {
name: '刘仁伟',
age: 18,
sex: '男'
}
// 将对象转化成字符串
var jsonUser = JSON.stringify(user); // "{"name":"刘仁伟","age":18,"sex":"男"}" 注意:json字符串key和value只能用双引号
// 将json字符串转成对象
JSON.parse(jsonUser);
</script>
</head>
<body>

</body>
</html>

5.3、AJAX

  • 原生的js写法 xhr异步请求
  • jQuery封装好的方法$(#name).ajax(“”)
  • axios请求

6、面向对象编程

6.1、原型继承

原型:在JavaScript中,每当定义一个函数数据类型(普通函数、类)时候,都会天生自带一个prototype属性,这个属性指向函数的原型对象,并且这个属性是一个对象数据类型的值。

原型链理解:在JavaScript中万物都是对象,对象和对象之间也有关系,并不是孤立存在的。对象之间的继承关系,在JavaScript中是通过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了一个原型指向的链条,专业术语称之为原型链。

当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则直接使用。如果没有则去原型的原型中寻找,直到找到Object对象的原型,Object对象的原型没有原型,如果在Object原型中依然没有找到,则返回undefined。

Object是JS中所有对象数据类型的基类(最顶层的类)在Object.prototype上没有__proto__这个属性。

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
var Student = {
name: 'liurenwei',
age: 3,
run: function () {
console.log(this.name+ " run... .. .")
}
};
var Xiaoming = {
name: 'xiaoming'
};
// 原型对象
Xiaoming.__proto__ = Student;

var Bird = {
fly: function () {
console.log(this.name+ " fly... .. .")
}
};
Xiaoming.__proto__ = Bird;
</script>
</head>
<body>

</body>
</html>

6.2、class继承

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<script>

function Teacher(name) {
this.name = name;
}
// 给Student新增一个方法
Teacher.prototype.hello = function () {
alert('hello');
}
var teacher = new Teacher("花木兰");

// ES6新特性
class Student{
// 构造器
constructor(name) {
this.name = name;
}
hello(){
alert('hello');
}
}
// extends关键字 继承父类 本质还是原型
class Smallstu extends Student{
constructor(name,grade) {
super(name);
this.grade = grade;
}
world(){
alert("小朋友");
}
}
var liurenwei = new Student("liurenwei");
var xiaoming = new Smallstu("xiaoming",12);

// 理解 :原型链
</script>
<body>

</body>
</html>

本质:查看对象原型

原型链

7、操作BOM对象(重点)

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--BOM对象 browser object model 浏览器对象模型-->
<!--
五大内核浏览器:IE Chrome Safari FireFox Opera
-->
<script>

// window对象代表浏览器窗口 全局
window.alert('1'); // 弹窗
window.innerHeight; // 浏览器内部高度
window.innerWidth; // 浏览器内部宽度
window.outerHeight; // 浏览器外部高度
window.outerWidth; // 浏览器外部宽度
window.confirm("带确认的对话框!") //确认对话框(返回布尔值)
window.prompt('请输入您的姓名:') //输入对话框(返回输入的值)
window.setTimeout(function () {
console.log(`执行定时器,当前时间是:${new Date()}`)
}, 2000) //定时器


// Navigator(不建议使用) 封装了浏览器的信息
navigator.appName; // 浏览器名称
navigator.appVersion; // 浏览器版本
navigator.userAgent; // 浏览器设定的User-Agent字符串
navigator.language; // 浏览器设置的语言
navigator.platform; // 操作系统类型

// screen 代表屏幕尺寸
screen.width; // 屏幕宽度,以像素为单位
screen.height; // 屏幕高度
screen.colorDepth; // 返回颜色位数,如8、16、24。

// location(重要) 代表当前页面的URL信息
location.protocol; // 'http'
location.host; // 'www.example.com'
location.port; // '8080'
location.pathname; // '/path/index.html'
location.search; // '?a=1&b=2'
location.hash; // 'TOP'
location.assign('http://www.baidu.com'); // 加载新页面
location.reload(); // 重新加载当前页面
location.href; // 获取请求地址
location.href = "http://www.baidu.com"; // 页面跳转(会保存历史记录)
location.replace('//jd.com') // 页面跳转(不保存历史记录)

// document 代表当前的页面
document.title; // 获取浏览器title信息
document.title = '刘仁伟'; // 修改浏览器title
document.cookie; // 获取cookie

// history 代表浏览器的历史记录
history.back(); // 浏览器后退
history.forward(); // 浏览器前进

</script>
</head>
<body>

</body>
</html>

8、操作DOM对象(重点)

8.1、获取DOM节点

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<!--DOM :document object model 文档对象模型-->
<!--浏览器网页就是一个Dom树形结构-->

<body>
<div id="div">
<h1>title</h1>
<p id="p1">内容</p>
<p class="p2">内容</p>
</div>
<!--获取dom节点-->
<script>
let back = document.querySelector('#back') //通过css选择器获取
var h1 = document.getElementsByTagName("h1"); // 获取标签名
var p1 = document.getElementById("p1"); // 获取指定id选择器的标签
var p2 = document.getElementsByClassName("p2"); // 获取指定class选择器的标签 注意: 返回的是一个数组
var div = document.getElementById("div");
var childrens = div.children; // 获取当前对象下的所有子节点
div.firstChild; // 获取第一个子节点
div.lastChild; // 获取最后一个子节点
</script>
</body>
</html>

8.2、更新DOM节点

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="div1">
div1
</div>
<div id="div2">
div2
</div>
<script>
// 更新文本 注意:当前节点下存在子节点,子节点会被覆盖
var div1 = document.getElementById("div1");
div1.innerText = '哈哈哈哈'; // 修改节点的文本值
div1.innerHTML = '<strong>哈哈哈哈</strong>'; // 可以解析HTML文本标签

// style属性可以更新css样式
var div2 = document.getElementById("div2");
div2.style.color = 'red'; // 属性使用字符串包裹
div2.style.fontSize = '15'; // - 转 驼峰命名
div2.style.marginLeft = '2em';
</script>
</body>
</html>

8.3、删除DOM节点

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<!--删除节点步骤: 先获取父节点--在通过父节点删除自身-->
<body>
<div id="div">
<h1>title</h1>
<p id="p1">内容1</p>
<p class ="p2">内容2</p>
</div>
<script>
var h1 = document.getElementsByTagName("h1");
var p1 = document.getElementById("p1");
var p2 = document.getElementsByClassName("p2"); // 注意: 返回的是一个数组
var div = document.getElementById("div");
var father = p1.parentElement; // 获取父节点
father.removeChild(p1); // 删除指定子节点
father.removeChild(p2[0]); // 删除指定子节点
father.removeChild(father.children[0]); // 通过下标删除子节点
//father.removeChild(father.children[1]); 注意: 删除多个节点的时候,children是在时刻变化的,删除节点的时候一定要注意
</script>
</body>
</html>

8.4、创建和插入DOM节点

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p id="js">javaScript</p>
<p id="jq">jquery</p>
<div id = 'list'>
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>

<script>
var list = document.getElementById("list");
var js = document.getElementById("js");
var jq = document.getElementById("jq");
var se = document.getElementById("se");
var ee = document.getElementById("ee");
var me = document.getElementById("me");

// 追加节点到后面
list.appendChild(js);
list.append(jq);
// 新增节点
var newp = document.createElement('p'); // 创建一个p标签
newp.id = 'pid'; // 给标签设置id属性 也可以通过 newp.setAttribute("id","newp"); 设置属性
newp.innerText = 'aaa';
newp.style.color = 'red';
list.appendChild(newp);
// 设置属性
var body = document.getElementsByTagName("body"); // 注意: body是一个 HTMLCollection
body[0].setAttribute("style","background-color: brown"); // 给body设置一个背景颜色
// insertBefore属性
list.insertBefore(newp,ee); // 将newp追加到ee前面
// 进阶玩法
var mystyle = document.createElement("style"); // 创建style标签
mystyle.setAttribute("type","text/css");
mystyle.innerHTML = '#list{\n' +
' background-color: aqua;\n' + // 设置样式
' }';
var myhead = document.getElementsByTagName("head"); // 获取head标签
myhead[0].append(mystyle); // 把style标签追加到head标签中
</script>
</body>
</html>

9、操作表单

9.1、操作表单

  • 文本框—-text
  • 下拉框—-select
  • 单选框—-radio
  • 多选框—-checkbox
  • 隐藏域—-hidden
  • 密码框—-password
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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="">
<p>
<span>用户名:</span>
<input type="text" value="123" id="username"/>
</p>
<p>
<span>性别:</span>
<input type="radio" name="sex" value="男" id="boy" checked="true"></input>
<input type="radio" name="sex" value="女" id="girl"></input>
</p>
</form>

<script>
var username = document.getElementById("username");
var boy = document.getElementById("boy");
var girl = document.getElementById("girl");

// 获取输入框value值
username.value;
// 修改输入框value值
username.value = '1213131';
// 获取单选框的value值
boy.value;
// 判断表单是否选中
boy.checked;
// 选中
girl.checked = true;

</script>
</body>
</html>

9.2、表单验证和MD5加密

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--MD5工具类-->
<script src = "https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>
</head>
<body>
<!--表达绑定提交事件
οnsubmit= 绑定一个提交检测的函数,true,false
将这个结果返回给表单,使用onsubmit接收
-->
<form method="post" action="https://www.runoob.com/" onsubmit="return identify()"> <!--onsubmit事件 return一个方法-->
<p>
<span>用户名:</span>
<input type="text" id="username" name="username" required/> <!--required:必填-->
</p>
<p>
<span>密码:</span>
<input type="password" id="input_pwd" required/> <!--required:必填-->
</p>
<input type="hidden" id="md5_pwd" name="passwrod"/>
<input type="submit"></input>
</form>

<script>
function identify() {
var username = document.getElementById("username");
var input_pwd = document.getElementById("input_pwd");
var md5_pwd = document.getElementById("md5_pwd");

md5_pwd.value = md5(input_pwd.value); // md5加密 防止抓包抓到的明文显示用户密码
console.log(md5_pwd.value);
if (input_pwd.value == '123456') { // 进行密码校验 可以用正则表达式校验数据格式
return true; // 校验成功返回true
} else {
return false; // 失败返回false
}
}
</script>
</body>
</html>

10、jQuery

javaScript和jQuery的关系?

jQuery库,里面封装了大量的JavaScript函数

jQuery公式:**$(selector).action()**

10.1、jQuery学习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--可以通过下载到本地引用,也可以在线引用-->
<!--<script src="jq/jquery-3.6.0.js"></script>-->
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>

<!--
公式: $(selector).action()
-->
<body>
<a href="" id="test_jquery">点我</a>
<script>
$("#test_jquery").click(function () {
alert("hello,jquery");
});
</script>
</body>
</html>

10.2、jQuery选择器

文档工具站:http://jquery.cuishifeng.cn/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//原生js,选择器少,麻烦不好记
//标签
document.getElementByTagName();
//id
document.getElementById();
//class
document.getElementByClassName();

//jQuery css中的选择器它全部都能用!
$('p').click();//标签选择器
$('#id1').click();//id选择器
$('.class1').click();//class选择器

</script>
</body>
</html>

10.3、jQuery事件

鼠标事件、键盘事件,其他事件

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jq/jquery-3.6.0.js"></script>
<style>
#divMove{
width:500px;
height:500px;
border:1px solid red;
}
</style>
</head>
<!--要求:获取鼠标当前的一个坐标-->
mouse:<span id = "mouseMove"></span>
<div id = "divMove">
在这里移动鼠标试试
</div>
<body>
<script>
// 当网页元素加载完毕之后,响应事件
// $(document).ready(function(){})
$(function(){
$('#divMove').mousemove(function(e){
$('#mouseMove').text('x:'+e.pageX+"y:"+e.pageY)
})
});
</script>
</body>
</html>

10.3、jQuery操作DOM

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jq/jquery-3.6.0.js"></script>
</head>
<body>
<ul id="ul">
<li class="js">JavaScript</li>
<li name="python">Python</li>
<li>SpringBoot</li>
</ul>
</body>
<script>
// 节点文本操作
$("#ul li[name=python]").text(); // 获取值
$("#ul li[name=python]").text('JavaWeb'); // 设置值
$("#ul li[name=python]").html(); // 获取值
$("#ul li[name=python]").html('<strong>JavaWeb</strong>'); // 设置值

// css样式操作
$("#ul li[name=python]").css("color","red");

// 元素的显示和隐藏,:本质display:none
$('#ul li[name=python]').show(); // 显示
$('#ul li[name=python]').hide(); // 隐藏

// jquery效果
$('#ul').click(function () {
$('#ul li[name=python]').toggle(); // 显示隐藏
$('.js').slideToggle(); // 滑入滑出
$('li:last').fadeToggle(); // 淡入淡出
});

$(window).width(); // 获取浏览器的宽度
$(window).height(); // 获取浏览器的高度

</script>
</html>

小技巧

  • 如何巩固JS(看jQuery源码,看游戏源码!)
  • 巩固HTML、CSS(扒网站,全部down下来,然后对应修改看效果~)