JS事件执行顺序理解以及 e.stopPropagation()

Posted 前端乐园

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS事件执行顺序理解以及 e.stopPropagation()相关的知识,希望对你有一定的参考价值。

读书笔记,写的很乱  

事件处理程序

  事件处理程序分为三种: 1.html事件2. DOM0级,3,DOM2级别  没有DOM1  

  同样的事件 DOM0会顶掉html事件   因为他们都是属性  而DOM0比html事件执行的晚(可以理解为谁离html元素近先执行谁)

 

 

JS事件执行顺序理解

先捕获(document-往下)->目标阶段(执行)->冒泡(具体到不具体);

addEventListener 第三个参数 默认false   (false 是冒泡阶段执行)   true 是捕获阶段执行  

如果是多个元素嵌套的情况,先捕获不具体的,然后逐级往下捕获,到目标阶段

 然后目标阶段就有意思了,到了目标阶段,addEventListener第三个参数不管是true还是false,都无所谓了,因为已经到了目标了,如果写了同样的事件,一个true一个false他们的执行顺序是谁在前先执行谁。

然后是一点疑惑,我测试的(chrome67.0,ie11里)事件到了目标阶段以及冒泡阶段 事件执行顺序都是先html-后DOM0后DOM2 这是一点疑惑可能是浏览器的差异

看图  

 

来一段小代码  增强一下记忆:

    <div class="div">

            <p class="box">

            </p>

        </div>

        <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
        <script type="text/javascript">
            var get = document.querySelector.bind(document);
            var log = console.log.bind(this)

            get(\'p\').addEventListener(\'click\', function(e) {
                log(e.eventPhase)
                alert(\'p\')
            }, false)

            get(\'body\').addEventListener(\'click\', function(e) {

                log(e.eventPhase)

                alert(\'body\')

                if(e.target.nodeName == \'DIV\' || e.target.nodeName == \'P\') {

                    //如果点击的是div  那么 

                    e.stopPropagation()

                }

                //true  是捕获阶段获取  
            }, false)

            get(\'div\').addEventListener(\'click\', function(e) {

                alert(\'div\')

                //true  是捕获阶段获取  
            }, true)
        </script>

 

聊聊  e.stopPropagation();

 

最早知道e.stopPropagation()的时候只知道是阻止冒泡,自己也一直死记硬背的用着,具体什么原理,一直没搞清楚.

今天学习了相关文档,说是阻止冒泡并不错,但是不全面.   

按官方说法 stopPropagation()是不再派发事件。

  终止事件在传播过程的捕获、目标处理或起泡阶段进一步传播。调用该方法后,该节点上处理该事件的处理程序将被调用,事件不再被分派到其他节点。

  该方法将停止事件的传播,阻止它被分派到其他 Document 节点。在事件传播的任何阶段都可以调用它。注意,虽然该方法不能阻止同一个 Document 节点上的其他事件句柄被调用,但是它可以阻止把事件分派到其他节点。

  看来stopPropagation()是任何阶段都可以调用并且生效的.   那是不是可以理解为,如果给body加事件捕获  然后 再阻止派发事件,那么就可以做掉页面上的其他点击事件了?   确实是的!  用在点击页面任意位置关闭某个弹窗还是不错的.  也可以某种权限验证时来简单限制.

测试代码如下:

        
            get(\'body\').addEventListener(\'click\', function(e) {

                

            e.stopPropagation()
            
            alert(2)

            }, true)

 

以上是关于JS事件执行顺序理解以及 e.stopPropagation()的主要内容,如果未能解决你的问题,请参考以下文章

js 队列

JS中事件以及语句运行顺序的问题

JS中事件的执行顺序和AJAX的异步

事件循环(搞懂异步各任务的执行顺序)

图解js里的事件循环---机制

谈一谈你对js线程的理解