js事件详解

addEventListener()与removeEventListener()详解   点击打开链接



一、事件流

       

例:

   

     事件冒泡时:button先接收-----div接收-----document文档接收

    事件捕获时:document文档先接收-----div接收-----button最后接收

    事件冒泡使用的最多,目前的浏览器也都支持事件冒泡



二、事件处理

        


1. HTML事件处理:事件直接添加在HTML结构中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="div">
        <button id="btn1" οnclick="demo()">按钮</button>
    </div>
    <script>
        function demo(){
            alert("hello,html事件处理");
        }
    </script>
</body>
</html>

    缺点:修改一处代码则需要修改两处,例如把js中的函数名demo改了,则html文档里的button也需要修改。代码很多时会很麻烦。


2. DOM 0级事件处理:把函数赋值给事件处理程序属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js事件</title>
</head>
<body>
    <div id="div">
        <button id="btn">按钮</button>
    </div>
    <script>
        var btn = document.getElementById("btn");
        btn.onclick = function (){ alert("hello,DOM 0级事件处理程序")};
        //btn.onclick = null;//清除当前事件
    </script>
</body>
</html>

优点:改动js中的函数时  不用改变HTML文档(中的button按钮)

缺点:有多个事件时,只会显示最后一个,前面的会被覆盖。

例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js事件</title>
</head>
<body>
    <div id="div">
        <button id="btn">按钮</button>
    </div>
    <script>
        var btn = document.getElementById("btn");
        btn.onclick = function (){ alert("hello,DOM 0级事件处理程序1")};
        //btn.onclick = null;//清除当前事件
        btn.onclick = function (){ alert("hello,DOM 0级事件处理程序2")};
        btn.onclick = function (){ alert("hello,DOM 0级事件处理程序3")};
    </script>
</body>
</html>

运行结果:

                                             

只会显示第三个,前两个事件都被覆盖了。


3. DOM 2级事件处理(不会被覆盖)

addEventListener("事件名" , "事件处理函数" , "布尔值");

false 事件冒泡           true   事件捕获      (现在的版本可以忽略掉第三个参数布尔值)

removeEventListener();     移除事件

(1)添加事件code如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js事件</title>
</head>
<body>
    <div id="div">
        <button id="btn">按钮</button>
    </div>
    <script>
        var btn = document.getElementById("btn");
        btn.addEventListener("click",demo1);
        btn.addEventListener("click",demo2);
        btn.addEventListener("click",demo3);
        function demo1(){
            alert("DOM 2级事件处理程序 1")
        }
        function demo2(){
            alert("DOM 2级事件处理程序 2")
        }
        function demo3(){
            alert("DOM 2级事件处理程序 3")
        }
        
    </script>
</body>
</html>

 
运行结果: 

                                                                             三个事件都会显示出来 ,并不会出现覆盖

(2)移除事件的   js代码如下

<script>
        var btn = document.getElementById("btn");
        btn.addEventListener("click",demo1);
        btn.addEventListener("click",demo2);
        btn.addEventListener("click",demo3);
        function demo1(){
            alert("DOM 2级事件处理程序 1")
        }
        function demo2(){
            alert("DOM 2级事件处理程序 2")
        }
        function demo3(){
            alert("DOM 2级事件处理程序 3")
        }
        btn.removeEventListener("click",demo2);
    </script>


运行结果:  事件2被移除

                                


4. IE事件处理程序(<=IE8的版本,为了浏览器的兼容)

attachEvent   添加事件             detachEvent  移除事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js事件</title>
</head>
<body>
    <div id="div">
        <button id="btn">按钮</button>
    </div>
    <script>
        var btn = document.getElementById("btn");
        if(btn.addEventListener){
            btn.addEventListener("click",demo);
        } else if(btn.attachEvent){
            btn.attachEvent("onclick",demo);
        }
        else{
            btn.onclick = demo();
        }
        function demo(){
            alert("hello");
        }
    </script>
</body>
</html>
    

如果支持addEventListener  进行DOM 2级操作       支持attachEvent  进行IE操作    否则进行DOM 0级操作


三、事件对象

1.事件对象event:在触发DOM事件时都会产生一个对象
2.属性  

type  获取事件类型
target  获取事目标


  方法
       stopPropagation()  阻止事件冒泡
       preventDefault()  阻止事件默认行为


(1)事件属性demo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js事件</title>
</head>
<body>
    <div id="div">
        <button id="btn">按钮</button>
    </div>
    <script>
        document.getElementById("btn").addEventListener("click",showType);
    
        function showType(event){
            alert(event.type);
//            alert(event.target);
        }

    </script>
</body>
</html>

结果:点击按钮弹出事件类型“ click”

    将“alert(event.type);”注释,“alert(event.type);”取消注释,点击按钮弹出事件对象“[object HTMLButtonElement]  即HTML中的Button元素



(2)stopPropagation()  阻止事件冒泡

事件冒泡demo:

<div id="div">
        <button id="btn">按钮</button>
    </div>
    <script>
        document.getElementById("btn").addEventListener("click",showType);
        document.getElementById("div").addEventListener("click",showDiv);
        function showType(event){
            alert(event.type);
        }

        function showDiv(){
            alert("div");
        }
    </script>

结果:点击按钮先后弹出“click”,"div"

解释:只点击了button,但是包含button的div也执行了,这属于事件冒泡,事件逐级向上传递,传给了div,有时并不需要事件冒泡,可以通过stopPropagation()  

    阻止事件冒泡  code如下:

    <div id="div">
        <button id="btn">按钮</button>
    </div>
    <script>
        document.getElementById("btn").addEventListener("click",showType);
        document.getElementById("div").addEventListener("click",showDiv);
        function showType(event){
            alert(event.type);
            event.stopPropagation();
        }

        function showDiv(){
            alert("div");
        }
    </script>


(3) preventDefault()  阻止事件默认行为
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js事件</title>
</head>
<body>
    <div id="div">
        <button id="btn">按钮</button>
        <a href="http://www.jikexueyuan.com" id="aid">极客学院</a>
    </div>
    <script>
        document.getElementById("btn").addEventListener("click",showType);
        document.getElementById("div").addEventListener("click",showDiv);
        document.getElementById("aid").addEventListener("click",showA);
        function showType(event){
            alert(event.type);
            event.stopPropagation();
        }

        function showDiv(){
            alert("div");
        }

        function showA(event){
            event.stopPropagation();//阻止事件冒泡
            event.preventDefault(); //阻止事件的默认行为
        }
    </script>
</body>
</html>

    <a>标签的默认属性是跳转到相应链接,不想点击链接跳转到相应页面时,使用event. preventDefault()  阻止<a>标签的跳转

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,点击事件是指用户在网页上点击某个元素时所触发的事件。在JavaScript中,我们可以通过给元素添加点击事件监听器来实现对点击事件的响应。下面是一些关于点击事件详解: 1. 给元素添加点击事件监听器的方法 在JavaScript中,我们可以通过以下两种方法为元素添加点击事件监听器: - 使用HTML的onclick属性 我们可以在HTML标签中使用onclick属性来添加点击事件监听器,例如: ``` <button onclick="myFunction()">Click me</button> ``` 这里的myFunction()就是我们要执行的函数,点击按钮时就会触发该函数。 - 使用JavaScript的addEventListener()方法 我们也可以使用JavaScript的addEventListener()方法来为元素添加点击事件监听器,例如: ``` document.getElementById("myButton").addEventListener("click", myFunction); ``` 这里的myButton是我们要添加监听器的按钮元素的id,myFunction是我们要执行的函数。 2. 点击事件的触发条件 点击事件只有在满足以下两个条件时才会被触发: - 用户单击了鼠标左键 只有在用户单击了鼠标左键时,点击事件才会被触发。如果用户单击了鼠标右键或中键,则不会触发点击事件。 - 鼠标单击的元素上有点击事件监听器 只有在用户单击的元素上有点击事件监听器时,点击事件才会被触发。如果用户单击的元素上没有点击事件监听器,则不会触发点击事件。 3. 点击事件对象 在点击事件触发时,会自动创建一个点击事件对象。我们可以通过该对象来获取一些与点击事件相关的信息,例如: - event.target:获取被点击的元素 - event.clientX和event.clientY:获取鼠标单击位置的横坐标和纵坐标 - event.preventDefault():阻止元素的默认行为(例如,阻止链接跳转或表单提交) 4. 防止重复点击 有时候我们可能会遇到这样的情况:用户在短时间内多次点击同一个按钮,导致按钮的事件被触发多次,从而影响网页的正常运行。为了避免这种情况,我们可以采用以下两种方法: - 在函数中添加一个变量,记录上一次点击事件的时间戳,如果当前时间与上一次点击事件的时间间隔小于某个值,就不执行函数。 - 使用JavaScript的debounce函数,该函数可以延迟函数的执行时间,从而防止过于频繁的触发点击事件。 以上就是关于点击事件的一些详解,希望能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值