【事件】《JavaScript 高级程序设计》

事件冒泡
事件捕获


事件冒泡
<div>
<body> document.body
<html> document.documentElement
document document

IE5.5及更早版本中的事件冒泡会跳过<html>元素。IE9、Firefox、Chrome和Safari则将事件一直冒泡到window对象

 

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <button id="myBtn">click</button>
    <script>
        var btn = document.getElementById(myBtn)
        /**
         * 使用 DOM0 级方法指定的事件处理程序被认为是元素的方法。
         * 因此,这时候的事件处理程序是在元素的作用域中运行;换句话说,程序中的this 引用当前元素
         */
        btn.onclick = function() {
            console.log(this.id)
        }
        btn.onclick = null

        /**
         * addEventListener removeEventListener DOM2级事件
         *
         * 在使用 attachEvent() 方法的情况下,事件处理程序会在全局作用域中运行,因此this 等于window
         *
         * 这里调用了两次attachEvent() ,为同一个按钮添加了两个不同的事件处理程序。
         * 不过,与DOM方法不同的是,这些事件处理程序不是以添加它们的顺序执行,而是以相反的顺序被触发
         */

        // 点击按钮 true true true
        document.body.onclick = function(event) {
            console.log(event.currentTarget === document.body)
            console.log(this === document.body)
            console.log(event.target === btn)
        }

        var handler = function(event) {
            switch (event.type) {
                case click:
                    break
                case mouseover:
                    break
                case mouseout:
                    break
            }
        }
        btn.onclick = handler
        btn.onmouseover = handler
        btn.onmosueout = handler

        /**
         * 事件捕获阶段 处于目标阶段 事件冒泡阶段
         */
        btn.onclick = function(event) {
            console.log(btn, event.eventPhase) // 2
        }
        document.body.addEventListener(click, function(event) {
            console.log(body true, event.eventPhase) // 1
        }, true)
        document.body.onclick = function(event) {
            console.log(body, event.eventPhase) // 3
        }

        /**
         * 与访问 DOM 中的 event 对象不同,要访问 IE 中的 event 对象有几种不同的方式,取决于指定事件处理程序的方法。
         * 在使用DOM0 级方法添加事件处理程序时,event对象作为window 对象的一个属性存在
         * 可是,如果事件处理程序是使用 attachEvent() 添加的,那么就会有一个 event 对象作为参数被传入事件处理程序函数中
         * 在像这样使用attachEvent() 的情况下,也可以通过 window 对象来访问event 对象,就像使用DOM0 级方法时一样
         * 如果是通过HTML 特性指定的事件处理程序,那么还可以通过一个名叫event 的变量来访问event对象(与DOM中的事件模型相同)
         * 
         * srcElment 事件的目标(与DOM中的target属性相同)
         * cancelBubble 默认值为false ,但将其设置为 true就可以取消事件冒泡(与DOM中的stopPropagation()方法的作用相同)
         * stopPropagatioin() 可以同时取消事件捕获和冒泡
         * cancelBubble 由于 IE 不支持事件捕获,因而只能取消事件冒泡
         * returnValue 默认值为true,但将其设置为 false 就可以取消事件的默认行为(与DOM中的preventDefault() 方法的作用相同
        */
    </script>
</body>
</html>

 

 

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body onload="console.log(‘Dom loaded‘)">
    <script>
        var addHandler = function(element, type, handler) {
            if (element.addEventListener) {
                element.addEventListener(type, handler, false)
            } else if (element.attachEvent) {
                element.attachEvent(on + type, handler)
            } else {
                element[on + type] = handler
            }
        }
        var removeHandler = function(element, type, handler) {
            if (element.removeEventListener) {
                element.removeEventListener(type, handler, false)
            } else if (element.detachEvent) {
                element.detachEvent(on + type, handler)
            } else {
                element[on + type] = null
            }
        }
        var getTarget = function(event) {
            return event.target || event.srcElement
        }

        // 确定浏览器是否支持DOM2级事件规定的HTML事件
        var isSupported = document.implementation.hasFeature(HTMLEvents, 2.0)
        // 确定浏览器是否支持“DOM3级事件”定义的事件
        var isSupported = document.implementation.hasFeature(UIEvent, 3.0)

        // 新图像元素不一定要从添加到文档后才开始加载,只要设置了src属性就开始下载
        var image = document.createElement(img)
        addHandler(image, load, function(event) {
            console.log(getTarget(event).src) // 在使用 attachEvent() 方法的情况下,事件处理程序会在全局作用域中运行,因此this 等于window
        })
        addHandler(image, error, function(event) {
        })
        document.body.appendChild(image)
        image.src = http://pic002.cnblogs.com/images/2012/382256/2012080118323766.gif

        // 预加载图片
        // 可以像使用<img>元素一样使用Image对象,只不过无法将其添加到DOM树中
        var image2 = new Image()
        addHandler(image2, load, function() {
            console.log(Image loaded)
        })
        image2.src = http://pic002.cnblogs.com/images/2012/382256/2012080118323766.gif
    </script>
</body>
</html>

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。