JavaScript进阶:事件和事件处理


本期文章是关于JavaScript事件的基础知识整理

6.5事件和事件处理

6.5.1 概念

事件概念:发生一件事情执行对应行为

发生一件事情:我点击了电脑的“开机按钮”

执行对应行为:电脑启动了

6.5.2 JS事件由哪些部分组成

1外部动作:我点击了一个HTML元素(例如:按钮)

2 事件源:真实存在的一个HTML元素,例如:按钮

3 事件:单击事件、双击事件等等

4 事件监听者:监听外部动作(一旦我点击某个按钮就会触发)

5 事件处理者:通常是一个函数体,用来处理事件执行的行为

入门案例:我点击一个按钮,弹出一个警告框,打印“我被点击了”

步骤:1 定义事件源 例如:按钮
     2 在事件源上定义“单击事件”  onclick
	 3 将事件监听者注册到事件源上   οnclick="myClick()" 此时myClick是我定义的函数
	 4 编写事件监听者的函数  function myClick(){}
	 5 编写事件处理者的函数体  

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!--
    此时我们定义了一个事件源:按钮。但是点击没有效果,因为还没有为事件源创建事件,也没有将事件监听者注册到事件源上
    οnclick="" onclick表示事件源button按钮创建的一个"单击事件"
    JS所有的事件都是以on开头,表示我在事件源上创建了一个“单击事件”

    定义了事件源创建了单击事件还是无法达到我们的目的,因为此时我们没有定义事件监听者。
    此时myClick()是一个事件监听者注册到事件源了,定义了事件监听者还是无法达到我们的目的,我们必须为事件监听者绑定一个函数
    -->
    <input type="button" id="btn" value="点击我" onclick="myClick()"/>

    <script>
        // 事件监听者绑定的函数,必须和onclick里面的值保持一致
        function myClick(){
            // 函数体就是事件处理者
            alert("我被点击了");
        }
    </script>
</body>
</html>

6.6事件介绍

6.6.1 窗体加载事件

onload事件,事件源可以是body,也可以是window窗体对象。

当窗体的所有HTML元素成功加载就会触发onload事件。该事件有一个别名:初始化事件。

onload何时会触发呢?onload事件是主动触发的,一旦所有的HTML元素全部加载到浏览器内部的DOM树就会触发该事件。

场景:body元素作为事件源,定义一个onload事件,HTML页面加载成功之后,触发该事件,打印P元素的内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        console.log("start");
        /**
         * load()事件监听者绑定的一个函数
         * 步骤:1 根据id获取P元素
         *       2 打印P元素的内容
         * 注意:onload事件触发之前,P元素已经成功的加载到浏览器的DOM树了
         */
        function load(){
            let first = document.getElementById("first");
            let  content = first.innerHTML;
            alert(content);
        }
        console.log("end");
    </script>
</head>
<body onload="load()">
    <p id="first">我是一个P</p>
</body>
</html>

上一个示例,HTML和JS耦合在一起了,有没有办法将他们分开。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--
    为window对象注册一个onload事件,所有的HTML元素成功加载到浏览器之后就会触发
    场景:定义一个P标签,然后为window对象注册一个onload事件,HTML元素成功加载之后,就会触发onload事件,将系统当前
    时间显示在P元素(标签)里面
    步骤:1 定义HTML(结构)
         2 定义CSS样式(表现)
         3 定义JS(行为)
            3.1 为window窗体对象注册一个onload事件
            3.2 编写事件处理者,将当前的系统时间设置到P标签里面
    -->
    <style>
        #first{
            width:50%;
            height:100px;
            border:3px solid red;
        }
    </style>
    <script>
        /**
         * 所有HTML元素加载到当前窗体之后触发window的onload事件
         * 此时的匿名函数是一个事件监听者,使用赋值运算符=将它注册到事件源window
         * = 是一个Hook(钩子),它勾起了事件监听者和事件源
         */
        window.onload = function (){
            let first = document.getElementById("first");
            let dt = new Date();
            first.innerHTML = dt;
        }
    </script>
</head>
<body>
    <p id="first"></p>
</body>
</html>

小结: onload事件也是一个初始化事件,它是一个主动触发的事件,当所有HTML元素加载完毕就会触发。

6.6.2 单击事件

onclick的事件源通常是一个按钮

场景:有一个按钮,有一个P标签。单击按钮触发一个单击事件。创建定时器对象,将当前时间显示在P标签里面。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #first{
            width:50%;
            height:100px;
            border:3px solid red;
        }
    </style>
    <!--
    1 定义window的onload事件加载窗体
    2 根据id获取Button按钮
    3 为按钮注册(绑定)一个单击事件
    4 定义匿名函数作为事件处理者
    5 创建定时器,每隔1000毫秒执行一次
    6 根据id获取P元素
    7 创建Date对象
    8 将当前时间赋值个P元素的内容
    -->
    <script>
        window.onload = function(){
            let btn = document.getElementById("btn");
            // 为按钮注册一个单击事件
            /***
             * btn此时表示“事件源”,它是一个按钮
             * onclick是事件源的一个“单击事件”
             * function(){} 事件监听者,监听“外部动作”
             * 匿名函数体:事件处理者,一旦触发了单击事件就会执行匿名函数体
             * 我点击按钮:外部动作触发事件
             */
            btn.onclick = function(){
                // setInterval定时器
                let code = setInterval(function(){
                    // 根据id获取P元素
                    let first = document.getElementById("first");
                    // 创建一个Date对象
                    let dt = new Date();
                    // 将当前时间对象赋值给P元素的内容
                    first.innerHTML = dt;
                },1000);
            }
        }
    </script>
</head>
<body>
<p id="first"></p>
<input type="button" id="btn" value="点击我"/>
</body>
</html>

场景:在上一个示例基础上新创建一个按钮作为事件源,点击之后停止定时任务

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #first{
            width:50%;
            height:100px;
            border:3px solid red;
        }
    </style>

    <script>
        window.onload = function(){
            let btn = document.getElementById("btn");
            // 为按钮注册一个单击事件
            /***
             * btn此时表示“事件源”,它是一个按钮
             * onclick是事件源的一个“单击事件”
             * function(){} 事件监听者,监听“外部动作”
             * 匿名函数体:事件处理者,一旦触发了单击事件就会执行匿名函数体
             * 我点击按钮:外部动作触发事件
             */

            let code ;
            btn.onclick = function(){
                // setInterval定时器
                code = setInterval(function(){
                    // 根据id获取P元素
                    let first = document.getElementById("first");
                    // 创建一个Date对象
                    let dt = new Date();
                    // 将当前时间对象赋值给P元素的内容
                    first.innerHTML = dt;
                },1000);
            }
            /**
             * 为btnStop绑定一个单击事件,一旦触发就停止定时器
             * 步骤:1 根据id获取btnStop
             *       2 将btnStop作为事件源绑定单击事件
             *       3 编写事件监听者和事件处理者,停止定时器
             */
            let btnStop = document.getElementById("btnStop");
            btnStop.onclick = function(){
                // alert(code);
                // 停止定时器
                clearInterval(code);
            }
        }
    </script>
</head>
<body>
<p id="first"></p>
<input type="button" id="btn" value="点击我"/>
<input type="button" id="btnStop" value="Stop"/>
</body>
</html>
6.6.3 双击事件

ondblclick 工作中用的极少 dbl —> double

场景:我有一个按钮,为其定义双击事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        window.onload=function(){
            let btn = document.getElementById("btn");
            // 箭头函数也能够支持“事件监听者”
            btn.ondblclick = function(){
                alert("双击事件触发了..........");
            }
        }
    </script>
</head>
<body>
<input type="button" id="btn" value="双击"/>
</body>
</html>
6.6.4 获得焦点事件

onFocus

事件源可以是一个文本输入框

场景:有三个文本框,计算乘积。

​ 当第三个文本框获得焦点,就会触发一个获得焦点事件,计算前两个文本框的乘积

步骤:

1 定义三个文本框

2 定义窗体加载事件

3 使用ID分别获取3个文本框的HTML元素

4 为第三个文本框绑定(注册)一个获得焦点事件,一旦焦点移动到第三个文本框就触发该事件,计算乘积

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        window.onload = function(){
            let first = document.getElementById("first");
            let second = document.getElementById("second");
            let third = document.getElementById("third");
            // 为第三个文本框注册一个获得焦点事件
            third.onfocus = function(){
                // first表示  <input type="text" id="first"  placeholder="请输入第一个整数" />
                // value表示first里面的value属性
                // 此时就是获取第一个文本框的value属性值将其赋给变量v1
                let v1 = Number(first.value);
                let v2 = Number(second.value);
                // alert(typeof v1 +"----"+v1);
                // third.value = v1 * v2;
                // this表示当前对象,此时我们为第三个文本框注册的事件,所以当前对象就是third
                // this等于third
                this.value = v1 * v2;
            }
        }
    </script>
</head>
<body>
    <input type="text" id="first"  placeholder="请输入第一个整数" /><br />
    <input type="text" id="second"  placeholder="请输入第二个整数" /><br />
    <input type="text" id="third" placeholder="结果" />
</body>

</html>
6.6.5失去焦点事件

onblur

场景:有三个文本框,计算乘积。为第二个文本框定义失去焦点事件。一旦触发事件,将计算的乘积显示在第三个文本框中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    
    <script>
        /**
         * 为getElementById定义一个函数,外界调用这个函数就可以根据id获取HTML元素
         * 问题:此时只能对当前页面完成重构,当前页面之外还是会出现重复的document.getElementById(id)
         * 如何解决?需要将下面的函数定义在一个外部JS文件中,当前页面启动的时候引入外部JS文件
         * */
        // function $(id){
        //     return document.getElementById(id);
        // }

        window.onload= function(){
            let first = document.getElementById("first");
            let second =document.getElementById("second");
            let third = document.getElementById("third");
            // 为second注册一个失去焦点事件
            second.onblur = function(){
                let v1 = first.value;
                let v2 = this.value;
                third.value = (v1 * v2)+"A";
            }
        }
    </script>
</head>
<body>
    <input type="text" id="first"  placeholder="请输入第一个整数" /><br />
    <input type="text" id="second"  placeholder="请输入第二个整数" /><br />
    <input type="text" id="third" placeholder="结果" />
</body>
</html>
6.6.6 选项改变事件

onchange 该事件的事件源通常是一个下拉列表框

场景:我有一个下拉框,里面有各种颜色的选项。我为下拉框注册一个onchange事件,每当选项发生改变就触发这个事件,获取选中的值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #first{
            width:100px;
            height:100px;
            border:3px double blue;
        }
    </style>

    <script>
        /**
         * 1 注册一个窗体加载事件加载HTML元素
         * 2 为color注册一个onchange事件,一旦触发打印选项的值
         */
        window.onload = function(){
            //  $("color") 表示根据id获取select元素
            // onchange表示为select元素注册一个“选项改变事件”
            // ()=>{} 箭头函数用于定义onchange事件的监听者
            document.getElementById("color").onchange = function(){
                // 如何获取选中的值?
                let color = this.value;
                /**
                 * 选中黄色让DIV变黄
                 * 1 根据ID获取DIV
                 * 2 将选中的颜色值赋给DIV的背景颜色
                 */
                document.getElementById("first").style.backgroundColor=color;
            }
        }
    </script>
</head>
<body>
<div id="first"></div>
<select id="color">
    <option value="">请选择</option>
    <option value="red">红色</option>
    <option value="yellow">黄色</option>
    <option value="blue">蓝色</option>
    <option value="orange">橙色</option>
    <option value="pink">粉色</option>
    <option value="green">绿色</option>
    <option value="black">黑色</option>
</select>
</body>
</html>
6.6.7 鼠标悬停和离开事件

onmouseover 鼠标悬停

onmouseout 鼠标离开

场景:有一个P元素默认启动定时器显示当前系统时间,为P元素定义鼠标悬停和离开事件,当鼠标悬停在P元素上,停止定时器,当鼠标离开P元素重新启动定时显示当前时间

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style>
        #first{
            width:80%;
            height:100px;
            border:3px dotted pink;
        }

    </style>
    <script type="text/javascript">
    	window.onload = function() {
    		let code ;
    		let firstElement = document.getElementById("first");
    		code = setInterval(function() {
    			let dt = new Date();
    			firstElement.innerHTML = dt.toString();
    		},1000);

    		firstElement.onmouseover = function(){
    			console.log("onmouseover");
    			clearInterval(code);
    		}
    		firstElement.onmouseout = function(){
				setInterval(function() {
    				let dt = new Date();
    				firstElement.innerHTML = dt.toString();
    			},1000);
    		}

    	}

    </script>
</head>
<body>
  <p id="first"></p>

</body>
</html>
6.6.8 鼠标按下和释放事件

onmousedown鼠标按下

onmouseup鼠标释放

这两个事件用的少,因为通常使用单击事件来代替他们

场景:有一个图片,为其注册鼠标按下和释放事件,当鼠标按下显示图片内容,当鼠标释放图片内容清空。

<!DOCTYPE html>
<html>
<head>
	<title></title>
	    <style>
        #myImg{
            width:300px;
            height:300px;
            border:3px dotted pink;
        }
    </style>
	<script type="text/javascript">
		window.onload = function() {
			let myImgPic = document.getElementById("myImg");
			myImgPic.onmousedown = function(){
				this.src="../images/1.jpg";
			}
			myImgPic.onmouseup = function(){
				this.src='';
			}
		}
	</script>
</head>
<body>
    <img id="myImg" src=""/>
</body>
</html>
6.6.9键盘事件

onkeyup 键盘释放

场景:定义一个文本域为其注册键盘释放事件,每当你释放键盘时候就会触发。

要求:获取你每次按住的键盘的key

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<script type="text/javascript">
		window.onload = function(){
			let area = document.getElementById("area");
			area.onkeyup = function() {
				console.log(event.keyCode+"----"+event.key);
			}
		}
	</script>
</head>
<body>
    <textarea id="area" rows="10" cols="30"></textarea>
</body>
</html>

onkeydown 键盘按下

跟焦点事件一样,有三个输入框。我为第二个输入框注册“onkeydown "事件

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<script type="text/javascript">
		window.onload = function() {
			let second = document.getElementById("second");
			second.onkeypress = function() {
				if(event.keyCode == 13) {
					let first = document.getElementById("first");
					let third = document.getElementById("third");
					third.value = first.value * this.value;
				}
			}
		}
	</script>
</head>
<body>
<input type="text" id="first"  placeholder="请输入第一个整数" /><br />
<input type="text" id="second"  placeholder="请输入第二个整数" /><br />
<input type="text" id="third" placeholder="结果" />
</body>
</html>
6.6.10 表单提交事件

onsubmit表示表单提交事件,它对应事件源通常是表单元素form,经常使用

浏览器采集的数据提交给服务器之前会通过该事件验证浏览器提交数据的合法性,这个事件通常是用来做表单验证的。

场景:用户登录,要求提交给服务器的用户名和密码不能为空。判断是否为空的操作在onsubmit里面完成。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        window.onload = function(){
            /**
            步骤:
             1 获取当前表单
             2 为表单注册onsubmit事件
             3 获取浏览器采集的用户名和密码
             4 判断密码是否为空,如果为空阻止提交,非空就提交
             */
            let myForm = document.getElementsByTagName("form")[0];
            myForm.onsubmit = function(){
                let userName = document.getElementById("txtUserName").value;
                let pwd = document.getElementById("txtPwd").value;
                // 验证用户名和密码的合法性
                if(null==userName || userName.length==0){
                    alert("用户名不能为空");
                    return false;
                }
                if(null == pwd || pwd.length ==0){
                    alert("密码不能为空");
                    return false;
                }
            }
        }
    </script>
</head>
<body>
<form action="success.html" method="get">
    <input type="text" id="txtUserName" name="userName" placeholder="请输入用户名" /><br/>
    <input type="password" id="txtPwd" placeholder="请输入密码" /><br/>
    <input type="submit" name="submit" value="提交">
    <input type="reset" name="reset" value="重置">
</form>
</body>
</html>

summary

JavaScript的相关知识总结到这篇文章就收尾了,本文内容由本人结合所学知识和学习笔记以及相关资料整理得出。若有不足和错误,敬请大家指出,我会及时做出修改。下期文章主要内容是es6的知识整理,敬请期待!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dorable_Wander

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值