事件
相关的知识都看无缺了事件处理程序函数在处理事件时,或者说DOM
在触发某个事件的时候,会产生一个包含事件相关信息的event
事件对象javascript
对于不一样浏览器环境,这个event
事件对象有一些差距html
不论是DOM0
级仍是DOM2
级html5
兼容DOM
的浏览器会将一个event
对象传入事件处理程序中java
经常使用的event
对象的一些属性浏览器
type
:表示事件的类型缓存
具体用法:能够经过type
区分,在同一个事件处理函数实现多个事件的处理,减小事件监听,优化性能dom
currentTarget
:事件处理程序当前正在处理这个事件的元素ide
target
: 表示实际触发事件的DOM元素,实际目标函数
能够这么理解,body
下面的div
被点击,冒泡到body
,在body
上绑定了一个click
事件,这个时候触发这个body
的点击事件,可是这个时候的target
其实是div
性能
那么在事件处理程序中,还有一个this
属性,还有一个currentTarget
:永远指向正在处理这个事件的元素,那么上一个例子中其实是body
在处理这个事件,因此currentTarget
是指向body
的
而 事件处理程序中的this
指向,是一直指向currentTarget
表示正在执行和处理事件的这个元素
因此,在事件没有冒泡的状况下,这三者是能够为同一个值,可是若是是在冒泡阶段事件被处理的话,则这个target
可能不等于其余两个值
preventDefault
阻止默认行为,是一个函数
用法:在须要阻止默认行为的事件处理函数中,使用event.preventDefault()
,取消默认事件,好比默认点击a
标签会跳转指定连接等等
注意: 只有event.cancleable
属性为true
的事件类型,才可使用preventDefault
stopPropagation
阻止事件冒泡和捕获,也是一个函数
eventPhase
获取事件当前正处于事件流的哪一个阶段
event.eventPhase
分别对应值:1,3,2上述event
属性和方法,尽在事件处理程序执行期间存在,事件处理程序一旦执行完毕,会当即销毁
IE中的event
对象跟DOM
中的事件对象有必定的差异,最重要的就是IE
中的事件对象,若是是使用DOM0
级的方法添加事件处理程序是,event
对象会挂载到window
下面?window?window?是的没错,获取事件对象的时候,是经过window.event
来拿到事件对象,若是使用html
指定事件处理程序或者是DOM2
级都都不会有这个问题,和DOM
级别相似,会有一个event
对象传入到事件处理程序
可是IE
中的事件对象,对应的属性名和方法名跟DOM
中事件对象的名字有很大不同
cancelBubble == stopPropagation
阻止事件冒泡,可是不是个方法是一个属性returnValue == preventDefault
阻止默认事件,可是不是个方法,是一个属性srcElement == target
实际触发目标type == type
用来区分事件类型,这个没有区别要记住的仍是,若是在IE
环境下,使用DOM0
级指定事件处理程序的话,获取event
对象须要从window.event
这样获取
例如:
var btn= document.getElementById('test') // DOM0级指定 btn.onclick=function(){ alert(window.event.target.srcElement === this) //true } // DOM2级 btn.addEventListener('click',function(event){ alert(event.srcElment === this) //true })
还有就是IE
环境下阻止事件冒泡和默认处理程序都是属性,不是方法,只须要把对应的属性设置为false
例如:
var link = document..getElementById('test') link.onclick = function(){ window.event.returnValue = false; //阻止默认事件 }
IE
中的cancleBuble只是取消冒泡,由于IE环境不支持事件捕获,哈哈哈哈
而后就是完善一下以前的EventUtil
,实现跨浏览器的获取事件对象,还有阻止冒泡和默认事件处理程序,代码以下
getTarget(event){ return event || window.event //IE环境下多是WINDOW.event }, preventDefault(event){ if(event.preventDefault){ event.preventDefault() }else{ event.returnValue = false // IE环境下没有preventDefault,是经过设置returnValue取消默认 } }, stopPropagation(event){ if(event.stopPropagation){ event.stopPropagation() }else{ event.cancelBuble = false } }
DOM3级完善了事件类型,用来区分事件类型的不一样信息,相似:鼠标事件,焦点事件,键盘事件,文本时间,滚轮事件等等
指的是那些不必定与用户操做有管的事件,包括一些DOM和元素的交互时间,例如load
事件 unload
事件
load
事件
window
,DOM2
级写法:监听window
对象,例如window.addEventListener('load',function(){})
HTML
级写法,因为HTML
写法没法拿到window
对象,因此会直接写在body
上面,通常来讲,在window
上发生的任何事件均可以在body
元素上经过对应的特性来指定,全部的浏览器都能很好地支持这种方式,可是任然推荐使用DOM0
或DOM2
等javascript
的方法来绑定window
对象的时间按处理程序img,script,link,video
等标签也有load
事件unload
事件
window
resize
事件
DOM
浏览器和IE
环境有区别,event.target
属性的实际触发对象不同,在DOM
浏览器中,这个属性指向document
,可是在IE
环境中,这个值没有指定firefox
浏览器,resize
的过程不会持续触发这个事件,只在开始和结束,两个触发,而在其余浏览器,在拖拽的过程当中是会一直触发这个事件window
1px
的改变时候,最大最小化窗口的时候load
事件,能够用window
对象捕获,也能够用body
标签捕获scroll
事件
window
load
方法相似document.compatMode
渲染模式,有不一样的表现,在compatMode==='CSS1Copat'
标准模式时,除了Safari
浏览器,全部的都会经过html
这个元素反应这个变化,而在混杂模式时,是经过body
元素的scrollLeft
和scrollTop
来获取这个具体的bian'hua数值,而如今基本上混杂模式和标准模式已经混合了,区分没有这么详细在页面元素失去或者得到焦点的时候触发,能够用来知晓用户在页面上的行踪
主要用的比较多的是
focus
,blur
,这两个事件表示,元素得到焦点和失去焦点,不会冒泡
focusin,focusout
用来表示焦点进入和焦点失去事件,**这两个事件会冒泡
虽然上述经常使用事件有的不会冒泡什么,可是,仍然会走捕获阶段,因此仍然能够经过捕获阶段进行一些外级操做,固然是浏览器支持捕获阶段
触发元素:全部元素均可触发
捕获方式:DOM0
级,DOM2
级,或者HTML
方法都可捕获,IE
浏览器环境方式也能够
鼠标和滚轮事件也是在DOM3
级事件中定义的,主要有,单击,点击,双击,鼠标移入,鼠标移出,等
除了鼠标移入mouseenter
和鼠标移除mouseleave
全部的鼠标事件都会冒泡,也是能够取消的,而取消鼠标事件将会影响浏览器的默认行为,取消鼠标事件的默认行为还会影响其余事件,由于鼠标事件可能和其余事件是有联系的
一个click
事件,前面包括了一个鼠标按下mousedown
和鼠标放开两个事件mouseup
,也就是触发click
事件前会先触发前两个事件
同理,双击事件doubleclick
事件包括两个click
事件,前面又有两个mouseup
和mousedown
事件
主要用处
event.clientX
和event.clientY
event.pageX
和event.pageY
event.screenX
和event.screenY
ctrl
,alt
等)
shift
键 就在 event.shiftKey
这个属性上event.relatedTarget
mouseout
和mouseenter
时表示 目标获取光标元素和目标失去光标元素IE8
以前的没有这个属性,可是分别有两个fromElment
和toElement
用来获取这两个相关元素button
0 : 左键按下,1:中键按下,2:右键按下
IE8
及更早版本浏览器也有这个属性,可是对应值有比较大的区别,区分的更为细致detail
dblclick
事件,双击会放大画面,并且不能改变该行为mousemove
事件,若是此事件会致使内容变化,将再也不发生其余事件,若是不会触发任何事件,那么依次会发生mousedown,mouseup,click
事件,可点击单元表示一些会产生默认操做的元素:好比a
标签主要是一些键盘输入和文本键入的事件,是说DOM2
级事件最初规定了键盘事件,可是后来删掉了,因此目前主要支持的仍是DOM0级
事件和DOM3
级事件,可是DOM3
级事件暂时没有特别完善
主要事件keydown
,keypress
,keyup
,理论上全部的元素都支持这三个事件,可是实际上只有文本输入框支持最多
触发顺序keydown,keypress,keyup
,而且keydown
和keypress
都是在文本框发生变化以前触发,而keyup
事件则是在文本框已经变化以后触发,若是用户一直按住一个字符不放,则会一直触发keydown
和keypress
事件
还有一个新增的文本事件textInput
,其实是对keypress
的补充,用意是将文本显示给用户以前更加容易拦截文本,在文本插入文本框以前会触发textInput
事件
经常使用键盘事件属性
keyCode
keydown
和keyup
时,event对象会有一个keyCode
属性charCode
keypress
事件触发时charCode
是否可用,若是有的话则表示的是 按下键对应字符的ASCII码,而IE8
及更早版本,则是在keyCode
表示字符对应的ASCII码charCode
,在IE8
及老旧浏览器也可能在keyCode
charCode
可用的话,能够经过字符串类方法String.fromCharCode
转化为实际的字符char
和key
charCode
和keyCode
key
:表示对应的文本字符,包括大小写,就是实际的键入字符char
:表现形式在按下字符时表现和key
一致,可是对于非字符时,char
为null
location
属性,表示按下了键盘什么位置的同一个按键,例如键盘左边的shift
和右边的shift
inputMethod
,用来区分输入方式,是复制进来的,仍是拖放进来的,仍是手写输入,语音输入等DOM3级的键盘输入事件很美好,可是不知道实际支持状况,并且还要作兼容,以前遇到一个number
类型的input
输入框,就累个够呛,候选字等,输入法越作越优秀,事件愈来愈复杂
是DOM3
级新增的一类事件,用域处理IME
的输入序列,暂时没接触,也是一类多功能输入事件吧
是DOM2
级的变更事件
表示:DOM中某一部分发生变化时给出提示,变更事件是为XML
或者HTML DOM
设计的,并不特定于某种语言。
主要有:
contextmenu
上下文菜单事件
beforeunload
事件
window
对象DOMContentLoaded
事件
DOM
树完整造成以后触发window
对象readystatechange
事件
script
标签等readystate
的状态属性,会有如下状态(但不是全部状态都会正常变化)
uninitialized
未初始化状态loading
正在加载loaded
加载完毕interactive
能够操做对象complete
完成pagehide
和pageshow
事件
load
事件,不会从新加载页面,只是从页面回显event.persisted
是否被缓存在bfcache
中window
。。。太多了,还有好多事件类型,回头再填坑了,记录不下去了