事件触发时,会将一个 Event 对象传递给事件处理程序,比如:
1 document.getElementById("testText").addEventListener("keydown", function (event) { alert(event.keyCode); }, false);
事件类型
DOM 事件类型是分为 UIEvent、UIEvent:KeyEvent、UIEvent:MouseEvent,不同的事件有不同的属性和方法,但常用的来说我们都不会用错,比如我们不会在鼠标事件中去取键盘值(Ctrl、Alt、Shift 除外),所以我们没有必要深究。
该对象的属性和方法有:
view 只读,对象,发生事件的 Window 对象。
type 只读,字符串。比如鼠标点击事件的类型:click。
eventPhase 只读,数字,事件流正经历的阶段。1-捕获,2-目标,3-冒泡。
target 只读,对象,派发事件的目标对象。比如鼠标是点击在哪个按钮上的。
currentTarget 只读,对象,当前正在调用监听器的对象,也就是当前 addEventListener 是绑定在哪个对象上的。
timeStamp 只读,数字,用毫秒表示事件发生时距计算机开机的时间。
cancelable 只读,布尔,处理事件的默认行为是否可以停止。主要针对一些系统事件,如果值为 true,则 event 的 preventDefault 方法可以使用,否则不可用。
preventDefault() 阻止浏览器的默认行为,比如在文本框中打字触发 keydown,如果 keydown 事件处理程序中调用了 preventDefault(),所打的字就不会跑到文本框中去,注意,此时不要弹出 alert 对话框,否则可能不起作用。IE 中在事件处理程序中用 return false 实现类似功能。
bubbles 只读,布尔,事件是否开启冒泡功能。
stopImmediatePropagation 这个东西在 JavaScript 中是个属性,而不是方法,布尔,但具体测试并未发现其用途,不知是不是 bug。
stopPropagation() 停止当前的事件流传播,但不会停止当前正在处理的对象。IE 中用 event.cancelBubble = true 实现类似功能。
cancelBubble 布尔,是否取消冒泡,不建议使用,用 stopPropagation() 代替。
preventBubble() 阻止冒泡,不建议使用,用 stopPropagation() 代替。
preventCapture() 阻止捕获,不建议使用,用 stopPropagation() 代替。
detail 只读,数字,提供时间的额外信息,对于 click 事件、mousedown 事件和 mouseup 事件,这个字段代表点击的次数。
isChar 只读,布尔,按下的按键值是否是字符,比如按下 Ctrl 键时,就返回 false。不过您在 Firefox 中测试时,该值总是 false,Firefox 官方已经说明这是一个 bug。
altKey 只读,布尔,是否按下了 Alt 键。
ctrlKey 只读,布尔,是否按下了 Ctrl 键。
shiftKey 只读,布尔,是否按下了 Shift 键。
metaKey 只读,布尔,是否按下了 Meta 键。
下面一些属性很有意思,请仔细区别。
charCode 只读,数字,字符(英文、数字、符号)的 Unicode 值。
keyCode 只读,数字,键盘按键值。
- 用于 keypress 时:返回非字符按键值(除 Ctrl、Shift、Alt、Caps Lock、单行文本框中按向上键等);
- 用于 keydown、keyup 时:返回任意键值。
button 只读,数字,鼠标按键值。
- 用于 click 时:0-左键。
- 用于 mousedown、mouseup 时:0-左键,1-中间键(滚轮),2-右键。
which 只读,数字,键盘按键值或鼠标按键值。
- 用于 keypress 时:等同于 charCode + 回退键 + 回车键;
- 用于 keydown、keyup 时:返回任意键值;
- 用于 click 时:1-左键,与 button 的值略有区别。
- 用于 mousedown、mouseup 时:1-左键,2-中间键(滚轮),3-右键,与 button 的值略有区别。
可以看出,which 只有一点没有包括:那就是 keypress 时,不如 keyCode 那么全,但实际上,keypress 事件中用于非字符键的情况较少,所以一般还是用 which 代替全部。