MDN参考:https://developer.mozilla.org/zh-CN/docs/Web/Events
https://developer.mozilla.org/en-US/docs/Web/API/Event
input 焦点keyup
body监听 keyup? 回车?
事件流包括3个阶段: 事件捕获阶段 > 处于目标阶段 > 事件冒泡阶段
按照下面的例子:
给document html body div都添加onclick事件
事件捕获阶段事件触发顺序 : document > html > body >
处于目标阶段 : div >
事件冒泡阶段事件触发顺序 : body > html > document
事件冒泡(event bubbling)的概念:
即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。
<html>
<body>
<div>2</div>
</body>
</html>
<!--
比如一个div
沿着DOM树传递顺序: div > body > html > document
-->阻止冒泡:
event.stopPropagation() 或者 ie 下的方法 event.cancelBubble = true;
(event capturing)。事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。事件捕获的用意在于在事件到达预定目标之前捕获它。
<!--
按照上面的例子,传播顺序
document > html > body > div
-->一般建议使用冒泡,特殊时使用捕获
事件委托本质上是利用了浏览器事件冒泡的机制。因为事件在冒泡过程中会上传到父节点,并且父节点可以通过事件对象获取到目标节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件,这种方式称为事件代理。
使用事件代理我们可以不必要为每一个子元素都绑定一个监听事件,这样减少了内存上的消耗。并且使用事件代理我们还可以实现事件的动态绑定,比如说新增了一个子节点,我们并不需要单独地为它添加一个监听事件,它所发生的事件会交给父元素中的监听函数来处理。
addEventListener(事件名称,事件处理程序的函数, useCapture)
useCapture (布尔值):true表示在捕获阶段调用事件处理程序,false表示在冒泡阶段调用事件处理程序
addEventListener多个时会按照添加它们的顺序触发。
通过addEventListener添加的事件处理程序只能使用 removeEventListener()来移除。移除时传入的参数与添加时使用的参数相同。
通过 addEventListener 添加的匿名函数将无法删除
默认会冒泡
参考《JavaScript高级程序设计
在触发DOM上的某个事情时,会产生一个事件对象event。
cancelable
表明该事件是否可以被取消, true时才能被preventDefault();
preventDefault()
stopPropagation()
立即停止事件在DOM层次中的传播,取消进一步的事件捕获或冒泡
UI事件
不一定与用户操作有关的事件。
- load: 当页面完全加载后在window上触发;或者图像加载完在<img>元素触发;或者嵌入元素<object>
- error: window img object
- resize: window或框架,大小变化时
焦点事件
页面获得或失去焦点时触发,(document.hasFocus(), document.activeElement)
- blur 不会冒泡
- focus 不会冒泡
- focusin 会冒泡
- focusout 会冒泡
鼠标与滚轮
键盘与文本
复合
变动
HTML5
设备
触摸与手势
需要draggable = "true"
拖动的元素事件流:
-
dragstart
-
drag 持续
-
dragend
拖动移动到的目标元素事件流:
-
dragenter
-
dragover
/* 放下目标节点时触发事件 */
document.addEventListener("dragover", function( event ) {
// 阻止默认动作
event.preventDefault();
}, false);-
dragleave
-
drop
document.addEventListener("drop", function( event ) {
// 阻止默认动作(如打开一些元素的链接)
event.preventDefault();
// 移动拖动的元素到所选择的放置目标节点
if ( event.target.className == "dropzone" ) {
event.target.style.background = "";
dragged.parentNode.removeChild( dragged );
event.target.appendChild( dragged );
}
}, false);mouse事件type
mouseover: 在鼠标穿过元素和子元素的时候都会触发一次,并重新初始化mouse事件 mouseout:指针移出元素,或者移到它的子元素上。(会冒泡),每个当前元素以及子元素移出都会触发
mouseenter: 只有鼠标穿过绑定元素,才会触发mouseenter,且子元素不冒泡 mouseleave: 指针移出元素范围外。(不冒泡)
mousedown: 在元素上按下任意鼠标按钮。 mouseup: 在元素上释放任意鼠标按键。 mousemove: 指针在元素内移动时持续触发。
MouseEvent
https://developer.mozilla.org/zh-CN/docs/Web/API/MouseEvent/
- MouseEvent.clientX
它提供事件发生时的应用客户端区域的水平坐标 (与页面坐标不同)
父元素到子元素移动路径覆盖父元素盒子范围
父元素 mouseleave mouseover
子元素 mouseout
keyDown
https://developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent
KeyboardEvent.keycode大全
https://www.cnblogs.com/daysme/p/6272570.html
focus:获得焦点(不冒泡)
blur:失去焦点(不冒泡)