事件流
- 捕获阶段
- 由网景公司提出,处
IE
其他浏览器兼容 - 事件由
document
发起,最终到目标元素 document --> html -->body --> 目标元素
- 由网景公司提出,处
- 目标阶段
- 事件触发至目标元素后触发
- 冒泡阶段
- 由
IE
提出,所有浏览器都支持事件冒泡 - 由目标阶段向
document
触发 目标元素 --> body --> html --> document
- 由
事件处理程序
- DOM0级事件处理程序
dom.onclick= function(){ alert( 'dom0级事件处理程序' ) }
- 等等
- DOM2级事件处理程序
- DOM2级增加两个方法
-
dom.addEventListener()
事件监听方法 -
dom.removeEventListener()
取消监听方法 - 两个方法都接收两个参数
- 参数一
事件名称
- 参数二
事件处理程序
- *注意 在取消监听事件时 如果第二个参数传入匿名函数将无法取消。
-
IE
事件监听方法名有所不同 -
dom.attachEvent() & dom.detachEvent()
- 该方法事件处理程序中得作用域指向全局作用域
- 相同
dom
元素添加多个事件时,已最新的开始执行
dom.attachEvent('onclick',function(){ alert(2) }) dom.attachEvent('onclick',function(){ alert(1) })
- 参数一
事件对象
- 兼容
DOM
得浏览器会将一个event
对象传入到事件处理程序中。DOM0/DOM2
- 事件对象中得属性
bubbles:
表示事件是否冒泡。
cancelable:
表示是否取消默认行为。
currentTarget:
当前元素。
defaultPrevented:
值为true
表示调用了preventDefautl()
取消默认行为。
detail:
事件相关详细信息。
eventPhase:
事件阶段 1.捕获 2.目标 3.冒泡。
preventDefautl():
取消默认行为cancelable为true则可以使用这个方法
。
stopPropagation():
阻断事件流bubbles为true则可以使用这个方法
。
target:
事件目标。
trusted:
true
表示浏览器生成false
则表示开发人员创建。
type:
事件类型。
view:
与时间关联得抽象视图。
事件类型
- UI事件
load:
所有元素加载完成。
unload:
页面完全卸载。
abort:
当用户停止下载,没有加载完成时。
error:
发生错误,在window
上触发。
select:
用户选择文本框。
resize:
窗口大小变化。
scroll:
带有滚动条的元素,滚动条发生滚动时触发。
能力检测:
document.implementation.hasFeature('UIEvent','3.0')
- 焦点事件
blur/focus:
获得/失去焦点触发。
focusIn/focusOut:
获得/失去焦点触发。
DOMfocusIn/DOMfousOut:
只有Opera
支持获取/失去焦点触发。 - 鼠标事件
click/dblclick:
单双击触发。
mousedown/mouseup
:按下/释放鼠标按键触发。
mouseenter/mouseover:
移入移出。
mousemove:
鼠标在元素内移动重复触发。
dblclick事件触发流程:
mousedown-->mouseup-->click-->mousedown-->mouseup-->click-->dblclick
IE8及之前版本:
mousedown-->mouseup-->click-->mouseup-->dblclick
- 滚轮事件
- 文本事件/键盘事件
keydown/keyup:
按下键盘任意键触发。
keypress:
按下字符键触发Esc
也会触发。
textInput:
用户在可编辑区域输入字符时触发DOM3新增
。-
textInput
的事件对象中包含inputMethod
属性可以判断已哪种方式将文字输。入至文本框page.383
。
-
- 复合事件
-
DOM3
新增事件 处理IME
输入序列Input Method Editor(富文本)
。
compositionstart/compositionend:
富文本打开/关闭时触发。
compositionupdate:
在向输入字段中插入新字符时触发。
-
- 变动事件
DOM2
级变动事件,在DOM
发生改变时触发。
DOMSubtreeModified:
DOM
结构发生改变时触发,任何变动事件都会触发该事件。
DOMNodeInserted/DOMNodeRemoved:
插入删除时触发。
DOMNodeInsertedIntoDocument/DOMNodeRemovedFromDocument:
直接插入/删除文档中得元素触发,此事件触发在DOMNodeInserted/DOMNodeRemoved
之后触发。 - H5事件
contextmenu:
上下文菜单,表示何时应该显示上下文菜单,以便开发人员取消默认的上下文菜单而提供自定义的菜单。
beforeunload:
页面完全卸载前触发。
DOMContentLoaded:
在形成完整DOM
树之后触发。
pageshow/pagehiden:
firefox
或Oprea
有一个特性,名叫往返缓存(back-forward cache,或bfcache)
,在用户点击前进/后退
按钮时加快页面转换速度,这个缓存中不仅保存着页面数据,还保存了DOM
和JavaScript
的状态,实际上是将整个页面都保存在了内存里。如果页面位于bfcache
中,再次打开页面不会触发load
事件。pageshow
会在load
事件触发后触发。pagehide
会在unload
事件之前触发。
hashchange:
url参数列表#后面
发生改变时触发。H5新增
readystatechange:
文档或元素加载状态有关信息,行为难以预料。-
uninitialized:
对象存在尚未初始化。 -
loading:
对象正在加载数据。 -
loaded:
对象加载数据完成。 -
insteractive:
可以操作对象了,但还没有完全加载数据。 -
complete:
对象已经加载完成。
-
内存性能
- 在页面中添加含有事件的元素过多,可能会出现性能问题。可以使用事件委托,利用事件冒泡将事件监听尽可能绑定在外层容器,然后通过
type,target
等属性确定目标全素进行处理。好处是减少了事件监听程序的数量。
模拟事件
- 模拟事件,在
DOM
元素上,绑定模拟事件,可以模拟触发指定事件,比如我在单击某个元素的时候可以触发双击/移出/移入等事件。page.405
网友评论