JavaScript中的事件

网页中的每个元素都可以产生某些事件

比如:

当用户单击按钮时,就发生⼀个鼠标单击(onclick)事件。

当用户点击提交按钮时,就发生⼀个提交数据(onsubmit)事件。

事件是可以被侦测到的行为 。每个元素都可以产⽣某些可以触发JavaScript函数的事件。

javaScript中的常用事件

事件说明
onload页面加载完成后触发该事件(window对象事件)
onscroll当滚动条滚动时触发该事件(window对象事件)
onresize当页面尺寸发生变化时触发该事件(window对象事件)
onclick鼠标单击时触发该事件
onmouseover鼠标移入到指定对象上时触发该事件(鼠标悬停)
onmouseout鼠标从指定对象上移出时触发该事件(鼠标移出)
onmousemove鼠标在指定对象上移动式触发该事件(鼠标移动,会触发多次)
onfocus对象获得光标(焦点)时触发该事件
onblur对象失去光标(焦点)时触发该事件
onselect当文本框或文本域中的文字被选中时触发该事件
onchang当文本框或文本域中的文字被改变时触发该事件
onkeydown当按下键盘上的按钮时触发该事件(document对象事件)
onkeyup当释放键盘上的按钮时触发该事件(document对象事件)
onkeypressonkeydown+onkeyup(document对象事件)
oncontextmenu鼠标右键菜单事件

JavaScript中绑定事件方式

在javaScript中,给DOM元素绑定事件有三种⽅式:侵入式、绑定式、监听函数式。

1.侵入式事件方式

将javaScript事件直接写在html标签中

<div onclick="add()">点我</div>
<script>
   //事件处理函数
   function add(){
       console.log('点击了div对象');
   }
</script>

注意:此种方式的缺点为:javascript事件与HTML代码混杂在一起

2.绑定式事件方式

通过DOM对象,使⽤javaScript代码绑定⼀个事件

<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <div id="one">hello</div>
        <script>
            let obj = document.getElementById('one');
            //方法一
            // obj.onclick = function(){
            //     alert("hello");
            // }
            //方法二
            function handler(){
                alert('hello');
            }
            obj.onclick = handler;
            //onclick函数的事件指向handler
            //如果handler后面加括号,则事件立刻执行
        </script>
    </body>
</html>

3.监听函数式事件方式

<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <div id="one">hello</div>
        <script>
            let obj = document.getElementById('one');
            obj.addEventListener('click',handler)//add添加,event事件,listener监听
            function handler(){
                alert('hello');
            }
        </script>
    </body>
</html>

补充:可以在addEventListener第二个参数的位置上时直接定义一个函数

优点:可以动态的判断要绑定什么事件

<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <div id="one">hello</div>
        <script>
            let str = 'click';
            let obj = document.getElementById('one');
            obj.addEventListener(str,handler)//add添加,event事件,listener监听
            function handler(){
                alert('hello');
            }
        </script>
    </body>
</html>

补充:

HTML负责内容,CSS负责样式,JS负责行为

事件对象-event

event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

属性说明
clientX获取相对于可视区域内鼠标的X坐标
clientY获取相对于可视区域内鼠标的Y坐标
offsetX获取相对于触发事件对象上鼠标的X坐标
offsetY获取相对于触发事件对象上鼠标的Y坐标
cancelBubble阻止事件冒泡
preventDefault阻止默认行为
keyCode获取用户按键值
target当前事件对象

offsetX、offsetY获取鼠标坐标

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <style>
        div{
            width: 300px;
            height: 200px;
            background-color: blue;
            margin: 50px 100px;
        }
    </style>
    <body>
        <div id="one"></div>
        <script>
            let obj = document.getElementById('one');
            //运行时会自动为事件函数注入一个对象
            obj.onmousemove = function(event){
                console.log(event.clientX+','+event.clientY);
                console.log(event.offsetX+','+event.offsetY);
            }
        </script>
    </body>
</html>

keyCode获取键盘输入

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="one"></div>
        <script>
            let obj = document.getElementById('one');
            //运行时会自动为事件函数注入一个对象
           document.onkeydown = function(event){
            console.log(event.keyCode);
           }
        </script>
    </body>
</html>

 当键盘按下相应的按钮,在控制台中就会将其相应的ASCII码值打印出来

事件冒泡与事件捕获

在页面上的⼀块可视区域中,其中可能会包括父元素可视区域与子元素可视区域。

此时,如果用户触发了子元素的某个事件,而父元素也具有相同的事件,那么事实上,我们并不能确定:用户到底是想触发子元素事件,还是想触发父元素事件。

解决这个问题的思路是:设计两种事件流:

事件冒泡

1.当用户触发了子元素事件时,先触发子元素事件,再触发父元素事件。这就是事件冒泡。(默认)

<html>
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            div{
                width: 400px;
                height: 300px;
                background-color: blue;
            }
            p{
                width: 200px;
                height: 150px;
                background-color: red;
            }
        </style>
    </head>
    <body>
        <div>
            <p></p>
        </div>
        <script>
            let obj = document.getElementsByTagName('div')[0];
            let pobj = obj.getElementsByTagName('p')[0];
            obj.onclick = function(){
                console.log('父元素点击事件');
            }
            pobj.onclick = function(){
                console.log('子元素点击事件');
                event.cancelBubble = true;
            }
        </script>
    </body>
</html>
阻止事件冒泡:event.cancelBubble = true;

因为冒泡事件是子元素冒泡给了父元素,因此阻止事件冒泡的语句应该写在子元素

事件捕获

2.当用户触发了子元素事件时,先触发父元素事件,再触发子元素事件。这就是事件捕获。

preventDefault()阻止浏览器默认行为

浏览器默认行为举例:鼠标右键后出现的菜单

默认行为:在某些事件中,浏览器内置了⼀些默认的功能。 如:单击鼠标右键会弹出菜单、提交按钮默认提交动作、按下字母键会输入⼀个字母等。

如果这些默认行为不能满足我们需要的功能,那么可以阻止默认行为,重写我们希望的行为。 阻止默认行为很简单,在事件处理函数中调用preventDefault方法即可。 阻止默认行为: event.preventDefault();

<html>
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            
        </style>
    </head>
    <body>
        <ul>
            <li>右键菜单1</li>
            <li>右键菜单2</li>
            <li>右键菜单3</li>
            <li>右键菜单4</li>
        </ul>
        <script>
            // document.oncontextmenu = function (){
            //     alert('1111');
            //     //在显示了我们的弹窗后,有显示了表单,因为显示表单为默认行为

            //     //禁用默认行为
            //     //preventDefault()是一个方法,不是一个事件
            //     event.preventDefault();
            // }

            //编写自己的右键菜单
            let ulObj = document.getElementsByTagName('ul')[0];
            ulObj.style.display = 'none';

            document.oncontextmenu = function(){
                ulObj.style.display = 'block';
                event.preventDefault();
            }
            ulObj.onclick = function (){
                //js中this代表当前对象
                this.style.display = 'none';
            }
        </script>
    </body>
</html>

 使自定义的菜单位置与鼠标相同

<html>
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            ul{
                width: 100px;
                height: 200px;
                background-color: #AEAEAE;
                border: black solid 1px;
                display: none;
            }
        </style>
    </head>
    <body>
        <ul>
            <li>右键菜单1</li>
            <li>右键菜单2</li>
            <li>右键菜单3</li>
            <li>右键菜单4</li>
        </ul>
        <script>
            //编写自己的右键菜单
            let ulObj = document.getElementsByTagName('ul')[0];

            document.oncontextmenu = function(event){
                ulObj.style.display = 'block';
                ulObj.style.marginLeft = event.clientX+'px';
                ulObj.style.marginTop = event.clientY+'px';
                event.preventDefault();
            }
            ulObj.onclick = function (){
                //js中this代表当前对象
                this.style.display = 'none';
            }
        </script>
    </body>
</html>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值