zoukankan      html  css  js  c++  java
  • 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>
    
  • 相关阅读:
    用Python完成一个汇率转换器
    鸿蒙如何用JS开发智能手表App
    鸿蒙如何用JS开发智能手表App
    SAP Spartacus SplitViewComponent Migration 的一个具体例子
    SAP Spartacus B2B 页面 Popover Component 的条件显示逻辑
    SAP Spartacus 升级时关于 schematics 的更新
    SAP Spartacus B2B 页面 Disable 按钮的显示原理
    SAP Spartacus B2B 页面 Disable Confirmation 对话框的显示原理
    通过 Feature Level 动态控制 SAP Spartacus 的页面显示
    SAP Commerce Cloud Build Manifest Components
  • 原文地址:https://www.cnblogs.com/jianjie/p/13202655.html
Copyright © 2011-2022 走看看