【笔记】DOM事件探秘(慕课)

一、事件流:描述的是从页面中接受事件的顺序。

1. 事件冒泡流:事件开始由最具体的元素接收,然后逐级向上传播至最不具体的节点(文档)。
如点击按钮,不但触发按钮,同时触发包含按钮的<div>,也触发<body>、<html>,一直触发到document。
被所有主流浏览器所兼容。

2. 事件捕获流:与事件冒泡流相反。不太具体的节点更早接收到事件,而最具体的节点最后接收到事件。
事件先由document接收,然后由<html>接收,然后<body>、<div>、<input>。


二、事件处理程序

1. HTML事件处理程序:把事件直接加在标签上,如把onclick事件直接加在input标签上,即加在html结构里。
    HTML事件处理程序缺点:HTML和JavaScript代码紧密耦合在一起。

2. DOM0级事件处理程序:把一个函数赋值给一个事件的处理程序属性。
    1)用得比较多,因为简单,具有跨浏览器的优势。
    2)先把按钮取出来(var btn = document.getELementById("id");btn.οnclick=function(){})。删除事件:btn.οnclick=null;

3. DOM2级事件处理程序(IE不支持)
    1)DOM2级事件定义了两个方法,用于处理指定事件处理程序和删除事件处理程序的操作,即addEventListener()和removeEventListener()。
    2)所有DOM节点中都包含这两个方法,接受3个参数:要处理的事件名、作为事件处理程序的函数和布尔值(true表示在捕获事件阶段调用事件处理程序,false表示在冒泡时间阶段调用事件处理程序)。
    3)例:btn3.addEventListener("click", showMes, false); 事件名需要去掉“on”。
    4)通过addEventListener方法添加的事件只能通过removeEventListener来删除。
    5)btn3.removeEventListener("click", showMes, false); removeEventListener必须和addEventListener传入相同的参数。
    6)可以通过调用方法两次来为一个事件添加多个事件处理程序。

4. IE事件处理程序(IE、Opera支持,IE11已经删除该方法)
    1)attachEvent("onclick", showMes); detachEvent("onclick", showMes);此时需要加上“on”。
    2)接收相同的两个参数,即要处理的事件名和作为事件处理程序的函数。
    3)只支持事件冒泡,所以不需要传入第三个参数。

5. 跨浏览器的事件处理程序
    1)恰当地使用能力检测
    2)小tip:element.onclick === element["onclick"];
    3)为了方便使用,将跨浏览器的事件处理程序封装为一个对象。
    var eventUtil = {
        // 添加句柄
        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;
            }
        },
        // 删除句柄
        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;
            }
        },
        // 得到事件
        getEvent: function (event) {
            return event ? event : window.event;
        },
        // 取得事件类型
        getType: function (event) {
            return event.type;
        },
        // 取得事件来源的元素
        getElement: function (event) {
            return event.target || event.srcElement;
        },
        // 阻止事件默认行为
        preventDefault: function (event) {
            if (event.preventDefault) {
                event.preventDefault();    
            } else{
                event.returnValue = false;
            }
        },
        // 阻止事件冒泡
        stopPropagation: function (event) {
            if (event.stopPropagation) {
                event.stopPropagation();
            } else {
                event.cancelBubble = true;
            }
        }
    };
    使用方法:eventUtil.addHandler(btn, "click", showMes);

三、事件对象:在触发DOM事件时都会产生一个对象,即事件对象event。对象中包含了事件元素、事件类型,以及其他信息,如鼠标的位置,键盘的按键等。

1. DOM中的事件对象(event)
    事件对象自动传入作为事件处理程序的函数中,如showMes(),加入参数(参数名e、event等),showMes(event),则event则成为了接收事件对象的参数,可在showMes(event)中调用event对象的属性与方法等。
    1)type属性 用于获取事件类型
    2)target属性 用于获取事件目标,即事件来自于哪一个元素(如input)
    3)stopPropagation()方法 用于阻止事件冒泡。在本元素的事件处理程序的函数中阻止即可,这样就阻止了冒泡的过程,而不需要一层层向上挨个阻止。
    4)preventDefault()方法 阻止事件的默认行为。同样在本元素的事件处理程序的函数中使用,来阻止本元素的默认行为,如<a>的跳转。

2. IE中的事件对象
    1)type属性 用于获取事件类型
    2)srcElement属性 用于获取事件目标,即事件来自于哪一个元素(如input)
        为兼容性,可写作var element = event.target || event.srcElement;
        同样为兼容性,需要在函数中写event = event(接收到的event,也就是参数) || window.event(window的event,并不是接收到的,与前者不同);(IE浏览器需要添加window)
    3)cancelBubble属性 用于阻止事件冒泡。true表示阻止事件冒泡,false表示不阻止事件冒泡。
    4)returnValue属性 用于阻止事件的默认行为。默认为true,设为false则表示阻止事件的默认行为。

四、事件类型
    1. 鼠标事件
        1)鼠标事件都是在浏览器的特定位置上发生的,这个位置信息保存在事件的clientX和clientY属性中。
        2)要拖动的控件,position必须等于absolute。
        3)如果要取element.style.left/top的值,则这个值必须事先定义,在HTML中定义,否则为空。甚至在CSS定义中也不行。这时如果要取面板的坐标,使用element.offsetLeft/Top。
        4)offsetWidth/Height属性,获取盒子的宽度/高度。
        5)onmousedown-点下鼠标 onmousemove-拖动鼠标 onmouseup-松开鼠标
    2. 键盘事件
        1)keyDown(.onkeydown) 当用户按下键盘上的任意键时触发,而且如果按住不放的话,会重复触发此事件。
        2)keyPress 当用户按下键盘上的字符键时触发,而且如果按住不放的话,会重复触发此事件。
        3)keyUp 当用户释放键盘上的键时触发。
        4)console.log(),在控制台输出。
        5)在哪个元素调用了函数,元素内的this就指哪个元素。
        6)event.keyCode返回按键的键码,就知道按下了哪个键。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值