zoukankan      html  css  js  c++  java
  • 从八道面试题看JavaScript DOM事件机制

    As we all know,事件机制其实很简单,无非冒泡捕获
    这两点,笔者不再赘述,网上相关文章一大堆,下面让我们直接看面试题

    题目一到七,统一设置css

    .test2 {
      height: 50px;
    }

    题目一

    <div class="test1">
        <div class="test2"></div>
    </div>
    <script>
        document.querySelector('.test1').addEventListener('click',function () {
            console.log(1)
        })
        document.querySelector('.test2').addEventListener('click',function () {
            console.log(2)
        })
    </script>

    请问:点击div.test1后,数字1和2,谁先被打印出来?

    题目二

    <div class="test1">
        <div class="test2"></div>
    </div>
    <script>
        document.querySelector('.test1').addEventListener('click', function () {
            console.log(1)
        }, true)
        document.querySelector('.test2').addEventListener('click', function () {
            console.log(2)
        }, true)
    </script>

    请问:点击div.test1后,数字1和2,谁先被打印出来?

    题目三

    <div class="test1">
        <div class="test2"></div>
    </div>
    <script>
        document.querySelector('.test1').addEventListener('click', function () {
            console.log(1)
        })
        document.querySelector('.test2').addEventListener('click', function () {
            console.log(2)
        }, true)
    </script>

    请问:点击div.test1后,数字1和2,谁先被打印出来?

    题目四

    <div class="test1">
        <div class="test2"></div>
    </div>
    <script>
        document.querySelector('.test1').addEventListener('click', function () {
            console.log(1)
        }, true)
        document.querySelector('.test2').addEventListener('click', function () {
            console.log(2)
        })
    </script>

    请问:点击div.test1后,数字1和2,谁先被打印出来?

    题目一到四的答案

    题目一:2,1
    题目二:1,2
    题目三:2,1
    题目四:1,2

    如果上面四道题,你做不对,说明了两件事
    一、你对事件机制的全过程不了解,其实很简单事件机制是先进行捕获,再进行冒泡
    二、你对addEventListener的第三个参数不了解,看MDN文档吧

    OK,上面问题都搞清楚了吗?下面继续咯~

    题目五

    <div class="test1">
        <div class="test2"></div>
    </div>
    <script>
        document.querySelector('.test1').addEventListener('click', function () {
            console.log(1)
        })
        document.querySelector('.test2').addEventListener('click', function () {
            console.log(2)
        }, true)
    </script>

    请问:点击div.test1后,数字1和2,谁先被打印出来?

    题目六

    <div class="test1"></div>
    <script>
        document.querySelector('.test1').addEventListener('click', function () {
            console.log(1)
        }, true)
        document.querySelector('.test1').addEventListener('click', function () {
            console.log(2)
        })
    </script>

    请问:点击div.test1后,数字1和2,谁先被打印出来?

    题目七

    <div class="test1"></div>
    <script>
        document.querySelector('.test1').addEventListener('click', function () {
            console.log(1)
        })
        document.querySelector('.test1').addEventListener('click', function () {
            console.log(2)
        }, true)
    </script>

    请问:点击div.test1后,数字1和2的出现顺序是什么样的?

    题目五、题目六和题目七的答案

    题目五:2,1
    题目六:1,2
    题目七:1,2

    我相信,题目五和题目六肯定是没问题的,但题目七可能和你想的不太一样,难道不是先捕获再冒泡了吗?

    当然不是
    为什么呢?
    因为如果被监听的元素没有子元素,那么哪个监听代码写在前面,就先执行哪个!

    终极一题

    <label>Click me <input type="text"></label>
    <script>
        document.querySelector('label').addEventListener('click',function () {
            console.log(1)
        })
        document.querySelector('input').addEventListener('click',function () {
            console.log(2)
        })
    </script>

    请问:点击label后,数字1和2的出现顺序是什么样的?

    答案:1,2,1

    因为label和input是有绑定的
    点击label后,浏览器自动帮你再点击一次label
    过程就是先进行一次事件机制,这一次对内部input元素的事件监听是不管不问的,所以先打出1
    结束后,再进行一次事件机制,这一次,按照正常事件机制流程走,所以接着打出了2,1

    本文转载于:猿2048https://www.mk2048.com/blog/blog.php?id=hbch0chakbb

  • 相关阅读:
    angularjs 自定义map服务
    js sort升序,降序排序
    jQuery根据元素值删除数组元素的方法
    传统service的上传文件,并生成8级存储文件夹方式
    shiro实现登录安全认证
    JAVA Web 项目中用到的技术
    每天进步一点,积累一点
    Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/config/springdemo-config.xml]
    C++ LINK 2019 error, LINK 2038 error, C4330.error
    关于map 容器insert顺序
  • 原文地址:https://www.cnblogs.com/10manongit/p/12819102.html
Copyright © 2011-2022 走看看