• 488 DOM0和DOM2事件绑定的原理、使用、区别


    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link rel="stylesheet" href="css/reset.min.css">
        <style>
            html,
            body {
                height: 100%;
                background: lightcyan;
            }
    
            #box {
                box-sizing: border-box;
                position: absolute;
                top: 50%;
                left: 50%;
                margin: -100px 0 0 -100px;
                 200px;
                height: 200px;
                background: lightcoral;
            }
        </style>
    </head>
    
    <body>
        <div id="box"></div>
    
        <script>
    		/* 
    		 * DOM0事件绑定 VS DOM2事件绑定
    		 *   [DOM0]
    		 *     元素.on事件行为 = function(){}
    
    		 *   [DOM2]
    		 *     元素.addEventListener(事件行为, function(){}, true/false)
    		 *     IE6~8中:元素.attachEvent('on事件行为', function(){}),要加on
    		*/
    
            /* DOM0事件绑定的原理:给元素的私有属性赋值,当事件触发,浏览器会帮我们把赋的值执行,但是这样也导致 “只能给当前元素某一个事件行为绑定一个方法” */
            box.onclick = function () {
                console.log('哈哈哈~~');
            }
    
            box.onclick = function () {
                console.log('呵呵呵~~');
            }
    
            box.onclick = function () {
                console.log('哈哈哈~~');
                // => 移除事件绑定:DOM0直接赋值为null即可
                box.onclick = null;
            }
    
    
            /* ================================================ */
    
    
            // DOM2事件绑定的原理:
            // (1)基于原型链查找机制,找到EventTarget.prototype上的方法并且执行,此方法执行,会把给当前元素某个事件行为绑定的所有方法,存放到浏览器默认的事件池中(绑定几个方法,会向事件池存储几个);
            // (2)当事件行为触发,会把事件池中存储的对应方法,依次按照顺序执行 “给当前元素某一个事件行为绑定多个不同方法” 
            box.addEventListener('click', function () {
                console.log('哈哈哈~~');
            }, false);
    
            box.addEventListener('click', function () {
                console.log('呵呵呵~~');
            }, false);
    
            // => DOM2事件绑定的时候,我们一般都采用实名函数
            // => 目的:这样可以基于实名函数去移除事件绑定
            function fn() {
                console.log('哈哈哈~~');
                // => 移除事件绑定:从事件池中移除,所以需要指定好事件类型、方法等信息(要和绑定的时候一样才可以移除)
                box.removeEventListener('click', fn, false);
            }
            box.addEventListener('click', fn, false);
    
            function fn1() {
                console.log(1);
            }
            function fn2() {
                console.log(2);
            }
            function fn3() {
                console.log(3);
            }
    
            box.addEventListener('click', fn2, false);
            box.addEventListener('click', fn3, false);
            box.addEventListener('click', fn1, false);
    
            // => 基于addEventListener向事件池增加方法,存在去重的机制: “同一个元素,同一个事件类型,在事件池中只能存储一遍这个方法,不能重复存储”
            box.addEventListener('click', fn1, false);
            box.addEventListener('mouseover', fn1, false);
    
            window.oncontextmenu = function (ev) {
                alert("哇咔咔~~");
            }
    
            /* DOM0和DOM2可以混在一起用:执行的顺序以绑定的顺序为主 */
            box.addEventListener('click', function () {
                console.log('哔咔哔咔~~');
            });
            box.onclick = function () {
                console.log('哇咔咔~~');
            }
            box.addEventListener('click', function () {
                console.log('call~~');
            });
    
    
            // --------------------------
    
    
            /* DOM0中能做事件绑定的事件行为,DOM2都支持;DOM2里面一些事件,DOM0不一定能处理绑定,例如:transitionend、DOMContentLoaded... */
            // box.style.transition = 'opacity 1s';
            box.ontransitionend = function () {
                console.log('哇咔咔~~');
            }
    
            box.addEventListener('transitionend', function () {
                console.log('哇咔咔~~');
            });
    
            window.addEventListener('load', function () {
                // => 所有资源都加载完成触发
                console.log('LOAD');
            });
    
            window.addEventListener('DOMContentLoaded', function () {
                // => 只要DOM结构加载完就会触发
                console.log('DOMContentLoaded');
            });
    
            // => $(document).ready(function(){})
            $(function () {
                // => JQ中的这个处理(DOM结构加载完触发)采用的就是DOMContentLoaded事件,并且依托DOM2事件绑定来处理,所以同一个页面中,此操作可以被使用多次
            });
            $(function () {
    
            });
    		/* JQ中的事件绑定采用的都是DOM2事件绑定,例如:on/off/one */
        </script>
    
        <script src="js/jquery.min.js"></script>
    
        <script>
            let $box = $('#box');
    		/* $box.one('click', function () {
    			console.log('哇咔咔~~');
    		}); */
            $box.on('click', function () {
                console.log('哇咔咔~~');
            });
            $box.on('click', function () {
                console.log('哔咔哔咔,丘~~');
            });
    
    		// window.onload VS $(document).ready()
    		// 1.$(document).ready() 采用的是DOM2事件绑定,监听的是DOMContentLoaded这个事件,所以只要DOM结构加载完成就会被触发执行,而且同一个页面中可以使用多次(绑定不同的方法,因为基于DOM2事件池绑定机制完成的)
    		// 2.window.onload必须等待所有资源都加载完成才会被触发执行,采用DOM0事件绑定,同一个页面只能绑定一次(一个方法),想绑定多个也需要改为window.addEventListener('load', function () {})DOM2绑定方式
        </script>
    </body>
    
    </html>
    
  • 相关阅读:
    java中CyclicBarrier的使用
    java并发中CountDownLatch的使用
    java中Locks的使用
    java 中的fork join框架
    java中ThreadPool的介绍和使用
    java中的daemon thread
    java中interrupt,interrupted和isInterrupted的区别
    java中的Atomic类
    怎么在java中关闭一个thread
    java中join的使用
  • 原文地址:https://www.cnblogs.com/jianjie/p/13202655.html
Copyright © 2020-2023  润新知