DOM事件处理详解

目录

事件注册 

传统方式

事件监听方式 

事件移除

传统方式

标准方式

事件对象 

属性

方法 

鼠标/键盘事件对象

鼠标事件对象

键盘事件对象 


事件注册 

        事件注册目的是让浏览器对象能够识别对象,在之前的博客中我们就有使用过传统的事件注册方法连接js和html

传统方式

element.事件名 = function(){

        //事件处理程序

        }

        该方式的特点是,事件处理具有唯一性,同一个元素对于同一个事件只能注册一个处理函数,之后新注册的函数会将之前注册的函数覆盖掉 

<style>
    div{
        width: 100px;
        height: 100px;
        border: 1px solid;
        margin: 100px auto;
    }
</style>
<body>
    <div>
        <p id="p1"></p>
        <p id="p2"></p>
    </div>
    <script>
        //传统方式注册
        var div = document.querySelector('div');
        var p1 = document.getElementById('p1');
        var p2 = document.getElementById('p2');
        //注册onclick事件第一个函数
        div.onclick = function(){
            p1.innerHTML = "第一个函数";
        }
        //注册onclick事件第二个函数
        div.onclick = function(){
            p2.innerHTML = "第二个函数";
        }
    </script>

        上例中,对click事件注册两个函数,第二个函数会覆盖第一个函数,只是先第二个函数内的效果,也就是单击div元素只出现文字“第二个函数”

事件监听方式 

        该方式可以给元素注册多个事件处理函数

element.addEventListener(type,callback,[capture]);

        type:事件类型

        callback:事件处理函数

        cpature:可选参数,默认false(事件冒泡阶段处理),可填true(事件捕获阶段处理)

        我们可以通过该方式对上述代码进行改造,实现div绑定两个click函数 

<style>
    div{
        width: 100px;
        height: 100px;
        border: 1px solid;
        margin: 100px auto;
    }
</style>
<body>
    <div>
        <p id="p1"></p>
        <p id="p2"></p>
    </div>
    <script>
        //事件监听方式注册
        var div = document.querySelector('div');
        var p1 = document.getElementById('p1');
        var p2 = document.getElementById('p2');
        //注册onclick事件第一个函数
        div.addEventListener('click',function(){
            p1.innerHTML = "第一个函数";
        })
        //注册onclick事件第二个函数
        div.addEventListener('click',function(){
            p2.innerHTML = '第二个函数';
        })
    </script>

        网页单击div后呈现效果如下,可见click两个函数都实现了

事件移除

        事件既然可以注册,那当然也有方式可以移除,移除方式也分为两种

传统方式

element.事件名 = null;

标准方式

element.removeEventListener(type,callback);

        标准方式要移除事件,执行的callback时间处理函数必须是外部函数,使用匿名函数是无法移除的

    <div>文本</div>
    <script>
        var div = document.querySelector('div');
        //向div元素添加事件
        div.addEventListener("mousemove",myFunction);
        //设置函数myFunction
        function myFunction(){
            div.style.color = 'red';
        }
        //移除div元素事件
        div.removeEventListener("mousemove",myFunction);

        //标准方式使用匿名函数移除方法无效!!!
        div.removeEventListener("mouseover",function(){
            div.onmouseover = 'null';
        })
    </script>

事件对象 

        事件对象(event)封装了跟时间有关的数据,只在事件发生时存在,是由系统自动创建的,也是事件处理函数的默认参数

属性

1.event.target:返回触发事件的节点

2.event.timeStamp:返回发生时间的日期和时间(从客户机启动时间开始的毫秒数)

3.event.type:返回发生事件的类型

    <p id="p1"></p>
    <p id="p2"></p>
    <p id="p3"></p>
    <button>点击</button>
    <Script>
        var btn = document.querySelector('button');
        var p1 = document.getElementById('p1');
        var p2 = document.getElementById('p2');
        var p3 = document.getElementById('p3');
        btn.addEventListener("click",function(e){
            p1.innerHTML = e.target;     //打印触发事件的节点
            p2.innerHTML = e.timeStamp;  //打印事件发生时间戳
            p3.innerHTML = e.type;       //打印发生事件类型
        })
    </Script>

        上例点击按钮后便会打印绑定的事件属性

方法 

1.preventDefault():阻止执行与事件关联的默认动作

2.stopPropagation():阻止同一事件的传播

    <a href="https://www.csdn.net/">CSDN</a>
    <script>
        var link = document.querySelector('a');
        //组织链接点击跳转页面
        link.addEventListener('click',function(e){
            e.preventDefault();
        })
    </script>

        上例中,链接相关联的默认动作是点击跳转页面,使用preventDefault阻止默认点击事件,故设置后再点击后不会出现页面跳转

    <div onclick="fn2()" id="box2">box2
        <div onclick="fn1(event)" id="box1">box1</div>
    </div>
    单击:
    <input type="checkbox" id="choose">
    <script>
        var box1 = document.getElementById('box1');
        var box2 = document.getElementById('box2');
        function fn1(event){
            box1.innerHTML = "改变box1!";
            if(document.getElementById('choose').checked){
                event.stopPropagation();
            }
        }
        function fn2(){
            box2.innerHTML = "改变box2!";
        }    

        //为了效果图明显,设置一个鼠标移入box1背景色变化
        box1.addEventListener('mouseover',function(){
            box1.style.backgroundColor = 'yellow';
        })
    </script>

        上例中,由于box1位于box2内,所以单击box1时,两个box都会被单击。可以利用stopPropagation阻止当前事件的传播,让点击box1时,单击事件不会传播影响到box2

        网页实现效果:

鼠标/键盘事件对象

鼠标事件对象

1.clientX:事件被触发时,鼠标指针在当前浏览器窗口的水平坐标

2.clientY:事件被触发时,鼠标指针在当前浏览器窗口的垂直坐标

3.screenX:事件被触发时,鼠标指针在屏幕的水平坐标

4.screenY:事件被触发时,鼠标指针在屏幕的垂直坐标

5.pageX:事件被触发时,鼠标指针在文档的水平坐标

5.pageY:事件被触发时,鼠标指针在文档的垂直坐标

键盘事件对象 

1.key:事件触发返回按键标识符

2.keyCode:返回事件触发键值字符代码/键值代码

        对于onkeypress:返回事件触发键值的字符代码(ASCII码)

        对于onkeydown/onkeyup:返回事件触发键的代码(虚拟键码)

更多事件对象:

 HTML DOM 事件对象 | 菜鸟教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值