JavaScript事件是由访问Web页面的用户引起的一系列操作,例如:用户点击。当用户执行某些操作的时候,再去执行一系列代码。
一.事件介绍
事件一般是用于浏览器和用户操作进行交互。最早是IE和Netscape Navigator中出现,作为分担服务器端运算负载的一种手段。直到几乎所有的浏览器都支持事件处理。而DOM2级规范开始尝试以一种复合逻辑的方式标准化DOM事件。IE9、Firefox、Opera、Safari和Chrome全都已经实现了“DOM2级事件”模块的核心部分。IE8之前浏览器仍然使用其专有事件模型。
JavaScript有三种事件模型:内联模型、脚本模型和DOM2模型。
二.内联模型
这种模型是最传统接单的一种处理事件的方法。在内联模型中,事件处理函数是HTML标签的一个属性,用于处理指定事件。虽然内联在早期使用较多,但它是和HTML混写的,并没有与HTML分离。
//在HTML中把事件处理函数作为属性执行JS代码
<input type="button" value="按钮" onclick="alert('Mumu');" /> //注意单双引号
//在HTML中把事件处理函数作为属性执行JS函数
<input type="button" value="按钮" onclick="box();" /> //执行JS的函数
PS:函数不得放到window.onload里面,这样就看不见了。
三.脚本模型
由于内联模型违反了HTML与JavaScript代码层次分离的原则。为了解决这个问题,我们可以在JavaScript中处理事件。这种处理方式就是脚本模型。
var input = document.getElementsByTagName('input')[0]; //得到input对象
input.onclick = function () { //匿名函数执行
alert('Mumu');
};
PS:通过匿名函数,可以直接触发对应的代码。也可以通过指定的函数名赋值的方式来执行函数(赋值的函数名不要跟着括号)。
input.onclick = box; //把函数名赋值给事件处理函数
四.事件处理函数
JavaScript可以处理的事件类型为:鼠标事件、键盘事件、HTML事件。
JavaScript事件处理函数及其使用列表
事件处理函数 | 影响的元素 | 何时发生 |
---|---|---|
onabort | 图像 | 当图像加载被中断时 |
onblur | 窗口、框架、所有表单对象 | 当焦点从对象上移开时 |
onchange | 输入框,选择框和文本区域 | 当改变一个元素的值且失去焦点时 |
onclick | 链接、按钮、表单对象、图像映射区域 | 当用户单击对象时 |
ondblclick | 链接、按钮、表单对象 | 当用户双击对象时 |
ondragdrop | 窗口 | 当用户将一个对象拖放到浏览器窗口时 |
onError | 脚本 | 当脚本中发生语法错误时 |
onfocus | 窗口、框架、所有表单对象 | 当单击鼠标或者将鼠标移动聚焦到窗口或框架时 |
onkeydown | 文档、图像、链接、表单 | 当按键被按下时 |
onkeypress | 文档、图像、链接、表单 | 当按键被按下然后松开时 |
onkeyup | 文档、图像、链接、表单 | 当按键被松开时 |
onload | 主题、框架集、图像 | 文档或图像加载后 |
onunload | 主体、框架集 | 文档或框架集卸载后 |
onmouseout | 链接 | 当鼠标标移出时 |
onmouseover | 链接 | 当鼠标移到时 |
onmove | 窗口 | 当浏览器窗口移动时 |
onreset | 表单复位按钮 | 单击表单的reset按钮 |
onresize | 窗口 | 当选择一个表单对象时 |
onselect | 表单元素 | 当选择一个表单对象时 |
onsubmit | 表单 | 当发送表格到服务器时 |
PS:所有的事件处理函数都会都有两个部分组成,on + 事件名称,例如click事件的事件处理函数就是:onclick。在这里,我们主要谈论脚本模型的方式来构建事件,违反分离原则的内联模式,我们忽略掉。
对于每一个事件,它都有自己的触发范围和方式,如果超出了触发范围和方式,事件处理将失效。
1.鼠标事件,页面所有元素都可触发
click:当用户单击鼠标按钮或按下回车键时触发。
input.onclick = function () {
alert('Mumu');
};
dblclick:当用户双击主鼠标按钮时触发。
input.ondblclick = function () {
alert('Mumu');
};
mousedown:当用户按下了鼠标还未弹起时触发。
input.onmousedown = function () {
alert('Mumu');
};
mouseup:当用户释放鼠标按钮时触发。
input.onmouseup = function () {
alert('Mumu');
};
mouseover:当鼠标移到某个元素上方时触发。
input.onmouseover = function () {
alert('Mumu');
};
mouseout:当鼠标移出某个元素上方时触发。
input.onmouseout = function () {
alert('Mumu');
};
mousemove:当鼠标指针在元素上移动时触发。
input.onmousemove = function () {
alert('Mumu');
};
2.键盘事件
keydown:当用户按下键盘上任意键触发,如果按住不放,会重复触发。
onkeydown = function () {
alert('Mumu');
};
keypress:当用户按下键盘上的字符键触发,如果按住不放,会重复触发。
onkeypress = function () {
alert('Mumu');
};
keyup:当用户释放键盘上的键触发。
onkeyup = function () {
alert('Mumu');
};
3.HTML事件
load:当页面完全加载后在window上面触发,或当框架集加载完毕后在框架集上触发。
window.onload = function () {
alert('Mumu');
};
unload:当页面完全卸载后在window上面触发,或当框架集卸载后在框架集上触发。
window.onunload = function () {
alert('Mumu');
};
select:当用户选择文本框(input或textarea)中的一个或多个字符触发。
input.onselect = function () {
alert('Mumu');
};
change:当文本框(input或textarea)内容改变且失去焦点后触发。
input.onchange = function () {
alert('Mumu');
};
focus:当页面或者元素获得焦点时在window及相关元素上面触发。
input.onfocus = function () {
alert('Mumu');
};
blur:当页面或元素失去焦点时在window及相关元素上触发。
input.onblur = function () {
alert('Mumu');
};
submit:当用户点击提交按钮在<form>元素上触发。
form.onsubmit = function () {
alert('Mumu');
};
reset:当用户点击重置按钮在<form>元素上触发。
form.onreset= function () {
alert('Mumu');
};
resize:当窗口或框架的大小变化时在window或框架上触发。
window.onresize = function () {
alert('Mumu');
};
scroll:当用户滚动带滚动条的元素时触发。
window.onscroll = function () {
alert('Mumu');
};
事件对象
学习要点:
- 事件对象
- 鼠标事件
- 键盘事件
- W3C与IE
一.事件对象
事件处理函数的一个标准特性是,以某些方式访问的事件对象包含有关于当前事件的上下文信息。
事件处理三部分组成:对象.事件处理函数=函数。例如:单击文档任意处。
document.onclick = function () {
alert('Mumu');
};
PS:以上程序的名词解释:click表示一个事件类型,单击。onclick表示一个事件处理函数或绑定对象的属性(或者叫事件监听器、侦听器)。document表示一个绑定的对象,用于触发某个元素区域。function()匿名函数是被执行的函数,用于触发后执行。
除了用匿名函数的方法作为被执行的函数,也可以设置成独立的函数。
document.onclick = box; //直接赋值函数名即可,无须括号
function box() {
alert('Mumu');
}
this关键字和上下文
在面向对象那章我们了解到:在一个对象里,由于作用域的关系,this代表着离它最近对象。
var input = document.getElementsByTagName('input')[0];
input.onclick = function () {
alert(this.value); //HTMLInputElement,this表示input对象
};
从上面的拆分,我们并没有发现本章的重点:事件对象。那么事件对象是什么?它在哪里呢?当触发某个事件时,会产生一个事件对象,这个对象包含着所有与事件有关的信息。包括导致事件的元素、事件的类型、以及其它与特定事件相关的信息。
事件对象,我们一般称作为event对象,这个对象是浏览器通过函数把这个对象作为参数传递过来的。那么首先,我们就必须验证一下,在执行函数中没有传递参数,是否可以得到隐藏的参数。
function box() { //普通空参函数
alert(arguments.length); //0,没有得到任何传递的参数
}
input.onclick = function () { //事件绑定的执行函数
alert(arguments.length); //1,得到一个隐藏参数
};
通过上面两组函数中,我们发现,通过事件绑定的执行函数是可以得到一个隐藏参数的。说明,浏览器会自动分配一个参数,这个参数其实就是event对象。
input.onclick = function () {
alert(arguments[0]); //MouseEvent,鼠标事件对象
};
上面这种做法比较累,那么比较简单的做法是,直接通过接收参数来得到即可。
input.onclick = function (evt) { //接受event对象,名称不一定非要event
alert(evt); //MouseEvent,鼠标事件对象
};
直接接收event对象,是W3C的做法,IE不支持,IE自己定义了一个event对象,直接在window.event获取即可。
input.onclick = function (evt) {
var e = evt || window.event; //实现跨浏览器兼容获取event对象
alert(e);
};
二.鼠标事件
鼠标事件是Web上面最常用的一类事件,毕竟鼠标还是最主要的定位设备。那么通过事件对象可以获取到鼠标按钮信息和屏幕坐标获取等。
1. 可视区及屏幕坐标
事件对象提供了两组来获取浏览器坐标的属性,一组是页面可视区左边,另一组是屏幕坐标。
坐标属性
属性 说明
clientX 可视区X坐标,距离左边框的位置
clientY 可视区Y坐标,距离上边框的位置
screenX 屏幕区X坐标,距离左屏幕的位置
screenY 屏幕区Y坐标,距离上屏幕的位置
document.onclick = function (evt) {
var e = evt || window.event;
alert(e.clientX + ',' + e.clientY);
alert(e.screenX + ',' + e.screenY);
};
2.修改键
有时,我们需要通过键盘上的某些键来配合鼠标来触发一些特殊的事件。这些键为:Shfit、Ctrl、Alt和Meat(Windows中就是Windows键,苹果机中是Cmd键),它们经常被用来修改鼠标事件和行为,所以叫修改键。
修改键属性
属性 说明
shiftKey 判断是否按下了Shfit键
ctrlKey 判断是否按下了ctrlKey键
altKey 判断是否按下了alt键
metaKey 判断是否按下了windows键,IE不支持
三.键盘事件
1.键码
在发生keydown和keyup事件时,event对象的keyCode属性中会包含一个代码,与键盘上一个特定的键对应。对数字字母字符集,keyCode属性的值与ASCII码中对应小写字母或数字的编码相同。字母中大小写不影响。
document.onkeydown = function (evt) {
alert(evt.keyCode); //按任意键,得到相应的keyCode
};
不同的浏览器在keydown和keyup事件中,会有一些特殊的情况:
在Firefox和Opera中,分号键时keyCode值为59,也就是ASCII中分号的编码;而IE和Safari返回186,即键盘中按键的键码。
PS:其他一些特殊情况由于浏览器版本太老和市场份额太低,这里不做补充。
2.字符编码
Firefox、Chrome和Safari的event对象都支持一个charCode属性,这个属性只有在发生keypress事件时才包含值,而且这个值是按下的那个键所代表字符的ASCII编码。此时的keyCode通常等于0或者也可能等于所按键的编码。IE和Opera则是在keyCode中保存字符的ASCII编码。
function getCharCode(evt) {
var e = evt || window.event;
if (typeof e.charCode == 'number') {
return e.charCode;
} else {
return e.keyCode;
}
}
PS:可以使用String.fromCharCode()将ASCII编码转换成实际的字符。