文章目录
1、什么是JavaScript
JavaScript 是一门世界上最流行的脚本语言
一个合格的后端人员,必须精通JavaScript
2、快速入门(忽略)
1. helloworld
js
// first.js
alert("hello world");
document.wirte("hello,world");
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>first 网页</title>
<!--常规写的地方在head 里面 或者 body的最下面 -->
<!-- 内部式-->
<script>
alert("hello1 world");
</script>
<!-- 引入外部式-->
<script src="first.js"></script>
</head>
<body>
</body>
</html>
2.浏览器使用须知
谷歌浏览器为例
3.变量的定义
任何的类型都用var 来声明变量
var a = 10;
alert(a);
var str = "abcdefg";
alert(str)
4.数据类型
此数据类型非彼数据类型
数据类型包括:数值,文本,图形,音频,视频…
number
js不区分小数和整数
123 //整数
123.1 // 浮点数
1.12e10 // 科学计数法
-100 // 负数
NaN // not a number 不是个数
Infinity // 表示无穷大
比较运算符
= //赋值
== //等于(值相等,类型可以不一样。1==‘1’结果为true
=== //绝对等于(值相等,类型也必须相等 1===‘1’ 结果为false 1===1 结果为true
注意:NaN == NaN 结果为false ,NaN与所有数值都不相等,包括自己
isNaN(NaN); 结果是true ,通过方法可以
浮点数问题:
console.log(1/3 == 1-(2/3));
> 结果为 :false
常用解决方法:
console.log(Math.abs(1/3- (1-2/3))<0.000001)
> 结果为true
null 和 defined
- null:空
- defined:未定义
数组
var arr =[1,2,3,null,'afa',true];
console.log(arr)
结果: (6) [1, 2, 3, null, "afa", true]
console.log(arr[2])
结果: 3
在js里没有数据下标越界,如果越界了,提示undefined
对象
var person = {
name:'吴彦祖',
age:18,
arr:[1,2,3,'彭于晏','谢霆锋',true,NaN]
}
console.log(person.name);
console.log(person.arr[3]);
java中:Person p = new Person(“吴彦祖”,18);
sout(p.name)
string
和java差不多,唯一的区别就是,js的单引号 和 双引号 都是指字符串。常常用于,外面用了双引号,里面就用单引号,或者反之。
boolean
和java一样
5.严格检查模式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>严格检查模式</title>
<script>
'use strict'; // 严格检查模式,为了预防由于JavaScript的随意性出现的问题,必须写在第一行 局部变量建议使用 let
let i = 10;
console.log(i);
</script>
</head>
<body>
</body>
</html>
3、数据类型(重要)
字符串
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板字符串</title>
<script>
'use strict';
<!-- java中字符串拼接-->
let str1 = 'hello';
let i = 1;
console.log(str1+'world今年'+i+'岁');
<!-- js6.0 的新特性 模板字符串拼接-->
let str2 = 'hello';
let x = 2;
let msg = `${str2} world , 今年${x}岁`
console.log(str1+'world今年'+x+'岁');
</script>
</head>
<body>
</body>
</html>
这里也可以使用方法 例如:subString(), indexof() 等等,基本上java中的在这里也能用
let student = 'student'; console.log(student.substring(1,2)) : t
数组
Array 可以包含任何类型的数据
var arr = [1,2,99.5,true,'abcd']
var arr2 = new array();
注意:js里数组长度可以发生改变,如果变长,则添加undefined 元素,如果变短,则已经赋值了元素就会丢失
变长:
var arr = [1,2,99.8,true,undefined,'abc',null,7];
arr.length = 10;
console.log(arr);
结果:[1, 2, 99.8, true, undefined, "abc", null, 7, empty × 2]
变短:
arr.length = 4;
arr; // 等价console.log(arr);
结果:[1, 2, 99.8, true]
变短之后,数据就丢失了,再变回去,就会变成空的值了(undefined)
方法 | 描述 |
---|---|
indexof() | 通过元素获得下标索引 |
slice() | 相当于字符串中的subString,截取数组 |
push() | 压入尾部(往尾部添加数据) ex:arr.push(‘a’,‘b’); |
pop() | 从尾部弹出(从末尾去掉一个数据)ex:arr.pop() |
unshift() | 压入到头部 |
shift() | 从头部弹出 |
sort() | 排序 |
concat() | 连接一个数组,返回一个新数组,但不会改变原来的数组 |
join() | 字符串连接 arr.join("-"); “1-2-abc-true–3-defg-abcdefg” |
reverse() | 元素反转,(逆序) |
对象
若干个键值对
对象初始化
var 对象名 = {
属性名:属性值,
属性名:属性值,
...
属性名:属性值
}
var person = {
name:"张三",
age:3,
email:"123456@qq.com"
}
使用一个不存在的对象属性,它是不会报错的
ex :person.id undefined
动态删减属性
,通过delete 删除对象的属性
delete person.email
> true
若这个对象没有email 属性,也不会报错
动态添加属性
直接给新的属性添加值即可
person.id = "123456789";
> "123456789"
判断属性值是否在这个对象中
所有的键都是字符串类型,值任意类型
'age' in person
true
// 继承
'toString' in person
true
判断一个属性是否是这个对象自身拥有的
hasOwnProperty()
person.hasOwnProperty('name')
> true
person.hasOwnProperty('toString')
> false
toString() 方法是继承过来的,所以他不是这个对象本想拥有的
for循环
普通for循环
(和java一样)
for(let i = 0;i<100;i++){
console.log(i);
}
forEach()循环
var arr = [12,46,1,464164,,46,415];
arr.forEach(function(value){
console.log(value);
})
for/in循环
用于遍历元素,
var arr = [12,46,1,464164,,46,415];
for(var index in arr){
console.log(arr[index])
}
map
和java也很类似
var map = new map(); // new 一个map
map.set('tom',18); // 添加
map.set('jerry',5);
map.get('jerry') // 根据键获取值
map.delete("tom") // 删除 (根据键删)
map.clean() // 删除全部
set
无序不重复的集合
var set = new Set();
set.add('1');
set.add(1); // 添加
set.delete(1); // 删除
set.has('33') // 是否有这个元素 返回Boolean
迭代器:iterator
es6 新特性 for of 直接取值
迭代数组
var arr = [12,45,'haha','xx'];
for(var v of arr){
console.log(v)
}
迭代Map
var map = new Map();
map.set('tom',12);
map.set('jerry',13);
map.set('marry',14);
for(var v of map){
console.log(v)
}
迭代Set
var set = new Set();
set.add(1);
set.add('2');
set.add('xx');
for(var v of set){
console.log(v)
}
函数
定义函数
定义方式一
// 定义一个绝对值函数
// 和java的区别 参数,不用定义
function abs(x){
if(x>=0){
return x;
}else {
return -x;
}
}
定义方式二
var abs = function(x){
if(x>=0){
return x;
}else {
return -x;
}
}
二者等价,看习惯
调用函数
abs(-10) --> 10 //正常传值
abs() -->NaN // 少传
abs(-1,-2,0) -->1 // 多传,依次匹配,就第一个有效
会发现,无论怎么传值都可以不会报错,但是这种随意性真是我们想要的吗?
下面手动去避免这种问题!
参数问题 --> 参数不存在
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
'use strict'; // 使用严格检查模式
function abs(x){
if (typeof x!=='number'){
throw "参数传递错误"
}
if (x>=0){
return x;
}else {
return -x;
}
}
</script>
</head>
<body>
</body>
</html>
结果:
abs(-1)
--> 1
abs()
--> Uncaught 参数传递错误
参数问题 --> 参数过多 (接收所有参数)
参数过多用 arguments 接收
arguments
是一个js免费赠送的关键字;
代表,传递进来的所有的参数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
'use strict'; // 使用严格检查模式
function abc(a){
for (let i = 0;i<arguments.length;i++){
console.log( "argument = "+arguments[i]);
}
}
abc(1,2,2,3,41,1);
</script>
</head>
<body>
</body>
</html>
参数问题 --> 参数过多 (只接受过多的参数)
ES6 新特性 …rest
- 获取除了已经定义的参数之外的所有参数
- 必须写在最后,(和java 一样)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
'use strict'; // 使用严格检查模式
function sum(a,b,...rest){ // ab 两个正常的参数,过多的参数由rest来装
if (rest.length==0){
return a*b; // 两个参数就相乘
}else{
let sum = a+b;
for (let lengthKey of rest) {
sum+=lengthKey; // 多个参数就相加
}
return sum;
}
}
</script>
</head>
<body>
</body>
</html>
变量的作用域
在js中,var 定义变量实际是有作用域的。
-
局部变量 只能在局部使用;若嵌套了则使用就近原则,内部和外部同名变量,优先使用近的。
-
js会自动提升变量的作用域,,但不会提升变量的赋值。为了规范,所有的定义写在函数的头部(C语言的写法),不要乱放,便于代码维护。
-
全局变量 全局函数 会绑定到window 对象上(多个js文件 的全局变量都会绑定到window上,还是会引起冲突,最好自己定义一个类似命名空间的东西。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
'use strict';
var old = window.alert; // 将函数赋值
window.alert("hh");
window.alert = function (){
} //将函数重新定义
alert("xx"); // 这个函数失效
old(123);
// window 相当于就是一个命名空间,alert 在window 命名空间下。
// 所以以后和别人一起写项目最好是自己也定一个命名空间
// 定义全局变量,所有全局变量,全局函数都可以放在这里
var xhb = {};
xhb.name="xhb";
</script>
</head>
<body>
</body>
</html>
常量
const PI = 3.14;
对象的方法
方法就是把函数放在对象的里面,对象只有两个东西:属性和方法
定义方法
<script>
'use strict';
var person = {
name:"xhb",
birthday :2001,
age:function (){
return new Date().getFullYear()-this.birthday;
}
}
console.log( person.age());
</script>
apply 可以指定对象
内部对象
标准对象
Date
<script>
let date = new Date();
console.log(date.getFullYear()+"年"); // 年
console.log(date.getMonth()+"月"); // 月 0-11
console.log(date.getDate()+"日"); // 日
console.log(date.getHours()+"时"); // 时
console.log(date.getMinutes()+"分"); // 分
console.log(date.getSeconds()+"秒"); // 秒
console.log("星期"+date.getDay()); // 星期几
console.log("时间戳"+date.getTime()); // 时间戳 1970--now ms
</script>
Json
Json 是什么?
https://baike.baidu.com/item/JSON/2462549?fr=aladdin
别问,问就是百度百科的
在JavaScript 一切皆为对象、任何js支持的类型都可以用json来表示:
格式:
- 对象都用{}
- 数组都用[]
- 所有的键值对,都是key:value
js 对象与 Json 字符串 的相互转换
<script>
//js对象
var xiaoming = {
name:"xiaoming",
age :18,
sex:"男"
}
// js对象转换为 json字符串
console.log( JSON.stringify(xiaoming));
// json 字符串转 js 对象
var xm = JSON.parse('{"name":"xiaoming","age":18,"sex":"男"}');
console.log(xm);
</script>
Ajax
- 原生的js写法 xhr 异步请求
- jQuery 封装好的方法
- axios 请求
面向对象编程
什么是面向对象?
- 类:模板
- 对象:具体的实例
类的定义
原型写法:
// 定义一个对象 小明
var xiaoming = {
name:"小明",
age:18,
study:function (){
console.log(this.name+"在学习");
}
};
// 定义一个对象 小红
var xiaohong = {
name:"小红",
age:19
}
// 小红的原型是小明 所以相当于继承的小明的属性和方法, 相同属性就会被重写,不同属性会继承
xiaohong.__proto__ = xiaoming;
console.log(xiaohong.study());
类的定义
// 定义一个类
class Person {
constructor(name){ // 构造方法
this.name = name;
}
eat(){ // 方法
alert(this.name + "在吃饭");
}
}
// 实例化一个对象
var xiaoming = new Person("小明");
xiaoming.eat();
类的继承
在ES6 引入的
// 定义一个学生类 继承 Person 类
class Student extends Person{
constructor(name,grade){ // 构造方法
super(name);
this.grade = grade;
}
study(){
alert(this.name+"在学习,今年读"+this.grade);
}
}
// 实例化一个对象
var xiaohong = new Student("小红","大一")
xiaohong.study();
xiaohong.eat();
操作BOM 对象(重点)
BOM:浏览器对象模型**(Browser Object Model (BOM))**
window
window 代表浏览器窗口
window.innerHeight
> 100
window.innerWidth
> 1255
window.outerHeight
> 100
window.outerWidth
> 1255
window.alert("hello world")
window.onload = function(){}; // 文档加载后的事件
方法名称 | 说 明 |
---|---|
prompt( ) | 显示可提示用户输入的对话框 |
alert( ) | 显示带有一个提示信息和一个确定按钮的警示框 |
confirm( ) | 显示一个带有提示信息、确定和取消按钮的对话框 |
close( ) | 关闭浏览器窗口 |
open( ) | 打开一个新的浏览器窗口,加载给定 URL 所指定的文档 |
setTimeout( ) | 在指定的毫秒数后调用函数或计算表达式 |
setInterval( ) | 按照指定的周期(以毫秒计)来调用函数或表达式 |
var interval = setInterval(function(){console.log(new Date())},1000); // 固定多久时间执行一次函数
clearInterval(interval) //清除
Navigator(不建议使用)
Nacigator 封装了浏览器的信息
大多数时候,我们不会使用navigator
对象, 因为会被人为修改!
navigator.appName
"Netscape"
navigator.appVersion
"5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Mobile Safari/537.36"
navigator.platform
"Win32"
// 可以略过了,不太重要的亚子
screen
代表屏幕尺寸
screen.width
> 1255
screen.height
> 277
screen.height
> 186
location(重要)
location 代表当前页面的URL信息
location = "http://bilibili.com";
location.href = "http://bilibili.com";
hostname: "localhost" // 主机名
href:"http://localhost:63342/JsStudy/com/xhb/testJs/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A12.html?_ijt=52liu50c9n8lrj4irsmitpnpiv" // 地址
protocol: "http:" // 协议
reload: ƒ reload() // 刷新
assign: ƒ assign() // 设置新的地址
document
document 代表当前的页面,HTML DOM文档树
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<dl id="haha">
<dd >first</dd>
<dd>second</dd>
<dd>third</dd>
</dl>
<script>
var d = document.getElementById('haha');
</script>
</body>
</html>
history(也不建议使用)
history :浏览器的历史记录
history.back() // 后退
history.forward(); // 前进
history.reload(); // 属性
操作DOM 对象(重点)
DOM:文档对象模型,
浏览器网页就是一个DOM 树形结构
- 更新DOM节点
- 遍历DOM节点:得到DOM节点
- 删除DOM节点
- 添加一个新的节点
要操作一个DOM节点,就必须先获得这个DOM节点
获取DOM节点
获取DOM节点
获取节点的常用方式:id , 标签名,类名,选择器
-
var name = document.getElementById('name');// 返回ID为'name'的节点:
-
var row = document.getElementsByTagName('tr'); // 获取所有的tr ,
-
var row = document.getElementsByClassName('red') // 获取所有类名是red的节点
-
var q1 = document.querySelector('#q1 div');// 通过querySelector获取ID为q1的第一个div节点:
-
var q1 = document.querySelectorAll('#q1 div');// 通过querySelector获取ID为q1的所有div节点:
参考:https://www.liaoxuefeng.com/wiki/1022910821149312/1023022310122752
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--标签选择器-->
<p> 这是一个段落</p>
<!-- id选择器-->
<div id="DIV" style="background-color:#f00;">
<p> 这是<span style="color: yellow">一个</span>div1</p>
<p> 这是一个div2</p>
<p> 这是一个div3</p>
</div>
<!--类选择器-->
<div class="DIV2" style="background-color:#0f0;">
<p> 这是一个div22</p>
</div>
<script>
// 刚好对应css 的选择器(标签选择器,id选择器,类选择器)
console.log(document.getElementsByTagName("p"));
console.log(document.getElementById("DIV"));
console.log(document.getElementsByClassName("DIV2"));
console.log(document.querySelectorAll("input[type=checkbox]")); // 选择器
var father = document.getElementById("DIV");
console.log(father.firstElementChild); // 第一个子节点
console.log( father.lastElementChild); // 最后一个子节点
console.log( father.nextElementSibling); // 下一个同级节点(father的同级)
console.log( father.firstElementChild.nextElementSibling); // 第二个子节点
</script>
</body>
</html>
这是原生代码,后面会用到jQuery
更新节点
更新节点
d1.innerText = "1"
//更新内容d1.innerHTML = "<a href='https:\\www.baidu.com'>百度</a> "
//更新网页d1.style.color='yellow'
// 更新cssd1.style.fontSize='22px'
// 更新css 注意:这里使用驼峰命名,不是css的 斜杠(font-size)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM更新节点</title>
</head>
<body>
<div id="div1" style="background-color:#0f0;">
<p>这是一个段落1</p>
<p>这是一个段落2</p>
<p>这是一个段落3</p>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</div>
<script>
var d1 = document.getElementById("div1");
// d1.innerText = "1" //更新这个id选择器下的所有内容(覆盖)
d1.innerHTML = "<a href='https:\\www.baidu.com'>百度</a> " //更新这个id选择器下的所有网页,css样式
</script>
</body>
</html>
删除节点
步骤:
- 先获取父节点
- 通过父节点删除自己
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id = "div1">
<p id = "p1" >1</p>
<p id = "p2">2</p>
<p id = "p3">3</p>
</div>
<script>
var self = document.getElementById("p1"); // 获取自己的节点
var father = self.parentElement; // 获取父节点
father.removeChild(self); // 通过父节点删除自己
//遍历 删除所有节点 删除是动态删除的,删除一个长度减一,元素往前推
var length = father.children.length;
for (let i = 0; i < length; i++) {
console.log(father.children[0] );
father.removeChild(father.children[0]);
}
</script>
</body>
</html>
注意:删除多个节点的时候,是动态删除的(下标会改变)
插入节点
- 追加到最后面(append appendChild)
- 在某个节点的前面插入(insertBefore)
如果某个DOM节点是空的,我们可以通过innerHTML就可以增加一个元素,如果不是空的,就会出现覆盖了,
追加到最后面
已存在的节点追加(移动)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p id="outter">outter</p> // 已经存在的节点
<div id="div1">
<p id="p1">1</p>
<p id="p2">2</p>
<p id="p3">3</p>
</div>
<script>
var e = document.getElementById("outter");
document.getElementById("div1").append(e); //追加到div下面,原来的会消失
</script>
</body>
</html>
不存在的节点追加(新建节点追加)
<script>
// 插入标签
var newp = document.createElement("p");
newp.innerText = "haha";
newp.id = 'p1';
document.getElementById("div1").appendChild(newp);
// 插入带属性的标签
var newa = document.createElement('a');
newa.innerText = "百度";
newa.setAttribute("href","http://www.baidu.com");
newa.setAttribute("target","_blank");
document.getElementById("div1").appendChild(newa);
// 在head 标签 插入style 标签 来改变css样式
var head = document.getElementsByTagName('head'); // 获取head标签 (是个数组)
var style = document.createElement('style'); // 创建style 标签
head[0].appendChild(style); // head 里 添加子节点 类 、标签选择器都是返回数组(所以这里是head[0],因为有多个,而id是唯一的,就是固定的值
style.innerHTML = " body{ background-color :#0f0;} " // 给style标签写代码
- 在某个节点的前面插入
insertBefore(newNode,targetNode)
<script>
var newNode = document.createElement('p'); // 新节点
newNode.innerText = "isertbefore_newP";
document.getElementById("div1").insertBefore(newNode,document.getElementById("p2"));
</script>
操作表单(重点)
获取表单内容。。。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form>
用户名:<input type="text" id ="userName" >
密码:<input type="password" id ="pWord" >
<br>
<span>性别:</span>
<input type="radio" name="sex" id="man">男
<input type="radio" name="sex" id="woman">女
</form>
<script>
var userName = document.getElementById('userName');
var passWord = document.getElementById('pWord');
var man = document.getElementById('man');
var women = document.getElementById('woman');
</script>
</body>
</html>
提交表单(MD5 加密)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>提交表单</title>
<!-- MD5 工具类-->
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>
</head>
<body>
<form action="#" method="post" onsubmit=" return check()">
<p>
<span>用户名:</span> <input type='text' placeholder="123456" id="userName" name="username"><br>
</p>
<p>
<span>密码:</span> <input type='password' id="passWord" >
<input type="hidden" name = "password_md5" id = "password_md5"> <!--隐藏 -->
</p>
<input type="submit" >
</form>
</body>
<script>
function check(){
var userName = document.getElementById("userName");
var passWord = document.getElementById("passWord");
var md5_password = document.getElementById("password_md5");// 获取隐藏框
console.log("账号:"+userName.value);
console.log("密码:"+passWord.value);
md5_password.value = md5(passWord); // 隐藏框的值 是密码框的MD5 加密之后的,然后提交
//优化了直接在密码框进行md5加密时一瞬间有很长的密码
return true;
}
</script>
</html>
jQuery
获取jQuery
- 官网(jQuery.com)下载
- cdn 在线引入
cdn :直接复制script 标签
jQuery 初体验
公式:$(选择器).事件(事件函数)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="lib/jquery-3.6.0.js"></script>
<!-- cdn的方式-->
<!-- <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> -->
</head>
<body>
<a href="#" id="a1">点我</a>
<script>
$('#a1').click(function (){
alert("h");
});
</script>
</body>
</html>
文档工具站:https://jquery.cuishifeng.cn/index.html
jQuery ready() 与 onload() 区别
$(function(){alert('hh')});
$(document).ready( function (){alert("xx")});
window.onload = function(){ alert("hehe")};//在实现效果上差不多
选择器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="lib/jquery-3.6.0.js"></script>
<!-- cdn的方式-->
<!-- <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script> -->
</head>
<body>
<a href="#" id="a1">点我</a>
<p id="p1" name="p1">1</p>
<p class="p2" name="p2">2</p>
<p name="p3">3</p>
<script>
$('#a1').click(function (){
alert("h");
});
// 原生js
var p1 = document.getElementById('p1');
var p2 = document.getElementsByClassName('p2');
var p3 = document.getElementsByTagName('p');
// jQuery
$('#p1').click(show);
$('.p2').click(show);
$('p').click(show);
function show(){
alert("hh"+this.name);
}
</script>
</body>
</html>
事件
https://www.w3school.com.cn/jsref/dom_obj_event.asp :DOM 事件全集
鼠标事件,键盘事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src = "lib/jquery-3.6.0.js"></script>
<style>
div {
width: 500px;
height: 500px;
border: 1px solid red;
}
</style>
</head>
<body>
<span id="showMousePosition"></span>
<div id ="mouseArea">
</div>
<script>
$('#mouseArea').mousemove(function (e){
$('#showMousePosition').text("x:"+e.pageX+"y:"+e.pageY);
});
</script>
</body>
</html>