• 技术文章 >web前端 >js教程

    浅析js的事件绑定&事件监听&事件委托的之间内容

    不言不言2018-08-23 15:01:39原创716

    本篇文章给大家带来的内容是关于浅析js的事件绑定&事件监听&事件委托的之间内容,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    1、事件绑定
    要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数。所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称。
    有三种常用的绑定事件的方法:
    (1)在DOM中直接绑定事件
    我们可以在DOM元素上绑定onclick、onmouseover、onmouseout、onmousedown、onmouseup、ondblclick、onkeydown、onkeypress、onkeyup等。

    <input type="button" value="click me" onclick="hello()"><script>
    function hello(){
        alert("hello world!");
    }
    </script>

    (2)在JavaScript代码中绑定事件
    在JavaScript代码中(即 script 标签内)绑定事件可以使JavaScript代码与HTML标签分离,文档结构清晰,便于管理和开发。

    <input type="button" value="click me" id="btn"><script>
    document.getElementById("btn").onclick = function(){
        alert("hello world!");
    }
    </script>

    (3)使用事件监听绑定事件
    绑定事件的另一种方法是用 addEventListener() 或 attachEvent() 来绑定事件监听函数。
    事件监听
    关于事件监听,W3C规范中定义了3个事件阶段,依次是捕获阶段、目标阶段、冒泡阶段。
    W3C规范

    element.addEventListener(event, function, useCapture)

    event : (必需)事件名,支持所有 DOM事件 。
    function:(必需)指定要事件触发时执行的函数。
    useCapture:(可选)指定事件是否在捕获或冒泡阶段执行。true,捕获。false,冒泡。默认false。

    <input type="button" value="click me" id="btn1"><script>
    document.getElementById("btn1").addEventListener("click",hello);
    function hello(){
        alert("hello world!");
    }
    </script>

    IE标准

    element.attachEvent(event, function)

    event:(必需)事件类型。需加“on“,例如:onclick。
    function:(必需)指定要事件触发时执行的函数。

    <input type="button" value="click me" id="btn2"><script>
    document.getElementById("btn2").attachEvent("onclick",hello);
    function hello(){
        alert("hello world!");
    }
    </script>

    事件监听的优点
    1、可以绑定多个事件。
    常规的事件绑定只执行最后绑定的事件。而事件监听可以执行多个函数。

    <input type="button" value="click me" id="btn4"><script>
    var btn4 = document.getElementById("btn4");
    btn4.addEventListener("click",hello1);
    btn4.addEventListener("click",hello2);
    function hello1(){
        alert("hello 1");
    }
    function hello2(){
        alert("hello 2");
    }
    </script>

    2、可以解除相应的绑定

    <input type="button" value="click me" id="btn5"><script>
    var btn5 = document.getElementById("btn5");
    btn5.addEventListener("click",hello1);//执行了
    btn5.addEventListener("click",hello2);//不执行
    btn5.removeEventListener("click",hello2);
    function hello1(){
        alert("hello 1");
    }
    function hello2(){
        alert("hello 2");
    }
    </script>

    封装事件监听

    <input type="button" value="click me" id="btn5">//绑定监听事件
    function addEventHandler(target,type,fn){
        if(target.addEventListener){
            target.addEventListener(type,fn);
        }else{
            target.attachEvent("on"+type,fn);
        }
    }//移除监听事件
    function removeEventHandler(target,type,fn){
        if(target.removeEventListener){
            target.removeEventListener(type,fn);
        }else{
            target.detachEvent("on"+type,fn);
        }
    }

    事件捕获:事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件。
    事件冒泡:是自下而上的去触发事件。绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获。true,事件捕获;false,事件冒泡。默认false,即事件冒泡。

    <p id="parent">
      <p id="child" class="child"></p>
    </p>
    
    document.getElementById("parent").addEventListener("click",function(e){
                    alert("parent事件被触发,"+this.id);
                })
                document.getElementById("child").addEventListener("click",function(e){
                    alert("child事件被触发,"+this.id)
                })
    
    child事件被触发,child
    parent事件被触发,parent

    结论:先child,然后parent。事件的触发顺序自内向外,这就是事件冒泡。
    现在改变第三个参数的值为true:

    document.getElementById("parent").addEventListener("click",function(e){
                    alert("parent事件被触发,"+e.target.id);
                },true)
                document.getElementById("child").addEventListener("click",function(e){
                    alert("child事件被触发,"+e.target.id)
                },true)parent事件被触发,parentchild事件被触发,child

    结论:先parent,然后child。事件触发顺序变更为自外向内,这就是事件捕获。

    阻止事件冒泡,阻止默认事件
    event.stopPropagation()方法:这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开。
    event.preventDefault()方法:这是阻止默认事件的方法,调用此方法是,连接不会被打开,但是会发生冒泡,冒泡会传递到上一层的父元素
    return false:这个方法比较暴力,他会同事阻止事件冒泡也会阻止默认事件;写上此代码,连接不会被打开,事件也不会传递到上一层的父元素;可以理解为return false就等于同时调用了event.stopPropagation()和event.preventDefault()

    2.事件委托
    事件委托就是利用冒泡的原理,把事件加到父元素或祖先元素上,触发执行效果。

    <input type="button" value="click me" id="btn6">
    var btn6 = document.getElementById("btn6");
    document.onclick = function(event){    
    event = event || window.event;    
    var target = event.target || event.srcElement;    
    if(target == btn6){
            alert(btn5.value);
        }
    }

    事件委托优点
    1、提高JavaScript性能。事件委托可以显著的提高事件的处理速度,减少内存的占用

    <ul id="list">
      <li id="item1" >item1</li>
      <li id="item2" >item2</li>
      <li id="item3" >item3</li></ul><script>
      var item1 = document.getElementById("item1");
      var item2 = document.getElementById("item2");
      var item3 = document.getElementById("item3");
    
    document.addEventListener("click",function(event){
        var target = event.target;    
        if(target == item1){
            alert("hello item1");
        }else if(target == item2){
            alert("hello item2");
        }else if(target == item3){
            alert("hello item3");
        }
    })</script>

    2、动态的添加DOM元素,不需要因为元素的改动而修改事件绑定。

    <ul id="list">
      <li id="item1" >item1</li>
      <li id="item2" >item2</li>
      <li id="item3" >item3</li></ul><script>var list = document.getElementById("list");
    
    document.addEventListener("click",function(event){
        var target = event.target;    
        if(target.nodeName == "LI"){
            alert(target.innerHTML);
        }
    })
    var node=document.createElement("li");
    var textnode=document.createTextNode("item4");
    node.appendChild(textnode);
    list.appendChild(node);
    </script>

    相关推荐:

    浅谈jquery之on()绑定事件和off()解除绑定事件

    浅谈JavaScript事件绑定的常用方法及其优缺点分析

    以上就是浅析js的事件绑定&事件监听&事件委托的之间内容的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:js如何获取样式表中的样式(代码) 下一篇:js中对数组进行操作的方法总结(代码)
    Web大前端开发直播班

    相关文章推荐

    • JavaScript实现跨浏览器的添加及删除事件绑定函数实例_javascript技巧• 浅谈JavaScript的Polymer框架中的事件绑定_基础知识• jQuery的事件委托实例分析_jquery• js事件监听器用法实例详解_javascript技巧• JavaScript使用addEventListener添加事件监听用法实例_javascript技巧• JavaScript事件委托技术实例分析_javascript技巧• JavaScript事件委托用法分析_javascript技巧

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网