【慕课网】DOM事件探秘

警告
本文最后更新于 2020-03-12,文中内容可能已过时。

讲师:Amy 课程:https://www.imooc.com/learn/138

事件流:描述的是从页面中接受事件的顺序 IE-事件冒泡流:即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接受,然后逐级向上传播至最不具体的节点(文档)。

Netscape-事件捕获流:不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件。

例如:

<input type="button" value="按钮" id="btn" onclick="showMes()" />

缺点:HTML 和 JS 代码紧密的耦合在一起;更新函数名时,JS 代码和 HTML 都要进行修改

较传统的方式:把一个函数赋值给一个事件的处理程序属性,用的比较多的方法,简单、跨浏览器的优势 例如:

var btn = document.getElementById('btn');
btn.onclick = function(){
    alert('这是通过DOM0级添加的事件');
}
btn.onclick = null;//删除事件

没有 HTML 事件处理程序的缺点

没有 DOM1 级 DOM2 级定义了两个方法: 用于处理指定和删除事件处理程序的操作 addEventListener()和 removeEventListener()。 所有 DOM 节点包含这两个方法 接收三个参数:要处理的事件名、作为事件处理程序的函数和布尔值 例如:

var btn = document.getElementById('btn');
btn.addEventListener('click',showMes,false);//false可以兼容浏览器,冒泡阶段
btn.addEventListener('click',function(){
    alert(this.value);
},false);//按钮被点击后,先执行上面的事件,再进行这个事件
btn.removeEventlistener('click',showMes,false);//删除事件,参数必须与添加事件时传的参数相同,且通过addEventListener添加的事件,只能通过removeEventListner删除。

DOM0 级和 DOM2 级可以给一个元素添加多个事件处理程序,按照它们的顺序进行执行。

attachEvent()添加事件 detachEvent()删除事件 接收相同的两个参数:事件处理程序的名称和事件处理程序的函数 不适用第三个参数的原因:IE8 以及更早的浏览器版本支支持事件冒泡 例如:

var btn = document.getElementById('btn');
btn.attachEvent('onclick',showMes);//添加事件
btn.detachEvent('onclick',showMes);//删除事件

支持 IE 事件处理程序的浏览器:IE 和 OPERA 跨浏览器解决,用能力检测 例如:

var eventUtil = {
    //添加句柄
    addHandler:function(element,type,handler){
        if(element.addEventListener){//DOM2级别
            element.addEventListener(type,handler,false);
        }else if(element.attachEvent){//IE
            element.attachEvent('on'+type,handler);
        }else{//不支持DOM0级和DOM2级
            element['on'+type] = handler;//element.onclick===element['onclick']
        }
    },
    //删除句柄
    removeHandler:function(element,type,handler){
        if(element.addEventListener){//DOM2级别
            element.removeEventListener(type,handler,false);
        }else if(element.attachEvent){//IE
            element.detachEvent('on'+type,handler);
        }else{//不支持DOM0级和DOM2级
            element['on'+type] = null;//element.onclick===element['onclick']
        }
    }
}
var btn = document.getElementById('btn');
eventUtil.addHandler(btn,'click',showMes);
eventUtil.removeHandler(btn,'click',showMes);

什么是事件对象?在触发 DOM 上的事件时都会产生一个对象 事件对象 event

重要的属性

  • type 属性,用于获取事件类型
  • target 属性,用于获取事件目标(target.nodeName,节点名称)

重要的方法

  • stopPropagation()方法,用于阻止事件冒泡
  • preventDefault()方法,阻止事件的默认行为
<a href="#">超链接</a>//此处,跳转是默认行为
  • type 属性,用于获取事件类型
  • srcElement 属性,用于获取事件目标

window.event 是用于兼容 ie 早期版本的,加上会更严谨

//在showMes(event)函数中
event = event||window.event;
let ele = event.target||event.srcElement;
  • cancelBubble 属性,用于阻止事件冒泡,设置为 true 表示阻止冒泡,设置为 false 表示不阻止冒泡
  • returnValue 属性,用于阻止事件的默认行为,设置为 false 表示阻止事件的默认行为

IE10 以前的浏览器不支持 document.getElementsByClassName() 鼠标事件都是在浏览器窗口中的特定位置上发生的。 这个位置信息保存在事件的 clientX 和 clientY 属性中。 所有浏览器都支持这两个属性,它们的值表示事件发生时鼠标指针在视口中的水平和垂直坐标。 不包括页面滚动的距离。 mousemove:当鼠标指针在元素内部移动时重复地触发

鼠标事件 onmouseover onmouseup onmousedown onmouseout onclick

在适当的地方阻止事件冒泡

键盘事件

  • keyDown 当用户按下键盘上的任意键时触发,而且如果按住不放的话,会重复触发此事件
  • keyPress 当用户按下键盘上的字符键时触发,而且如果按住不妨的话,会重复触发此事件
  • keyUp 当用户释放键盘上的键时触发

EVENT 对象的 keyCoden 属性用于得到键盘对应键的键码值