elric
21 次阅读
约 12 分钟 · 3608 字
JS 笔记

JS 笔记

2023-9-28 ~ 2023-10-5

2024-12-4 ~ 2024- 2025-5-5最后编辑

1. 简介

1.1 什么是 JavaScript

JavaScropt 是一门世界上最流行的脚本语言

他和 Java 没什么关系,主要是蹭热度

它只用 10 天开发出来

一个合格的程序员,必须要精通 JavaScript

脚本语言通常通过解释器逐行解释执行,而不是先编译成机器代码

1.2 历史

ECMAScript 是 JavaScript 的一个标准

最新版本已经到六了,但大多数浏览器只支持到五

导致:开发环境到线上环境不一样,要用应用转换

2. 快速入门

2.1 引入 JavaScript

1.内部标签直接写

HTML
<script>  //......  /*......*/</script>

2.外部引入

abc.js

JavaScript
//......

text.html

HTML
<script src="abc.js"></script>

2.2 基本语法入门

HTML
<!--js严格区分大小写--><!--但对分号不怎么要求,但为了防止歧义,最好写--><script>  // 1.定义变量:   c++中:变量类型 变量名 = 变量值;  const num = 1;  let score = 71;  var name = "sakurakugu";   // 2.条件控制  if (score > 60 && score < 70) {    alert("60~70");  } else if (score > 70 && score < 80) {    alert("70~80");  } else {    alert("other");  }   // console.log(score);在浏览器的控制台打印变量score  console.log(score); //可类比printf/cout;也可不加分号   //当然。也可以在浏览器的“源代码”(第三个)中选择断点(类似c++的debug),去调试,点刷新就开始了   // 3.多行注释:“/**/”</script>

浏览器必备调试须知:

2.3 数据类型

数值、文本、图形、音频、视频……

变量

const 块级作用域的常量 (优先使用)
let 块级作用域的变量
var 全局变量/函数作用域的变量(不推荐)

JavaScript
const NUM_1 = 1; // 常量常用大写字母和下划线`_`let 成绩 = 71; // 国际化常用数字、字母和`$`和`_`var myName = "sakurakugu"; // 常用小写开头的驼峰命名法alert(num); // 弹窗“num”var 原神 = "启动";var 璃月 = ["甘雨", "胡桃"];
数字

JS 不区分浮点数与整数,Number

注:NaN ** 0 结果为 1 ( x0=1(当x≠0时)x^0=1(当 x≠0 时) ,指数规则覆盖了传播规则

JavaScript
/*在控制台中*/ 123; //整数123.45; //浮点数1.123e3 - //科学计数法 (在控制台中输出的是1123)  99; //负数NaN; //not a number(不是一个数字/无效数字)Infinity - //无限大  Infinity; //无限小

大整数

BigInt 类型

JavaScript
// 尾部的 "n" 表示这是一个 BigInt 类型const 大整数 = 1234567890123456789012345678901234567890n;
字符串
JavaScript
'abc'	"abc"	'\n'	"\n"	//js中不区分单双引号,它们都是简单引用
JavaScript
// d反引号是 功能扩展 引号。它们允许我们通过将变量和表达式包装在 ${…} 中,来将它们嵌入到字符串中。例如: let name = "John";// 嵌入一个变量alert(`Hello, ${name}!`); // Hello, John!// 嵌入一个表达式 (注:${…} 内的表达式会被计算)alert(`the result is ${1 + 2}`); // the result is 3
布尔值
JavaScript
true	false
逻辑运算
JavaScript
&&		//两个都为真||		//一个为真,结果为真!		//真即假,假即真
比较运算符!!!
JavaScript
=		//赋值==		//是否等于 (类型可以不一样,但值一样,为真 (如:1与'1')为真)===		//是否绝对等于 (类型、值都要一样,才为真 (如:1与'1'为假)) /*因此常用绝对等于符号*/

为了保证严谨性,最好少用 “ == ”,多用 “ === ”

须知:

  • NaN 与所有的数字都不相等,包括自己
  • 只能通过 isNaN() 来判断一个数是否为 NaN (如:isNaN(NaN) 为 true)

浮点数问题:

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

浮点数可能会有精度的损失,当然,和 C++一样,

但如果要判断上述的式子,可以用:

JavaScript
console.log(Math.abs(1 / 3 === 1 - 2 / 3) < 0.0000000000001);//通过判断它的绝对值是否小于一个极小的数,可以近似判断它们相等
null 和 undefined
  • null 空 (仅仅是一个代表“无”、“空”或“值未知”的特殊值)(不是 null 指针或对象的引用)
  • undefined 指 未被赋值 (not defined:未定义的)
Symbol 符号类型

Symbol 是 JavaScript 中的一种特殊的基本类型,它和数字 (Number) 和字符串 (String) 不相关,也不隶属于它们。Symbol 的主要特点是生成唯一的值,通常用来作为对象(Object)的键。
因此可以避免对象属性被意外覆盖/属性名冲突或作为元编程工具。

元编程(Meta-Programming)是指编写能够操作或生成代码的代码

JavaScript
const symbol1 = Symbol("unique1");const symbol2 = Symbol("unique2"); console.log(symbol1 === symbol2); // false (每次生成的 Symbol 值都是唯一的) const obj = {  [symbol1]: "value1",  [symbol2]: "value2",}; console.log(obj[symbol1]); // "value1"console.log(obj[symbol2]); // "value2"

上述的都是基本类型

Object 对象

Object 是一种引用类型,用于存储键值对,表示一组属性和方法
常用于存储复杂的数据结构,如对象、数组、函数等

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

JavaScript
/*每个属性之间用逗号隔开,最后一个可以不用加逗号*//*可类比C++的class(类)或结构体(用class类比更精确一些)*/let person = {  name: "sakurakugu",  age: 16,  tags: ["meishaonv", "kawaii", "……"],};

如何打印:

JavaScript
person.name					-->		'sakurakugu'console.log(person.name)	-->		 sakurakuguconsole.log(person["name"]);-->		 sakurakuguperson.age		-->		16person			-->		{name: 'sakurakugu', age: 16, tags: Array(3)}person.tags		-->		(3) ['meishaonv', 'kawaii', '……']person.tags[1]	-->		'kawaii'
数组

这个数组属于对象类型

JavaScript
let arr = [1, 2, 3, 4, 5, "hello", "world", null, true];//JS的数组本质是哈希表,上面的写法只是语法糖而已 //用对象定义数组new array(1, 2, 34, "hello", "world"); //定义一个array数组

但是,为了保证代码的可读性,最好用上述中括号的定义方法

如何打印:

JavaScript
console.log(arr[3]);//如果越界了,就会输出undefined
typeof 运算符

用于返回参数的类型

typeof 是一个操作符,不是一个函数,typeof(x) 本质是 typeof (x)

JavaScript
typeof undefined; // "undefined"typeof 0; // "number"typeof 10n; // "bigint"typeof true; // "boolean"typeof "foo"; // "string"typeof Symbol("id"); // "symbol"typeof Math; // "object"typeof null; // "object"  	// 这是一个为了兼容性的Bugtypeof alert; // "function"  // 函数在JS中隶属于对象类型

2.4 严格检查模式:

JavaScript
//全局变量i = 1;//局部变量var i = 1; //但在ES6中,局部变量常在let中定义(之后学)(let更像C++的了)

在 script 块的最开头加上一个字符串 'use strict'; 则开启严格检查模式

在严格检查模式下,中文,var 等等都会被严格检查

htnl
<script>	'use strict';	……	……</script>

3.数据类型(详细)

3.1 字符串

1.正常字符串,我们使用单引号或者双引号包裹

2.注意用转义字符打出那些打不出的字符

\n				回车,换行\'				单引号\t				Tab键\u4e2d	\u####	Unicode字符\x41	\x##	ASCll字符

3.多行字符串编写

JavaScript
/*用飘号的那个引号(反引号)*/var msg=`123      456            789`; msg	-->'123\n      456\n            789' console.log(msg)	-->123      456            789

4.模板字符串

JavaScript
let name="sakurakugu";let age=3;let msg1=`你好呀,${name}${age}`; console.log(msg1)	-->你好呀,sakurakugu3

上述的那个 msg1 就是模板字符串,就像一个模板一样,中间可以填空

5.字符串长度

JavaScript
var student="student"; console.log(student.length)		-->		7console.log(student[0])			-->		s

6.字符串的可变性:不可变的

7.大小写转换(输出纯大写/纯小写)

JavaScript
console.log(student.toUpperCase())	-->	STUDENTconsole.log(ab.toLowerCase())		-->	student//仅仅是输出,不改变原值

8.获取第一个字符出现的序列

JavaScript
//获取“t”第一次出现的i(a[i]的i)(从0开始)console.log(student.indexOf('t'))	-->	1 

9.截取并输出

JavaScript
console.log(student.substring(2))	-->	udent//从“2”开始,到结尾console.log(student.substring(2,4))	-->	ud//包含前面,不包含后面 [ , )

3.2 数组

Array 可以包含任意的数据类型

JavaScript
var arr = [1, 2, 3, 4, "1", "2"];

1.长度

JavaScript
arr.length		-->		6//数组的长度是可变的,arr.length=10,它的长度就变成了10arr.length=10;arr				-->		(10) [1,2,3,4,"1",'2', 空 ×4]console.log(arr)-->		(10) [1, 2, 3, 4, '1', '2', 空 ×4] //当然变短就把多余的删了//如果要赋值取值就用下标arr[0]=12;arr[0]	-->		12

2.indexOf 通过元素获得下标索引

JavaScript
arr.indexOf('2')		-->		5//注意:字符“2”,与数字2不同

3.slice()

可以截取数组的一部分,返回一个新数组

JavaScript
arr.slice(1)		-->		(5) [2, 3, 4, '1', '2']arr.slice(1,5)		-->		(4) [2, 3, 4, '1']

4.push()/pop() 尾部

JavaScript
//压入到尾部arr.push('a','b')	-->		8arr					-->		(8) [1, 2, 3, 4, '1', '2', 'a', 'b']//弹出尾部元素arr.pop()			-->		'b'arr					-->		(7) [1, 2, 3, 4, '1', '2', 'a']

5.unshift()/shift() 头部

JavaScript
//压入到头部arr.unshift('a','b') -->		8arr					 -->		(8) ['a', 'b', 1, 2, 3, 4, '1', '2']//弹出头部元素arr.shift()			 -->		'a'arr					 -->		(7) ['b', 1, 2, 3, 4, '1', '2']

6.sort() 排序

JavaScript
arr				-->		(8) ['a', 'b', 1, 2, 3, 4, '1', '2']arr.sort()		-->			[1, '1', 2, '2', 3, 4, 'a', 'b']

7.reverse() 元素反转

JavaScript
//就是元素反过来重新排序var arr=[1,2,3,4,"1",'2'];arr.reverse()	-->		(6) ['2', '1', 4, 3, 2, 1]

8.concat() 添加

JavaScript
//在数组后面加上要加的字符,然后返回一个新数组//并没有更改原数组arr.concat([1,2,3])		-->	  (9) [1, 2, 3, 4, 5, 6, 1, 2, 3]arr.concat(1,2,3)		-->	  (9) [1, 2, 3, 4, 5, 6, 1, 2, 3]//所以这里原数组不变arr						-->	  (6) [1, 2, 3, 4, 5, 6]

9.连接符 join

JavaScript
//使用特定的字符连接数组,并打印拼接后的这个新数组arr.join('-')		-->		'1-2-3-4-5-6'arr.join("ooo")		-->		'1ooo2ooo3ooo4ooo5ooo6'

10.多维数组

JavaScript
a=[[1,2],['1','2','3'],["1",5,'1']]; --> (3) [Array(2), Array(3), Array(3)]	0: (2) [1, 2]	1: (3) ['1', '2', '3']	2: (3) ['1', 5, '1']	length: 3	[[Prototype]]: Array(0) //二维数组取值a[1][2]		-->		'3'

3.3 对象

若干个键值对

JavaScript
//如:var person = {  name: "John",  age: 30,  gender: "male",};//name、age、gender是键(key),冒号后面的是值(value)//99%的键都是字符串,而值是任意对象
JavaScript
var 对象名 = {    关键字:对应值, (属性名:属性值)    关键字:对应值,    关键字:对应值,    关键字:对应值}

如上定义了 person 对象,它有三个属性

js 中的对象,以{……}表示一个对象,键值对描述属性 xxx: xxx,多个属性之间使用逗号隔开,最后一个属性不加逗号

1.对象赋值

JavaScript
person.name='sakurakugu'		-->		'sakurakugu'person.name						-->		'sakurakugu'

2.使用一个不存在的对象属性,不会报错! undefined

JavaScript
person.haha-- > undefined;

3.动态的删减属性,通过 delete 删除对象的属性

JavaScript
delete 			-->		person.nametrueperson			-->		{age: 30, gender: 'male'}

4.动态的添加属性,直接给新的属性添加值即可

JavaScript
person.haha='haha'		-->		'haha'person		-->		{age: 30, gender: 'male', haha: 'haha'}

5.判断属性值是否在这个对象中 ‘xxx’ in xxx

JavaScript
"age" in person-- > true;

6.判断一个属性是否是这个对象自身拥有的 hasOwnProperty()

JavaScript
person.hasOwnProperty('toString')		-->		falseperson.hasOwnProperty('age')			-->		true

3.4 流程控制

if…… else…… 表判断

JavaScript
var arr = 3;if (arr > 3) {  alert("haha");} else {  alert("kuwa~");}

while 循环/do……while 循环

JavaScript
while (arr < 100) {  arr += 1;  console.log(arr);}///////////////////////do {  arr += 1;  console.log(arr);} while (arr < 100);

for 循环

JavaScript
//可以通过输入“fori”+“回车”来快速的输入for (let i = 0; i < 100; i++) {  console.log(i);}

forEach 循环

JavaScript
var arr = [12, 123, 2, 3, 4, 1, 234, 5, 31, 234, 23];//自带的函数arr.forEach(function (value) {  console.log(value);}); //循环遍历这个数组的每一个元素

for……in 循环

JavaScript
//和上面一样,用于循环数组中每一个元素,并打印var arr = [12, 123, 2, 3, 4, 1, 234, 5, 31, 234, 23]; for (var num in arr) {  console.log(arr[num]);}

3.5 Map 和 Set

ES6 的新特性

Map:(词典)

JavaScript
var map = new Map([  ["tom", 100],  ["jack", 90],  ["mary", 80],]);var name = map.get("tom"); //通过key获得valuemap.set("admin", 123456); //新增/设置新的值console.log(name);map.delete("tom"); //删除tom

Set:(无序不重复的集合)

JavaScript
var set = new Set([1,3,4,532,1,1,1,1]);set			    -->     Set(4) {1, 3, 4, 532}//它会去重set.add(2);set				-->		 Set(5) {1, 3, 4, 532, 2}set.delete(1);			 //删除1console.log(set.has(3)); //是否包含某个元素(ture false)

3.6 iterator(迭代器)

ES6 的新特性

JavaScript
var arr = [3, 4, 5];//通过以下两种方式都可以打印数组具体的值for (var i in arr) {  console.log(arr[i]); //打印数值  //console.log(i);		//打印下标} for (var i of arr) {  console.log(i); //打印数值}

所以,for……of 是针对下标对应的数值的,for……in 是针对下标本身

当然 for……of 也支持 Map 和 Set 的

JavaScript
var map = new Map([  ["tom", 100],  ["jack", 90],  ["mary", 80],]);for (let x of map) {  console.log(x);} var set = new Set([1, 3, 4, 532, 1, 1, 1, 1]);for (let x of set) {  console.log(x);}

4. 函数

又可叫方法

4.1 定义函数

如绝对值函数

定义方式一

JavaScript
function abs(x){    if(x>=0){}    else{x=-x;}    return x;} abs(10)			-->		10abs(-10)		-->		10

定义方式二

JavaScript
var abs = function (x) {  if (x >= 0) {  } else {    x = -x;  }  return x;};

fonction(x){……} 这是一个匿名函数,但是可以把结果赋值给 abs,然后通过 abs 就可以调用函数

方式一和方式二等价,sakurakugu 推荐使用第一种

调用函数

JavaScript
abs(10)			-->		10abs(-10)		-->		10

参数问题:js 可以传递任意个参数,比如对于上面的 abs 来说可以是 0 个,也可以是多个,当然,只有 return 的传回来了

如果参数不存在,可以手动抛出异常

JavaScript
function abs(x) {  //手动抛出异常  if (typeof x !== "number") {    //如果x不为数字    throw "没有数字 not a number";  }   if (x >= 0) {  } else {    x = -x;  }  return x;}

arguments

arguments是一个 js 免费赠送的一个关键词

代表,传递进来的所有的参数,是一个数组

rest

获取除了已经定义的参数之外的所有参数

如下

JavaScript
function aaa(a,b,...rest){    console.log(a);    console.log(b);    console.log(rest);    console.log(arguments);} //控制台aaa(1,2,3,4,5,6)12(4) [3, 4, 5, 6]Arguments(6) [1, 2, 3, 4, 5, 6, callee: (...), Symbol(Symbol.iterator): ƒ]

注,rest 参数只能写在最后面,必须用 “...” 标识。

4.2 变量的作用域

在 js 中,var 定义的变量事实上是有作用域的。

假设在函数体中声明,则在函数体外不可以使用~(非要想实现,可以研究一下闭包)

var 就两种情况,“全局”和“函数内”

规范 1

因为 js 都会把变量的定义(只是 var)提前到开头(全局开头/函数开头)(这里的提前只是告诉代码有这个变量,打印的话,会抛出未定义的),但赋值不会,所有为了规范,最好将定义统一放在开头

JavaScript
var x = 1;y = x + 1;z, i, a;

全局对象 window

JavaScript
var x = "xxx";alert(x);alert(window.x); //默认所有的全局变量,都会自动绑定在window对象下(如这里的x)//像是这里的alert也是,可以写成window。alert

js 实际上只有一个全局作用域。

任何变量(函数在这也可以视为变量)假设没有在函数的作用人、范围内找到,就会向外查找,如果在全局作用域(window)下也没有找到,就会报错

规范 2

由于我们所有的全局变量都会绑定到我们的 window 上,如果不同的 js 文件,使用了相同的全局变量,就会冲突

减少冲突:

JavaScript
//先定义一个空对象var Suakura = {}; //再定义全局变量(再将属性和方法放入对象中)Sakura.name = "aaa";Sakura.add = function (a, b) {  return a + b;};

通过这种方法,可以降低全局命名冲突的问题

jQuery 也是这么干的,但为了简化书写,用$符号当作 jQuery 的简化符号

局部作用域 let

就是和 C++一样,是块级“{ }”作用域;

建议使用这个,用法和 var 一样

JavaScript
let a = 1;

常量 const

常量建议都使用大写字母

JavaScript
const PI = 3.14;//不知道为什么,数字部分加了引号也能算出正确的结果

4.3 方法

方法就是把函数放到对象里面,对象只有两个东西:属性和方法

JavaScript
let sakurakugu={    name:"樱花莎",    birth:1024,    //方法    age:function(){        let now=new Date().getFullYear();        return now-this.birth;    }}; sakurakugu.age()		-->		999 /*调用:*///属性sakurakugu.name//方法Sakurakugu.age()	//调用方法一定要加括号	//如果将函数放在外面,内部只是调用,也要加括号

this.是什么:

this 指向的是当前函数被调用时所在的对象,当我们在一个对象内部定义一个函数时,该函数中的 this. 就会指向这个对象;而在全局环境中调用函数时,this. 则指向全局对象 window。

apply

在 js 中,apply 可以控制 this 的指向

5. 内部对象

标准对象

JavaScript
typeof 123'number'typeof "123"'string'typeof '123''string'typeof true'boolean'	//布尔值typeof []	//数组'object'	//对象typeof {}	//对象'object'	//对象typeof NaN'number'typeof undefined'undefined'typeof Math.abs'function'…………

5.1 Date

基本使用

JavaScript
var now = new Date();now.getFullYear(); //年now.getMonth(); //月 这个从0开始now.getDate(); //日now.getDay(); //星期now.getHours(); //时now.getMinutes(); //分now.getSeconds(); //秒 now.getTime(); //时间戳   从1970.1.1 0:00:00 UTC开始到现在的毫秒数

转换

JavaScript
new Date(1696242744325); //时间戳转为当前时间now.toLocaleDateString(); //转换本地时间格式("2023/10/2");now.toLocaleString(); //同上("2023/10/2 18:36:59");

5.2 JSON 对象

早期,所有的数据传输习惯使用 XML 文件,不太好用

  • JSON(JavaScript Object Notation, JS 对象简谱)是一种轻量级的数据交换格式。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在 js 中,一切皆为对象,任何 js 支持的类型都可以用 json 表示

格式:

  • 对象都用大括号{}
  • 数组都用中括号[]
  • 所有的键值对都用 key:value

js 对象与 json 字符串之间的转换

JavaScript
let user = {  name: "sakurakugu",  age: 999,  sex: "nan",}; console.log(user);//对象转化为json字符串:let jsonuser = JSON.stringify(user); console.log(jsonuser);//json字符串转化为对象let jsuser = JSON.parse(jsonuser); console.log(jsuser);
JavaScript
//输出结果:{name: 'sakurakugu', age: 999, sex: 'nan'} //可展开{"name":"sakurakugu","age":999,"sex":"nan"}//不可展开{name: 'sakurakugu', age: 999, sex: 'nan'} //可展开

js 对象与 json 字符串的区别:

如上输出的结果,name,age 等都变成了字符串

5.3 Ajax

  • Ajax(Asynchronous JavaScript and XML)是一种用于在网页上进行异步通信的技术。

  • 它结合了多种现有的 Web 技术,包括 JavaScript、XML、HTML 和 CSS

  • 用于在不刷新整个页面的情况下与服务器进行数据交互。

有原生的 js 写法,xhr 异步请求

或 jQuey 封装好的方法 $("#name").ajax("")

axios 请求 (专门用来做请求的)

6. 面向对象编程

6.1 什么是面向对象

js,java,c++,c#……都是面向对象的语言,但是 js 有些区别

  • 类:模板(名字)

  • 对象:实例(小明,小红……)

类是对象的抽象,对象是类的具体表现

原型对象

一种继承方式(__proto__)

JavaScript
let user = {  name: "sakurakugu",  age: 999,  sex: "nan",}; let xiaoming = {  name: "xianming",}; //原型(小明继承了user的原型)xiaoming.__proto__ = user;

class 对象

class 继承

JavaScript
//定义一个类class Student {  constructor(name) {    this.name = name;  }   hello() {    alert("hello");  }} //将两个对象放进去let xiaoming = new Student("xiaoming");let xiaohong = new Student("xiaohong");

本质:查看对象原型

JavaScript
//类之间继承class xiao_xuesheng extends Student {}

原型链

__proto__

7. 操作 BOM 对象(重点)

浏览器介绍

js 和浏览器的关系?

js 的但是就是为了能够在浏览器中运行

B:浏览器

BOM:浏览器对象模型

  • ie6~11
  • Chrome
  • Safari
  • FireFox

window

window 代表 浏览器窗口

JavaScript
window.alert(1);undefined;window.innerHeight;679;window.innerWidth;1048;window.outerHeight;1026;window.outerWidth;849;//自己去试试就知道了

navigator

navigator 它封装了浏览器的信息

JavaScript
navigator.appName;("Netscape");navigator.appVersion;("5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.47");//用于检测浏览器的信息//大多数时候不会使用它,应为这些数据可以人为修改,因此也不建议使用它

screen

JavaScript
screen.width;1707(px);screen.height;1067(px);

location

location 代表当前页面的 URL 信息

JavaScript
host: "www.baidu.com"href: "https://www.baidu.com/"protocol: "https:"reload: ƒ reload()	//刷新网页//设置新的地址location.assign(新地址)

document

document 代表当前页面,HTML DOM 文档树

JavaScript
document.title;("百度一下,你就知道");document.title = "aaa";("aaa");

获取具体的文档树节点

HTML
<dl id="app">  <dt>java</dt>  <dd>javase</dd>  <dd>javaee</dd></dl> <script>  let dl = dpcument.getElementById("app");</script>

获取当前网页的 cookie

JavaScript
document.cookie;("3AB9D23F7A4B3C9B=EQCXVYPQBN5RK4W25JHHSOGBJNVDSHBI2GYWZUNCB27TTDWGDHWKWW7EES4GXILNYNOAQZLBUQ3YKHBFZK5OQ6TWZE; Hm_lvt_affdf09dddabcdf2d681acefa474b973=1694878902");

history

JavaScript
//history 代表浏览器的历史记录history.back(); //后退history.forward(); //前进//也不建议使用

8.操作 DOM 对象(重点)

DOM:文档对象模型

核心

浏览器网页就是一个 Dom 树形结构!

  • 更新:更新 Dom 节点

  • 遍历 dom 节点:得到 dom 节点

  • 删除:删除一个 dom 节点

  • 添加:添加一个新的节点

要操着一个 dom 节点,就必须要先获得这个 dom 节点

获得 dom 节点

JavaScript
//可对应css的选择器let h1 = document.getElementsByTagName("h1");let p1 = document.getElementById("p1");let p2 = document.getElementsByClassName("p2");let father = document.getElementById("father"); let childrens = father.children; //获取父节点下面的所有子节点father.firstChild;father.lastChild;

这是原生代码,之后都是使用 jQuery

更新节点

操作文本

  • id1.innerText="123"修改文本的值为 123
  • id1.innerHTML="<strong>123</strong>"修改成加粗的 123

操作 css

  • id1.style.color="red";修改文本为红色(属性要使用字符串包裹)

  • id1.style.fontSize='20px';修改字体大小为 20 像素(这是命名问题,将下划线转成了大写字母)

  • id1.style.padding="2em"修改边框为 2 个字大小

删除节点

步骤,先获取父节点,在通过父节点删除自己

  • father.removeChild(p1) 删除 p1
HTML
<div id="father">  <h1>标题1</h1>  <p id="p1">p1</p>  <p class="p2">p2</p></div> <script>  let self = father.removeChild(p1); //获取自己  let father = p1.parentElement; //获取父节点  father.removeChild(self); //删除自己   father.removeChild(father.children[1]); //或者这样,但注意,删除后后面的会向前变化的</script>

插入节点

我们获得了某个 dom 节点,假设这个 dom 节点是空的,我们通过 innerHTML/Text 就可以增加一个元素了,但是这个 dom 节点已经存在元素了,我们就不能这么干了,因为会覆盖

所有一般用追加的方法

HTML
<div>  <p id="js">js</p>  <div id="list">    <p id="se">javase</p>    <p id="ee">javaee</p>    <p id="me">javame</p>  </div></div> <script>  let js = document.getElementById("js"), //已存在的节点    list = document.getElementById("list");  list.appendChild(js); //将“js”追加到list最后面</script>

创建一个新的标签,并插入

HTML
<script>  //创建一个新标签  let newp = document.createElement("p");  newp.id = "newp";  newp.innerText = "hello,sakura";  list.appendChild(newp);  //创建一个标签节点 (通过这个属性,可以设置任意的值,如style,a等等)  let myscript = document.createElement("script");  myscript.setAttribute("type", "type/javascript");</script>

insert

JavaScript
let ee = document.getElementById("ee");let js = document.getElementById("js");let list = document.getElementById("list");//insertBefore(newNode,targetNode) 将新节点插入到目标节点前面list.insertBefore(js, ee);

9. 操作表单(验证)

表单是什么 form DOM 树

  • 文本框 <text>
  • 密码框 <password>
  • 下拉框 <select>
  • 单选框 <radio>
  • 多选框 <cheakbox>
  • 隐藏域 <hidden>
  • ……

表单的目的:提交信息

获得要提交的信息

JavaScript
//得到输入框的值let input_text = document.getElementById("username");let boy_radio = document.getElementById("boy");let girl_radio = document.getElementById("girl");//修改输入框的值input_text = "1234";//对于单选框,或多选框,boy_radio.value只能取到当前的值boy_radio.value-- > "man"; //说明这个选项要传递的信息boy_radio.checked-- > true; //说明男被选中

提交表单

HTML
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script> <!--表单绑定提交事件onsubmit : 绑定一个提交检测函数,true/false将这个结果返回给表单,使用onsubmit接收onsubmit="return check()"--><form action="#" method="post">  <p>    <span>用户名:</span><input type="text" id="username" name="username" />  </p>  <p>    <span>密码:</span><input type="password" id="password" name="password" />  </p>   <!--这个提交可以绑定一些事件,onclick:被点击时-->  <button type="submit" onclick="check()">提交</button>  <!--<input type="submit">--></form> <script>  function check() {    let uname = document.getElementById("username");    let pwd = document.getElementById("password");     console.log(uname.value);     //MD5算法,将密码改成md5的格式    pwd.value = md5(pwd.value);    console.log(pwd.value);     //这里还可以检验表单是否是对的,之后return true/false  }</script>

10.jQuery

js 和 jQuery 库

jQuery 库,里面存在大量的 js 函数

获取 jQuery

jquery.com

或者像之前那样,用在线的 cdn

如何使用

HTML
<!DOCTYPE html><html lang="zh">  <head>    <meta charset="UTF-8" />    <title>Title</title>    <!--在线的jquery,当然有很多其它的,如百度的,微软的等等-->    <!--<script src="https://cdn.bootcss.com/jquery/3.4.1/core.js"></script>-->    <!--本地的-->    <script src="../lib/jQuery/jquery-3.7.1.js"></script>  </head>  <body>    <!--公式:$(selector选择器).action事件()-->    <a href="#" id="text-jquery">点我</a>     <script>      document.getElementById("text-jquery");      //这个选择器就是css的选择器      $("#text-jquery").click(function () {        alert("hello,jQuery");      });    </script>  </body></html>

选择器

HTML
<script>  //原生的js,选择器少,麻烦不好记  //标签  document.getElementsByTagName();  //id  document.getElementById();  //类  document.getElementsByClassName();   //jQuery  css中的选择器,它都可以用  $("p").click(); //标签选择器  $("#id1").click(); //id选择器  $(".class1").click(); //class选择器</script>

事件

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

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

操作 DOM 元素

节点文本操作

JavaScript
$("#text-ul li[name=python]").text(); //获得值("Python");//将文本改成了11234$("#text-ul li[name=python]").text("11234"); //设置值

css 的操作

JavaScript
$("#text-ul li[name=python]").css("color", "red"); //变红

元素的显示和隐藏 本质:display:none;

JavaScript
$("#text-ul li[name=python]").show(); //显示文本$("#text-ul li[name=python]").hide(); //隐藏文本

未来的 ajax();

小技巧

1.如何巩固 js(看 jquery 源码,看游戏源码!)

2.巩固 html,css(扒网站,或全部 down 下来,然后对应修改看效果)

评论区

分享你的想法,与大家交流讨论

Twikoo 加载失败

Twikoo 脚本加载失败