JS 笔记
发布于 2026-04-06更新于 2026-11-143608 字32 分钟 · 阅读时间
2023-9-28 ~ 2023-10-5
2024-12-4 ~ 2024- 2025-5-5最后编辑
JavaScropt 是一门世界上最流行的脚本语言
他和 Java 没什么关系,主要是蹭热度
它只用 10 天开发出来
一个合格的程序员,必须要精通 JavaScript
脚本语言通常通过解释器逐行解释执行,而不是先编译成机器代码
ECMAScript 是 JavaScript 的一个标准
最新版本已经到六了,但大多数浏览器只支持到五
导致:开发环境到线上环境不一样,要用应用转换
1.内部标签直接写
<script> //...... /*......*/</script>2.外部引入
abc.js
//......text.html
<script src="abc.js"></script><!--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>浏览器必备调试须知:

数值、文本、图形、音频、视频……
const 块级作用域的常量 (优先使用)
let 块级作用域的变量
var 全局变量/函数作用域的变量(不推荐)
const NUM_1 = 1; // 常量常用大写字母和下划线`_`let 成绩 = 71; // 国际化常用数字、字母和`$`和`_`var myName = "sakurakugu"; // 常用小写开头的驼峰命名法alert(num); // 弹窗“num”var 原神 = "启动";var 璃月 = ["甘雨", "胡桃"];JS 不区分浮点数与整数,Number
注:NaN ** 0 结果为 1 ( x0=1(当x=0时) ,指数规则覆盖了传播规则
/*在控制台中*/ 123; //整数123.45; //浮点数1.123e3 - //科学计数法 (在控制台中输出的是1123) 99; //负数NaN; //not a number(不是一个数字/无效数字)Infinity - //无限大 Infinity; //无限小大整数
BigInt 类型
// 尾部的 "n" 表示这是一个 BigInt 类型const 大整数 = 1234567890123456789012345678901234567890n;'abc' "abc" '\n' "\n" //js中不区分单双引号,它们都是简单引用// d反引号是 功能扩展 引号。它们允许我们通过将变量和表达式包装在 ${…} 中,来将它们嵌入到字符串中。例如: let name = "John";// 嵌入一个变量alert(`Hello, ${name}!`); // Hello, John!// 嵌入一个表达式 (注:${…} 内的表达式会被计算)alert(`the result is ${1 + 2}`); // the result is 3true false&& //两个都为真|| //一个为真,结果为真! //真即假,假即真= //赋值== //是否等于 (类型可以不一样,但值一样,为真 (如:1与'1')为真)=== //是否绝对等于 (类型、值都要一样,才为真 (如:1与'1'为假)) /*因此常用绝对等于符号*/为了保证严谨性,最好少用 “ == ”,多用 “ === ”
须知:
浮点数问题:
console.log(1 / 3 === 1 - 2 / 3);浮点数可能会有精度的损失,当然,和 C++一样,
但如果要判断上述的式子,可以用:
console.log(Math.abs(1 / 3 === 1 - 2 / 3) < 0.0000000000001);//通过判断它的绝对值是否小于一个极小的数,可以近似判断它们相等Symbol 是 JavaScript 中的一种特殊的基本类型,它和数字 (Number) 和字符串 (String) 不相关,也不隶属于它们。Symbol 的主要特点是生成唯一的值,通常用来作为对象(Object)的键。
因此可以避免对象属性被意外覆盖/属性名冲突或作为元编程工具。
元编程(Meta-Programming)是指编写能够操作或生成代码的代码
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 是一种引用类型,用于存储键值对,表示一组属性和方法
常用于存储复杂的数据结构,如对象、数组、函数等
对象用大括号,数组用中括号
/*每个属性之间用逗号隔开,最后一个可以不用加逗号*//*可类比C++的class(类)或结构体(用class类比更精确一些)*/let person = { name: "sakurakugu", age: 16, tags: ["meishaonv", "kawaii", "……"],};如何打印:
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'这个数组属于对象类型
let arr = [1, 2, 3, 4, 5, "hello", "world", null, true];//JS的数组本质是哈希表,上面的写法只是语法糖而已 //用对象定义数组new array(1, 2, 34, "hello", "world"); //定义一个array数组但是,为了保证代码的可读性,最好用上述中括号的定义方法
如何打印:
console.log(arr[3]);//如果越界了,就会输出undefined用于返回参数的类型
typeof 是一个操作符,不是一个函数,typeof(x) 本质是 typeof (x)
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中隶属于对象类型//全局变量i = 1;//局部变量var i = 1; //但在ES6中,局部变量常在let中定义(之后学)(let更像C++的了)在 script 块的最开头加上一个字符串 'use strict'; 则开启严格检查模式
在严格检查模式下,中文,var 等等都会被严格检查
<script> 'use strict'; …… ……</script>1.正常字符串,我们使用单引号或者双引号包裹
2.注意用转义字符打出那些打不出的字符
\n 回车,换行\' 单引号\t Tab键\u4e2d \u#### Unicode字符\x41 \x## ASCll字符3.多行字符串编写
/*用飘号的那个引号(反引号)*/var msg=`123 456 789`; msg -->'123\n 456\n 789' console.log(msg) -->123 456 7894.模板字符串
let name="sakurakugu";let age=3;let msg1=`你好呀,${name}${age}`; console.log(msg1) -->你好呀,sakurakugu3上述的那个 msg1 就是模板字符串,就像一个模板一样,中间可以填空
5.字符串长度
var student="student"; console.log(student.length) --> 7console.log(student[0]) --> s6.字符串的可变性:不可变的
7.大小写转换(输出纯大写/纯小写)
console.log(student.toUpperCase()) --> STUDENTconsole.log(ab.toLowerCase()) --> student//仅仅是输出,不改变原值8.获取第一个字符出现的序列
//获取“t”第一次出现的i(a[i]的i)(从0开始)console.log(student.indexOf('t')) --> 1 9.截取并输出
console.log(student.substring(2)) --> udent//从“2”开始,到结尾console.log(student.substring(2,4)) --> ud//包含前面,不包含后面 [ , )Array 可以包含任意的数据类型
var arr = [1, 2, 3, 4, "1", "2"];1.长度
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] --> 122.indexOf 通过元素获得下标索引
arr.indexOf('2') --> 5//注意:字符“2”,与数字2不同3.slice()
可以截取数组的一部分,返回一个新数组
arr.slice(1) --> (5) [2, 3, 4, '1', '2']arr.slice(1,5) --> (4) [2, 3, 4, '1']4.push()/pop() 尾部
//压入到尾部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() 头部
//压入到头部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() 排序
arr --> (8) ['a', 'b', 1, 2, 3, 4, '1', '2']arr.sort() --> [1, '1', 2, '2', 3, 4, 'a', 'b']7.reverse() 元素反转
//就是元素反过来重新排序var arr=[1,2,3,4,"1",'2'];arr.reverse() --> (6) ['2', '1', 4, 3, 2, 1]8.concat() 添加
//在数组后面加上要加的字符,然后返回一个新数组//并没有更改原数组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
//使用特定的字符连接数组,并打印拼接后的这个新数组arr.join('-') --> '1-2-3-4-5-6'arr.join("ooo") --> '1ooo2ooo3ooo4ooo5ooo6'10.多维数组
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'若干个键值对
//如:var person = { name: "John", age: 30, gender: "male",};//name、age、gender是键(key),冒号后面的是值(value)//99%的键都是字符串,而值是任意对象var 对象名 = { 关键字:对应值, (属性名:属性值) 关键字:对应值, 关键字:对应值, 关键字:对应值}如上定义了 person 对象,它有三个属性
js 中的对象,以{……}表示一个对象,键值对描述属性 xxx: xxx,多个属性之间使用逗号隔开,最后一个属性不加逗号
1.对象赋值
person.name='sakurakugu' --> 'sakurakugu'person.name --> 'sakurakugu'2.使用一个不存在的对象属性,不会报错! undefined
person.haha-- > undefined;3.动态的删减属性,通过 delete 删除对象的属性
delete --> person.nametrueperson --> {age: 30, gender: 'male'}4.动态的添加属性,直接给新的属性添加值即可
person.haha='haha' --> 'haha'person --> {age: 30, gender: 'male', haha: 'haha'}5.判断属性值是否在这个对象中 ‘xxx’ in xxx
"age" in person-- > true;6.判断一个属性是否是这个对象自身拥有的 hasOwnProperty()
person.hasOwnProperty('toString') --> falseperson.hasOwnProperty('age') --> trueif…… else…… 表判断
var arr = 3;if (arr > 3) { alert("haha");} else { alert("kuwa~");}while 循环/do……while 循环
while (arr < 100) { arr += 1; console.log(arr);}///////////////////////do { arr += 1; console.log(arr);} while (arr < 100);for 循环
//可以通过输入“fori”+“回车”来快速的输入for (let i = 0; i < 100; i++) { console.log(i);}forEach 循环
var arr = [12, 123, 2, 3, 4, 1, 234, 5, 31, 234, 23];//自带的函数arr.forEach(function (value) { console.log(value);}); //循环遍历这个数组的每一个元素for……in 循环
//和上面一样,用于循环数组中每一个元素,并打印var arr = [12, 123, 2, 3, 4, 1, 234, 5, 31, 234, 23]; for (var num in arr) { console.log(arr[num]);}ES6 的新特性
Map:(词典)
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"); //删除tomSet:(无序不重复的集合)
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)ES6 的新特性
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 的
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);}又可叫方法
如绝对值函数
定义方式一
function abs(x){ if(x>=0){} else{x=-x;} return x;} abs(10) --> 10abs(-10) --> 10定义方式二
var abs = function (x) { if (x >= 0) { } else { x = -x; } return x;};fonction(x){……} 这是一个匿名函数,但是可以把结果赋值给 abs,然后通过 abs 就可以调用函数
方式一和方式二等价,sakurakugu 推荐使用第一种
调用函数
abs(10) --> 10abs(-10) --> 10参数问题:js 可以传递任意个参数,比如对于上面的 abs 来说可以是 0 个,也可以是多个,当然,只有 return 的传回来了
如果参数不存在,可以手动抛出异常
function abs(x) { //手动抛出异常 if (typeof x !== "number") { //如果x不为数字 throw "没有数字 not a number"; } if (x >= 0) { } else { x = -x; } return x;}arguments
arguments是一个 js 免费赠送的一个关键词
代表,传递进来的所有的参数,是一个数组
rest
获取除了已经定义的参数之外的所有参数
如下
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 参数只能写在最后面,必须用 “...” 标识。
在 js 中,var 定义的变量事实上是有作用域的。
假设在函数体中声明,则在函数体外不可以使用~(非要想实现,可以研究一下闭包)
var 就两种情况,“全局”和“函数内”
规范 1
因为 js 都会把变量的定义(只是 var)提前到开头(全局开头/函数开头)(这里的提前只是告诉代码有这个变量,打印的话,会抛出未定义的),但赋值不会,所有为了规范,最好将定义统一放在开头
var x = 1;y = x + 1;z, i, a;全局对象 window
var x = "xxx";alert(x);alert(window.x); //默认所有的全局变量,都会自动绑定在window对象下(如这里的x)//像是这里的alert也是,可以写成window。alertjs 实际上只有一个全局作用域。
任何变量(函数在这也可以视为变量)假设没有在函数的作用人、范围内找到,就会向外查找,如果在全局作用域(window)下也没有找到,就会报错
规范 2
由于我们所有的全局变量都会绑定到我们的 window 上,如果不同的 js 文件,使用了相同的全局变量,就会冲突
减少冲突:
//先定义一个空对象var Suakura = {}; //再定义全局变量(再将属性和方法放入对象中)Sakura.name = "aaa";Sakura.add = function (a, b) { return a + b;};通过这种方法,可以降低全局命名冲突的问题
jQuery 也是这么干的,但为了简化书写,用$符号当作 jQuery 的简化符号
局部作用域 let
就是和 C++一样,是块级“{ }”作用域;
建议使用这个,用法和 var 一样
let a = 1;常量 const
常量建议都使用大写字母
const PI = 3.14;//不知道为什么,数字部分加了引号也能算出正确的结果方法就是把函数放到对象里面,对象只有两个东西:属性和方法
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 的指向
标准对象
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'…………基本使用
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开始到现在的毫秒数转换
new Date(1696242744325); //时间戳转为当前时间now.toLocaleDateString(); //转换本地时间格式("2023/10/2");now.toLocaleString(); //同上("2023/10/2 18:36:59");早期,所有的数据传输习惯使用 XML 文件,不太好用
在 js 中,一切皆为对象,任何 js 支持的类型都可以用 json 表示
格式:
js 对象与 json 字符串之间的转换
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);//输出结果:{name: 'sakurakugu', age: 999, sex: 'nan'} //可展开{"name":"sakurakugu","age":999,"sex":"nan"}//不可展开{name: 'sakurakugu', age: 999, sex: 'nan'} //可展开js 对象与 json 字符串的区别:
如上输出的结果,name,age 等都变成了字符串
Ajax(Asynchronous JavaScript and XML)是一种用于在网页上进行异步通信的技术。
它结合了多种现有的 Web 技术,包括 JavaScript、XML、HTML 和 CSS
用于在不刷新整个页面的情况下与服务器进行数据交互。
有原生的 js 写法,xhr 异步请求
或 jQuey 封装好的方法 $("#name").ajax("")
axios 请求 (专门用来做请求的)
js,java,c++,c#……都是面向对象的语言,但是 js 有些区别
类:模板(名字)
对象:实例(小明,小红……)
类是对象的抽象,对象是类的具体表现
原型对象
一种继承方式(
__proto__)
let user = { name: "sakurakugu", age: 999, sex: "nan",}; let xiaoming = { name: "xianming",}; //原型(小明继承了user的原型)xiaoming.__proto__ = user;class 对象
class 继承
//定义一个类class Student { constructor(name) { this.name = name; } hello() { alert("hello"); }} //将两个对象放进去let xiaoming = new Student("xiaoming");let xiaohong = new Student("xiaohong");本质:查看对象原型
//类之间继承class xiao_xuesheng extends Student {}原型链
__proto__
浏览器介绍
js 和浏览器的关系?
js 的但是就是为了能够在浏览器中运行
B:浏览器
BOM:浏览器对象模型
window
window 代表 浏览器窗口
window.alert(1);undefined;window.innerHeight;679;window.innerWidth;1048;window.outerHeight;1026;window.outerWidth;849;//自己去试试就知道了navigator
navigator 它封装了浏览器的信息
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
screen.width;1707(px);screen.height;1067(px);location
location 代表当前页面的 URL 信息
host: "www.baidu.com"href: "https://www.baidu.com/"protocol: "https:"reload: ƒ reload() //刷新网页//设置新的地址location.assign(新地址)document
document 代表当前页面,HTML DOM 文档树
document.title;("百度一下,你就知道");document.title = "aaa";("aaa");获取具体的文档树节点
<dl id="app"> <dt>java</dt> <dd>javase</dd> <dd>javaee</dd></dl> <script> let dl = dpcument.getElementById("app");</script>获取当前网页的 cookie
document.cookie;("3AB9D23F7A4B3C9B=EQCXVYPQBN5RK4W25JHHSOGBJNVDSHBI2GYWZUNCB27TTDWGDHWKWW7EES4GXILNYNOAQZLBUQ3YKHBFZK5OQ6TWZE; Hm_lvt_affdf09dddabcdf2d681acefa474b973=1694878902");history
//history 代表浏览器的历史记录history.back(); //后退history.forward(); //前进//也不建议使用DOM:文档对象模型
核心
浏览器网页就是一个 Dom 树形结构!
更新:更新 Dom 节点
遍历 dom 节点:得到 dom 节点
删除:删除一个 dom 节点
添加:添加一个新的节点
要操着一个 dom 节点,就必须要先获得这个 dom 节点
获得 dom 节点
//可对应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"修改文本的值为 123id1.innerHTML="<strong>123</strong>"修改成加粗的 123操作 css
id1.style.color="red";修改文本为红色(属性要使用字符串包裹)
id1.style.fontSize='20px';修改字体大小为 20 像素(这是命名问题,将下划线转成了大写字母)
id1.style.padding="2em"修改边框为 2 个字大小
删除节点
步骤,先获取父节点,在通过父节点删除自己
father.removeChild(p1) 删除 p1<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 节点已经存在元素了,我们就不能这么干了,因为会覆盖
所有一般用追加的方法
<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>创建一个新的标签,并插入
<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
let ee = document.getElementById("ee");let js = document.getElementById("js");let list = document.getElementById("list");//insertBefore(newNode,targetNode) 将新节点插入到目标节点前面list.insertBefore(js, ee);表单是什么 form DOM 树
<text><password><select><radio><cheakbox><hidden>表单的目的:提交信息
获得要提交的信息
//得到输入框的值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; //说明男被选中提交表单
<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>js 和 jQuery 库
jQuery 库,里面存在大量的 js 函数
获取 jQuery

jquery.com
或者像之前那样,用在线的 cdn
如何使用
<!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>选择器
<script> //原生的js,选择器少,麻烦不好记 //标签 document.getElementsByTagName(); //id document.getElementById(); //类 document.getElementsByClassName(); //jQuery css中的选择器,它都可以用 $("p").click(); //标签选择器 $("#id1").click(); //id选择器 $(".class1").click(); //class选择器</script>事件
鼠标事件,键盘事件,其他事件

<!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 元素
节点文本操作
$("#text-ul li[name=python]").text(); //获得值("Python");//将文本改成了11234$("#text-ul li[name=python]").text("11234"); //设置值css 的操作
$("#text-ul li[name=python]").css("color", "red"); //变红元素的显示和隐藏 本质:display:none;
$("#text-ul li[name=python]").show(); //显示文本$("#text-ul li[name=python]").hide(); //隐藏文本未来的 ajax();
小技巧
1.如何巩固 js(看 jquery 源码,看游戏源码!)
2.巩固 html,css(扒网站,或全部 down 下来,然后对应修改看效果)
分享你的想法,与大家交流讨论
Twikoo 加载失败
Twikoo 脚本加载失败