HTML 事件
HTML 4 中新增了 HTML 事件触发浏览器行为(JavaScript 语句)。HTML 5 新增了更多的事件。
事件的使用
参考:事件介绍@MDN
使用事件处理器属性
const btn = document.getElementById("btn");
btn.onclick = function() => { console.log("123"); }
注意,这里只能绑定一个事件。或者可以通过赋值为 null 消除事件。(实际上相当于给这个东西加了一个属性,叫做 onclick
)
行内处理器(不建议)
<button onclick="func()">Press</button>
- 不建议混写 HTML、JS
- 这种形式会导致维护混乱(比如如果一堆按钮)
add/removeEventListener
target.addEventListener(type, listener);
target.addEventListener(type, listener, options);
target.addEventListener(type, listener, useCapture);
target.removeEventListener(type, listener[, options]);
target.removeEventListener(type, listener[, useCapture]);
type: 事件类型(没有 on)
listener:处理器(函数)
注:删除的时候如果提供的处理器未注册,无事发生。
注2:仅能移除通过 addEventListener
添加的事件,通过上面两种不可以。
jQuery
$(selector).on(event, childSelector, data, handler)
event: 必需。事件类型(不写 on)
childSelector:进一步选中子元素(可以不写)
data: 可选。被传递给 event.data 的东西
handler: 可选。规定当事件发生时运行的函数
冒泡和捕获
Event.cancelBubble
是Event.stopPropagation
的曾用名,取消冒泡- 冒泡与捕获@javascript.info
事件类型
窗口事件(由 body 标签触发)
属性 | 描述 | 备注 |
---|---|---|
onblur | 当失去焦点的时候执行脚本 | |
onfocus | 当获取焦点的时候执行 | |
onerror | 当发生错误的时候执行 | |
onload | 文档加载完成之后 | |
onunload | 关闭页面的时候执行脚本 | |
onresize | 窗口大小发生调整 | |
onstorage | 当 Web Storage 区域更新时 | 可以用来监控 localStorage。可以用来实现同域不同页面通信 |
表单事件(在 HTML 表单 form
内的组件触发)
属性 | 描述 | 备注 |
---|---|---|
onblur | 失去焦点 | |
onfocus | 获取焦点 | |
oncontextmenu | 触发上下文菜单 | |
onforminput | 表单输入 | |
onsubmit | 表单提交 |
键盘
属性 | 描述 | 备注 |
---|---|---|
onkeydown | 按键按下(未完成输入内容) | |
onkeyup | 按键抬起(此时已经完成输入内容) | |
onkeypress | 按键按下时触发(实际上是相当于有内容输入) |
document.addEventListener("keyup", function () { console.log("keyup"); });
document.addEventListener("keydown", function () { console.log("keydown"); });
document.addEventListener("keypress", function () { console.log("keypress"); });
触发情况
短按: onkeydown
-> onkeypress
-> onkeyup
长按:onkeydown
-> onkeypress
-> onkeydown
-> onkeypress
-> ... -> onkeyup
注意:
onkeypress
浏览器支持不是很好(MDN 建议使用beforeinput
和onkeydown
替代,参考链接)onkeypress 有一些问题,比如
- 中文不友好(无法响应中文输入)
- 以及无法响应系统功能键(比如
backspace
,delete
,insert
,home
,shift
等) - 因为识别的是输入内容,所以 keycode 可能不一样。比如,
a
,A
的keycode
,在onkeydown
里面都是 65(大写 A),而onkeypress
里面,大写 A 是 65,小写是 97. (其他参数具体再看) - 对于组合键,比如
Ctrl + A
这种,第一个onkeydown
检测到的是ctrl
,然后第二个检测到的是A
,且ctrlKey
标记为true
。如果组合键没有实际输入内容,不会触发onkeypress
鼠标
属性 | 描述 | 备注 |
---|---|---|
onmousedown | 鼠标按下 | |
onmousemove | 鼠标移动 | |
onmouseenter | 鼠标进入当前组件区域 | |
onmouseover | 鼠标在当前区域上移过 | |
onmouseleave | 鼠标离开(后面附注) | |
onmouseout | 鼠标离开 | |
onmouseup | 鼠标按下的键抬起 | |
onclick | 鼠标点击(当 up 之后才发生) | |
ondblclick | 双击 | |
ondrag | 拖动的时候持续触发 | |
ondragstart | 拖动开始 | |
ondragenter | 拖动进入目标元素 | |
ondragover | 在目标元素内移动 | |
ondragleave | 离开目标元素 | |
ondragend | 拖动释放触发 | |
ondrop | 拖动到目标元素之后触发 |
onmouseleave
和 onmouseenter
,不支持冒泡,也就是说,必须要由外层的区域触发才行。
onmouseout
和 onmouseover
,支持冒泡,内层触发的时候也会触发
onmouseout
仅考虑可视区域(进入子元素被遮挡也会触发(MDN)),而 onmouseleave
, onmouseenter
, onmouseover
都是支持被炸当区域的
从绿色区域进去,然后原路出来. 绿色 1,蓝色 2
over 1(移到元素上)
enter 1(进入)
out 1(离开绿色,进入蓝色区域。不包含非可视区域)
over 2(移动到 2 上)
over 1(冒泡 2,显示为 1。添加 stopPropagation 会消失)
enter 2(进入 2)
// ===================
out 2
out 1(冒泡)
leave 2
over 1
out 1
leave 1
从蓝色区域进去
over 2
over 1
enter 1
enter 2
out 2
out 1
leave 2
over 1
// ===================
out 1
over 2
over 1
enter 2
out 2
out 1
leave 2
leave 1
<!--
实例
响应键盘按键
相应鼠标操作
劫持打开 devtools
文档加载完成
鼠标跟随
-->