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

  • 相关阅读:
    WinForm简单进度条
    金庸群侠传 3小时爆机
    One Day
    css组件化
    PHP判断端口是否打开的代码
    PHP下像JQUery下查找修改HYML元素的类PHP Simple HTML DOM Parser
    兼容IE和FF的添加收藏和设为主页代码
    注册成功啦,终于在博客园注册成功了,以后要更加努力的学习技术啊!
    ppz css栅格框架
    使用live writer 发布一下日志
  • 原文地址:https://www.cnblogs.com/10manongit/p/12819102.html
Copyright © 2011-2022 走看看