给元素添加事件,称为注册事件或者绑定事件。javascript
注册事件有两种方式:传统方式和方法监听注册方式。java
1.传统注册方式:程序员
(1)利用on开头的事件,好比:onclickweb
(2)< button οnclick=“alert(‘hello’)”>< /button>浏览器
(3)btn.onclick = function(){ }微信
(4)特色:注册事件的惟一性。简单来收,就是同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将会覆盖前面注册的处理函数svg
2.方法监听注册方式:函数
(1)W3C标准推荐的方式性能
(2)addEventListener()是一个方法this
(3)IE9以前的IE不支持此方法,可以使用attachEvent()代替
(4)特色:同一个元素同一个事件能够注册多个监听器
(5)按注册顺序依次执行
addEventListener事件监听方式:
//addEventListener()的语法格式以下: eventTarget.addEventListener(type, listener[,userCapture]); //举例: var div = document.querySelector('div'); div.addEventListener('click',function(){ alert('Hello'); })
eventTarget.addEventListener()方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数。
该方法接收三个参数:
1.type:事件类型字符串,好比:click、mouseover,注意这不要带on,而且该属性是字符串,必定要加引号。
2.listener:事件处理函数,事件发生时,会调用该监听函数。
3.userCapture:可选参数,是一个布尔值,默认是false。
attachEvent():该特性是非标准的,尽可能不要在生产环境中使用。(IE8及早期版本支持)
//attachEvent()的语法格式以下: eventTarget.attachEvent(eventNameWithOn, callback)
eventTarget.attachEvent()方法将指定的监听器注册到eventTarget(目标对象)上,当该对象触发指定的事件时,指定的回调函数就会被触发。
该方法接收两个参数:
1.eventNameWithOn:事件类型字符串,好比:onclick、onmouseover,注意要带on。
2.callback:事件处理函数,当目标触发事件时回调函数被调用。
注册事件兼容性解决方案(了解便可):
function addEventListener(element, eventName, fn){ //判断当前浏览器是否支持addEventListener方法 if(element.addEventListener){ element.addEventListener(eventName, fn); //第三个参数默认是false }else if(element.attachEvent){ element.attachEvent('on' + eventName, fn); }else{ //至关于element.onclick = fn; element['on' + eventName] = fn; } }
删除事件的方式
1.eventTarget.onclick = null;
2.eventTarget.removeEventListener(type, listener[,userCapture]);
var div = document.querySelector('div'); div.addEventListener('click',fn); // 里面的fn不须要加小括号调用 function fn(){ alert('蟹黄堡'); div.removeEventListener('click', fn); //因为该删除事件方法中须要把元素注册的事件处理函数做 //为参数,但无法直接写,因此须要把注册事件的事件处理 //函数分开单独写。 }
3.eventTarget.detachEvent(eventNameWithOn, callback);
4.删除事件兼容性解决方案(了解便可):
function removeEventListener(element, eventName, fn){ //判断当前浏览器是否支持removeEventListener方法 if(element.removeEventListener){ element.removeEventListener(eventName, fn); //第三个参数默认是false }else if(element.detachEvent){ element.detachEvent('on' + eventName, fn); }else{ element['on' + eventName] = null; } }
事件流描述的是从页面中接收事件的顺序。简单来讲,事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程就是DOM事件流。
DOM事件流分为3个阶段:
1.捕获阶段
2.当前目标阶段
3.冒泡阶段
举例:一个div注册了点击事件,那么它的DOM事件流以下图所示:
注意:
//状况1: eventTarget.onclick = function(event){} //状况2: eventTarget.addEventListener('click', function(event){}) //这个event就是事件对象,还能够写成e、evt等其余自定义名称
这个event是个形参,系统帮咱们设定为事件对象,不须要传递实参过去。
主要咱们注册事件,event对象就会被系统自动建立,并依次传递给事件监听器(事件处理函数)。
事件对象自己的获取存在兼容性问题:
1.标准浏览器中是浏览器给方法传递的参数,只须要定义形参e就能够获取到。
2.在IE6~8中,浏览器不会给方法传递参数,若是须要的话,须要到window.event中获取查找。
兼容性解决方法:
e = e || window.event;
事件对象属性方法 | 说明 |
---|---|
e.target | 返回触发事件的对象(标准) |
e.srcElement | 返回触发对象的事件(非标准,IE6~8使用) |
e.type | 返回事件的类型,好比:click、mouseover等,不带on |
e.stopPropagation() | 该方法阻止冒泡(标准) |
e.cancelValue | 该属性阻止冒泡(非标准,IE6~8使用),使用方法:e.cancelValue = true |
e.preventDefault() | 该方法阻止默认事件(默认行为)好比,不让链接跳转或者让提交按钮不提交等(标准) |
e.retuenValue | 该方法阻止默认事件(默认行为)好比,不让链接跳转或者让提交按钮不提交等(非标准,IE6~8使用) |
<ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> <script> var ul = document.querySelector('ul'); ul.addEventListener('click',function(e){ //1. //alert('Hello!'); //2. e.target.style.background = 'blue'; })
禁止鼠标右键菜单
contextmenu主要控制应该什么时候显示上下文菜单,主要用于程序员取消默认的上下文菜单。
document.addEvnetListener('contextmenu',function(e){ e.preventDafault(); })
禁止鼠标选中(selectstart 开始选中)
document.addEventListener('selectstart',function(e){ e.preventDefault(); })
鼠标事件对象(MouseEvent)
鼠标事件对象(属性) | 说明 |
---|---|
e.clientX | 返回鼠标相对于浏览器窗口可视区的X坐标 |
e.clientY | 返回鼠标相对于浏览器窗口可视区的Y坐标 |
e.pageX | 返回鼠标相对于文档页面的X坐标,IE9+支持 |
e.pageY | 返回鼠标相对于文档页面的Y坐标,IE9+支持 |
e.screenX | 返回鼠标相对于电脑屏幕的X坐标 |
e.screenY | 返回鼠标相对于电脑屏幕的Y坐标 |
键盘事件 | 触发条件 |
---|---|
onkeyup | 某个键盘按键被松开时触发 |
onkeydown | 某个键盘按键被按下时触发 |
onkeypress | 某个键盘按钮被按下时触发,可是它不识别功能键,好比:ctrl、shift、箭头等 |
注意:
1.若是使用addEventListener不须要加on。
2.三个事件的执行顺序是:keydown——>keypress——>keyup。
键盘事件对象(属性) | 说明 |
---|---|
keyCode | 返回该键的ASCII值 |
注意:
1.onkeydown和onkeyup不区分字母大小写,onkeypress区分字母大小写,好比按下a键或A键,keydown和keyup的keyCode都是65,而keypress则会区分,a键是97,A键是65。
2.在咱们实际开发中,更多使用的是keydown和keyup,它们能识别全部的键(包括功能键)。
3.keypress不识别功能键,可是keyCode属性能区分大小写,返回不一样的ASCII值。
4.能够利用keyCode返回的ASCII值来判断用户按下哪一个键。
5.keydown和keypress在文本框里面的特色:它们两个事件触发的时候,文字尚未落入文本框中;而keyup事件触发的时候,文本已经落入文本框里面了。
focus()方法可使搜索框得到焦点。好比:input.focus()。
经过::before或::after建立的元素的隐藏与显示和被选元素的隐藏与显示是同步的。
微信公众号也会按期更新,以为文章写得还能够的,能够加个关注!点个赞!谢谢!