JS事件
DOM0级绑定事件方法
元素 . on+事件名称 = 函数
- 相当于给一个元素的属性赋值,只能赋一个值,后面如果再赋值就会覆盖前面的值,所以说DOM0级事件只可以绑定一次,如果绑定多次,后面的会把前面的给覆盖了,因为是一个赋值的过程,一个属性只能赋一个值
失去和获取焦点事件
-
focus
获取焦点事件 -
blur
失去焦点事件 -
练习:模拟placeholder
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>事件</title> </head> <body> <!-- 模拟一个表单输入内容提示--> <input type="text" value="请输入电话号码" id="tel"> <script> /* 模拟placeholder 当用户单击表单开始输入时 表单内容为空 当用户没有输入 或者刚刷新页面的时候,表单提示为“请输入你的电话号码” 1、获取焦点事件 2、判断 当表单内是“请输入电话号码”的时候,清空value值 让用户开始输入 3、书写失去焦点事件 4、判断 表单内的值是空(也就是用户没有输入任何内容的时候) 把提示重新书写进入 */ var oTel = document.getElementById("tel"); // 1、获取焦点事件 oTel.onfocus = function () { // 2、判断 当表单内是“请输入电话号码”的时候,清空value值 让用户开始输入 if(oTel.value == "请输入电话号码"){ // 清空value值 oTel.value = ""; } } // 3、书写失去焦点事件 oTel.onblur = function () { // 4、判断 表单内的值是空(也就是用户没有输入任何内容的时候) 把提示重新书写进入 if(oTel.value == ""){ // 把提示重新书写进入 oTel.value = "请输入电话号码"; } } </script> </body> </html>
点击事件
- click:鼠标点击事件
- contextmenu:鼠标右键事件
- ondblclick:鼠标双击事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>点击事件</title>
<style>
#box{
width: 300px;
height: 200px;
background: pink;
}
</style>
</head>
<body>
<div id="box">我是box</div>
<script>
var oBox = document.getElementById("box");
// 当在一个元素上按下鼠标 并又抬起的时候 才会触发click事件
//右键也可能触发,但是右键的点击有专门的的事件 oncontextmenu
oBox.onclick = function () {
// alert(1);
}
// 右键事件 按下 并抬起的时候 弹出
oBox.oncontextmenu=function(){
alert(2);
//取消默认右键的菜单弹出 取消默认事件 写在最后
return false;
}
//双击事件
oBox.ondblclick = function () {
alert("用户双击");
}
</script>
</body>
</html>
-
练习:点击循环变色
<!-- 方法1 --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>点击事件</title> <style> #box{ width: 300px; height: 200px; background: pink; } </style> </head> <body> <div id="box">我是box</div> <script> /* * 效果要求: * 用户点击box 第一次点击变成红色背景 第二次变成粉色 。。。依次循环(开关的思想) * (开关的思想) 定义一个变量 保存当前的状态 然后每次点击后 判断 并把开关给改变了 * 1、绑定点击事件 * 2、定义一个开关 保存当前的状态 * 3、事件发生后,判断当前的状态,如果是粉色则 变红 如果是红色 则变粉 * 4、改变完成以后,改变开关的状态 */ var oBox = document.getElementById("box"); // 2、定义一个开关 保存当前的状态 var flag = true;//我们自定义,当flag为true的时候 说明现在是粉色 那么为false就是红色 // 1、绑定点击事件 oBox.onclick = function () { // 3、事件发生后,判断当前的状态,如果是粉色则 变红 如果是红色 则变粉 if (flag){ oBox.style.backgroundColor = "red"; // 改变完成以后,改变开关的状态(简写在下边) // flag = false; }else{ oBox.style.backgroundColor = "pink"; // 改变完成以后,改变开关的状态(简写在下边) // flag = true; } // 每次点击完都让flag取反就可以 不用再判断中依次书写 flag = ! flag; } </script> </body> </html>
<!-- 方法2 --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>点击事件</title> <style> #box{ width: 300px; height: 200px; background: pink; } </style> </head> <body> <div id="box">我是box</div> <script> /* * 效果要求: * 用户点击box 第一次点击变成红色背景 第二次变成粉色 。。。 * 取余运算的方法(定义一个变量,给一个初始值。每次点击都让这个变量累加 每次点击的让变量对2取余(因为目前效果是两种状态)来判断当前该显示什么颜色) * 1、绑定点击事件 * 2、定义一个累加器 保存当前的状态 * 3、事件发生后,判断当前的状态,如果是粉色则 变红 如果是红色 则变粉 * 4、改变完成以后,改变开关的状态 */ var oBox = document.getElementById("box"); // 2、定义一个累加器 保存当前的状态 var num = 0;//每次点击都让这个变量累加 每次点击的让变量对2取余来判断 // 1、绑定点击事件 oBox.onclick = function () { // 3、事件发生后,判断当前的状态,如果是粉色则 变红 如果是红色 则变粉 // 如果余0 那么代表是默认粉色 if (num % 2 == 0){ oBox.style.backgroundColor = "red"; }else{ oBox.style.backgroundColor = "pink"; } // 改变完成以后,改变开关的状态 num ++; } </script> </body> </html>
键盘事件
-
onkeydown:键盘按下
-
onkeyup:键盘抬起
-
练习:检测剩余字数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>检测剩余字数</title> <style> textarea{ border: 1px solid #ccc; outline: none; } </style> </head> <body> <textarea id="text" cols="30" rows="10" ></textarea> <p>还剩余 <span id="reduce">100</span> 个字</p> <script> /* * 用户在表单中输入内容,剩余字数减少, * 当剩余字数减少到负数的时候 把提示字数变成红色 * * 1、获取标签 * 2、书写键盘抬起事件 当抬起的时候 去计算剩余字数 * 3、获取表单输入的长度 * 4、计算剩余的字数是多少 * 5、把计算好的剩余字数给到 reduce标签中 * 6、检测剩余字数 小于0的时候,让标签变红 并且让textarea的边框变红 * 7、当用户把字数重新减小,然后样式变成正常 */ // 1、获取标签 var oReduce = document.getElementById("reduce"); var oText = document.getElementById("text"); // 2、书写键盘抬起事件 当抬起的时候 去计算剩余字数 oText.onkeyup = function () { // 3、获取表单输入的长度 var oTextLen = oText.value.length; // console.log(oTextLen); // 4、计算剩余的字数是多少 var reduceTextNum = 100 - oTextLen; // 5、把计算好的剩余字数给到 reduce标签中 oReduce.innerHTML = reduceTextNum; // 6、检测剩余字数 小于0的时候,让标签变红 并且让textarea的边框变红 if (reduceTextNum < 0){ oReduce.style.color = "red"; oText.style.border = "1px solid red"; }else{ // 7、当用户把字数重新减小,然后样式变成正常 oReduce.style.color = "#000"; oText.style.border = "1px solid #ccc"; } } </script> </body> </html>
表单事件
-
input:当表单内容改变时触发
-
change:当表单内容改变并且失去焦点时候触发
-
练习:
模拟数据双向绑定
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>input和change事件</title> </head> <body> <input type="text" id="ipt"> <br> <span id="text"></span> <script> /* * 模拟 数据双向绑定效果 * 当用户在input中输入内容的时候 span中的内容跟着改变 * * 1、获取标签 * 2、绑定事件 当用户输入的时候触发 * oninput事件-->表单内容只要发生改变就会实时触发 * onchange事件 -->失去焦点 并且表单内容发生改变 才会触发 * 3、获取输入的内容 并赋值给text */ // 1、获取标签 var oIpt = document.getElementById("ipt"); var oText = document.getElementById("text"); // 2、绑定事件 当用户输入的时候触发 oIpt.oninput = function () { // 3、获取输入的内容 并赋值给text oText.innerHTML = oIpt.value; } </script> </body> </html>
鼠标事件
-
mousedown:鼠标按下
-
mouseup:鼠标抬起
-
练习:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>按下抬起事件</title> <style> #box{ width: 200px; height: 200px; background: red; } </style> </head> <body> <div id="box"> </div> <script> /* * 鼠标在元素上 按下 元素变成黄色 抬起 变成红色 * onmousedown 鼠标按下事件 * onmouseup 鼠标抬起事件 */ var oBox = document.getElementById("box"); oBox.onmousedown = function () { oBox.style.backgroundColor = "yellow"; } oBox.onmouseup = function () { oBox.style.backgroundColor = "red"; } </script> </body> </html>
-
mousemove:鼠标移动
-
mouseover:鼠标移入(可以触发事件的冒泡)
-
mouseout:鼠标移出(可以触发事件的冒泡)
-
mouseenter:鼠标移入(不会触发事件的冒泡)
-
mouseleave:鼠标移出(不会触发事件的冒泡)
-
练习:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>鼠标移入移出事件</title> <style> #box{ width: 300px; height: 300px; background: #2ba5eb; overflow: hidden; } #box p{ background: #1eff0a; color: #fff; text-align: center; height: 100px; line-height: 100px; } </style> </head> <body> <div id="box"> <p>我是第一个p标签</p> <p>我是第二个p标签</p> </div> <script> /* * 当鼠标移入box 让box 颜色发生变化 移出再还原 , 只要鼠标在元素中移动 就一直打印 欢迎光临 * * onmouseover 和 onmouseout 可以触发事件的冒泡(旧的,大多数时候不适用) * onmouseenter 和 onmouseleave 不会触发事件的冒泡 新的 兼容性良好 * * onmousemove -->鼠标移动事件 (实时触发 只要移动就会触发) */ /*var oBox = document.getElementById("box"); oBox.onmouseover = function(){ console.log("进去"); oBox.style.backgroundColor = "red"; } oBox.onmouseout = function () { console.log("出来"); oBox.style.backgroundColor = "#2ba5eb"; }*/ var oBox = document.getElementById("box"); oBox.onmouseenter = function(){ console.log("进去"); oBox.style.backgroundColor = "red"; } oBox.onmouseleave = function () { console.log("出来"); oBox.style.backgroundColor = "#2ba5eb"; } oBox.onmousemove = function () { console.log("欢迎光临"); } </script> </body> </html>
滚动条事件
-
onscroll 事件在元素滚动条在滚动时触发。
-
练习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>onscroll</title> <style> #outer{ width: 400px; height: 300px; border:1px solid #000; overflow: scroll; } #con{ width: 800px; height: 1000px; } </style> <script> window.onload = function () { // onscroll是滚动条滚动即执行 var oOuter = document.getElementById("outer"); var oCon = document.getElementById("con"); oOuter.onscroll = function () { console.log(Date.now());//只要在滚动 那么每次间隔最小可能是十几毫秒 甚至2毫秒 所以onscroll事件执行特别的频繁 console.log("我滚了 再见"); } } </script> </head> <body> <div id="outer"> <div id="con"> 今天天气真好 <br> * 100 </div> </div> </body> </html>
常见window事件
onload事件
onload 事件会在页面或图像加载完成后立即发生
-
window.onload事件:当整个文档内容(DOM节点+所需要的资源(音频、视频、图片、程序等等))全部加载完毕,才会执行
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>window.onload</title> <script> // js是可以放在这个位置的, // 但是在这个位置的js 直接获取元素是会获取不到的 因为代码还没有运行到DOM节点 /* var oBox = document.getElementById("box"); oBox.style.backgroundColor = "red";*/ // 解决方法:添加window.onload window.onload = function () { var oBox = document.getElementById("box"); oBox.style.backgroundColor = "red"; } </script> </head> <body> <div id="box">我是box</div> <img src="../images/01.jpg" alt=""> <img src="../images/02.jpg" alt=""> <img src="../images/03.jpg" alt=""> <img src="../images/04.jpg" alt=""> </body> </html>
-
img.onload 图像加载完成后立即发生
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>onload</title> <script> </script> </head> <body> <img src="../images/07.jpg" alt="" id="img"> <script> var oImg = document.getElementById("img"); /*当图片没有设置宽高的时候,想到得到图片的宽高,需要等待图片加载进来以后才能获取到, 否则获取不到 直接获取的就是0 当图片设置宽高,那么我们随时获取的图片宽度 都是DOM节点你设置的宽度,而不是图片真正的宽度*/ console.log(oImg.offsetWidth);//0 // 把获取图片的宽度放在计时器中 setTimeout(function () { // 因为图片加载的会慢,但是在DOM节点读取完以后,在执行js的时,图片可能还在加载,所以获取的图片为0 // 给一个延迟执行,那么可能图片就会加载完毕,然后打印出图片的宽度 console.log(oImg.offsetWidth + "计时器的");//1920 },1000) // 书写计时器等待图片加载时间不好控制,所以onload事件是等待资源加载完毕以后执行 oImg.onload = function () { console.log(oImg.offsetWidth + "onload");//1920 } </script> </body> </html>
-
练习:进度条
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>进度条</title> <style> .progress{ width: 400px; height: 50px; border: 2px solid #009ff2; } .box{ width: 0%; height: 50px; background-color: orangered; } </style> </head> <body> <div class="progress"> <div class="box"></div> </div> <div id="con">已经加载了 0%</div> <script> var oCon = document.getElementById("con"); var oProgress = document.querySelector(".progress"); var oBox = document.querySelector(".box"); var num = 0; for (var i = 0; i < 30; i++) { var v = i + 1; var newImg = new Image(); v < 10 ? v = "0" + v : v; newImg.src = "../images/" + v + ".jpg"; newImg.onload = function () { num ++; oBox.style.width = num / 30 * 100 + "%"; oCon.innerHTML = `已经加载了 ${parseInt(num / 30 * 100)}%` } } </script> </body> </html>
window.onscroll
- window.onscroll:当系统滚动条滚动的时候触发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>window.onscroll</title>
<style>
body{
height: 3000px;
background-color: pink;
}
</style>
</head>
<body>
<script>
// window.onscroll:当系统滚动条滚动的时候触发
window.onscroll = function () {
console.log("滚了吧");
}
</script>
</body>
</html>
resize事件
-
窗口重置,resize事件是在浏览器窗口被重置时触发。
-
练习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>window.onresize</title> <script src="./my.js"></script> </head> <body> <script> //获取屏幕大小封装函数 var getScreen = function () { var w = document.documentElement.clientWidth||document.body.clientWidth; var h = document.documentElement.clientHeight||document.body.clientHeight;; return { width:w, height:h } } // 目前 只有浏览器窗口大小改变才能出发onresize事件 function changeColor() { if (getScreen().width >= 1000){ document.body.style.backgroundColor = "red"; }else if (getScreen().width >= 800){ document.body.style.backgroundColor = "yellow"; }else if(getScreen().width >= 600){ document.body.style.backgroundColor = "green"; }else{ document.body.style.backgroundColor = "blue"; } } /*// 方法1:页面调用的时候先执行一次 changeColor(); window.onresize = changeColor;*/ // 方法二 合写 /* window.onload = changeColor; window.onresize = changeColor;*/ window.onload = window.onresize = changeColor; </script> </body> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构