Fangjian

FE / 生活是一种态度

导航
 » 主页
 » 项目
 » Github
 » 关于我

Event [js]

05 Dec 2015 » js

事件是 javascript 最核心的概念之一,一切的行为都基于事件而产生

目录


1 事件流

2 事件处理程序

3 事件对象

4 事件类型


先上代码,再分析

var EventUtil = {
    // 1 注册事件
    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;
        }
    },
    // 2.移出事件
    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] = handler;
        }
    },
    // 3.兼容获取event对象
    getEvent: function(event){
        return event ? event : window.event;
    },
    // 4.获取目标target
    getTarget: function(event) {
        return event.target || event.srcElement;
    },
    // 5.阻止默认事件
    preventDafult: function(event) {
        if(event.preventDefault){
            event.preventDefault();
        }else{
            event.returnValue = false;
        }
    },
    // 6.阻止冒泡
    stopPropagation: function(event) {
        if(event.stopPropagation){
            event.stopPropagation();
        }else{
            event.cancelBubble = true;
        }
    }
};

一、事件流

事件冒泡:IE事件流叫做事件冒泡,即事件开始时由最具体元素接收,然后逐级向上传播到较为不具体的节点(div(假设div为具体节点) -> body -> html -> document)。

事件捕获:Netscape团队提出了另一种事件流叫做事件捕获,即事件开始由不太具体的节点先接收然后到具体的某个节点再接收(document -> html -> body -> div(假设div为具体节点))。

DOM2级事件 规定事件流包括三个阶段 事件捕获处理目标事件冒泡

二、事件处理程序

DOM0级事件

定义:通过为事件处理程序赋值的方式为DOM0级事件

var btn = document.getElementById('btn');
btn.onclick = function () { 
    console.log('clicked');
 }

DOM2级事件

“DOM2级事件”定义了两个方法,用于指定和删除事件处理程序的操作:addEventListener(type, handler, false), removeEventListener(type, handler, false);第三个参数true为事件捕获,false为事件冒泡

IE事件处理程序提供了两个对应的方法:attachEvent(type, handler)detachEvent(type, handler)

三、 事件对象

1) DOM中的事件对象

概念:在触发DOM上的某个事件时,会产生一个事件对象event,这个event上面包含了所有与事件有关的信息(事件元素、事件类型、特定事件属性)。event对象包含与创建它的特定事件有关的属性和方法

DOM DOM0 获取event: event

DOM DOM2 获取event: event

属性和方法:

方法:
    preventDefault()  [Function]: 取消默认行为。若cancelable是true,则可以使用这个方法
    stopPropagation() [Function]: 取消事件的进一步捕获或冒泡。如果bubbles为true,则可以使用这个方法
    stopImmediatePropagation() [Function]: 取消事件的进一步捕获或冒泡,同时阻止任何事件处理程序被调用

属性:
    cancelable [Boolean]: 是否可以取消事件的默认行为
    bubbles [Boolean]: 事件是否冒泡
    
    defaultPrevented [Boolean]: 为true表示已经调用了preventDefault()
    detail [Integer]: 与事件相关的细节信息
    eventPhase [Integer]: 调用事件处理程序的阶段 1.捕获  2.目标  3.冒泡
    
    target [Element]:事件流的目标阶段
    currentTarget [Element]:在事件流的捕获/目标/冒泡阶段

注:

a.只有当事件流处在目标阶段的时候,两个的指向才是一样的, 而当处于捕获和冒泡阶段的时候,target指向被单击的对象而currentTarget指向当前事件活动的对象(一般为父级)

EventUtil.addHandler(div, 'click', function(event){
    alert(event.bubbles); // true
    alert(event.cancelable); // true 

    console.log(event.target);
    console.log(event.currentTarget);
});

b.stopImmediatePropagation: 如果某个元素有多个相同类型事件的事件监听函数,则当该类型的事件触发时,多个事件监听函数将按照顺序依次执行.如果某个监听函数执行了 event.stopImmediatePropagation()方法,则除了该事件的冒泡行为被阻止之外(event.stopPropagation方法的作用),该元素绑定的后序相同类型事件的监听函数的执行也将被阻止

EventUtil.addHandler(btn, 'click', function(event){
    alert("1.我是p元素上被绑定的第一个监听函数");
});

EventUtil.addHandler(btn, 'click', function(event){
    event.stopImmediatePropagation();
    //执行stopImmediatePropagation方法,阻止click事件冒泡,并且阻止p元素上绑定的其他click事件的事件监听函数的执行.
});

EventUtil.addHandler(btn, 'click', function(event){
    alert("2.我是p元素上被绑定的第二个监听函数");
});

EventUtil.addHandler(div, 'click', function(event){
    alert("3.我是div元素,我是p元素的上层元素");
});

// 没有调用 stopImmediatePropagation  输出:1.xxx 2.xxx 3.xxx  
// 调用 stopImmediatePropagation  输出:1.xxx

2) IE中的事件对象

概念:与访问DOM中的event对象不同,要访问IE中的事件对象有几种不同的方式,取决于指定事件处理程序的方法。

IE DOM0 获取event: window.event

IE DOM2 获取event: event

属性:

cancelBubble [Boolean]  默认值为false,true为阻止冒泡 [同stopPropagation()]
returnValue  [Boolean]  默认为true, false为阻止默认事件[同 preventDefault()]
srcElement   [Element]  事件的目标 [同 target]
type         [String]   被触发的事件类型

四、事件类型

UI事件:当用户于页面上的元素发生交互时触发

UI事件是指不一定与用户操作有关的事件

DOMActivate[舍弃]:表示元素已经被用户操作激活
load: 当页面完全加在后在window上面触发
unload: 当页面完全卸载后在window上面触发
abort: 用户停止下载过程
error: 当发生javascript错误时在window上触发
select: 当用户选择一个或多个字符时触发
resize: 窗口大小改变的时候触发
scroll: 当用户滚动带滚动条的元素中的内容时触发

焦点事件:当元素获得或失去焦点时触发

焦点事件在页面获取或失去焦点的时候触发,可以与document.hasFocus()、document.activeElement()属性配合,可以知晓用户在页面上的行为

blur: 元素失焦时触发,[不冒泡]
focus: 元素获取焦点时触发 [不冒泡]

DOMFocusOut: 元素失焦时触发,[冒泡]
DOMFocusIn: 元素获取焦点时触发 [冒泡]

focusin: 元素获取焦点时触发 [冒泡]
focusout: 元素失焦时触发 [冒泡]

鼠标事件:鼠标在页面上操作的时候触发

鼠标事件是web应用中最常用的事件

mousedown: 按下任意鼠标按钮
mouseup: 释放鼠标
click : 点击或回车
dbclick: 双击

mouseenter: 只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件[不冒泡]
mouseover: 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件
mouseleave: 只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件。[不冒泡]
mouseout: 不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件。

mousemove: 鼠标在目标区域移动时重复的触发

注意:mouseover ,mouseout当鼠标指针穿过被选元素子元素时,也会触发事件。这在绑定事件时,有时出现意想不到的Bug可能就是由 mouseover mouseout 事件引起的

滚动事件:当鼠标滚动时触发

文本事件:当在文档中输入文本时触发

键盘事件:当用户通过键盘操作页面时触发

合成事件:当为IME输入字符时触发

变动:当底层DOM结构发生变化时触发

变动名称事件:当元素或属性名变动时触发[舍弃]

相关文章