一、事件驱动简介
在用户通过浏览器实行交互性体验中,事件驱动这一概念,就因此而来。要想弄明白事件驱动,首先得清楚什么是事件和什么是事件处理程序这两个问题。
浏览者通过鼠标或键盘执行的操作称为事件,对此事件做出响应的代码称为事件处理程序,事件的发生使得相应的事件处理程序被执行称为事件驱动。
二、事件的分类
除浏览者对键盘或鼠标的操作可引发事件之外,浏览器及网页内部的某些对象的状态发生变化时,也会引发事件。
一般将事件分为两种:用户事件和系统事件。
2.1用户事件
用户事件细分可以分为:鼠标事件、键盘事件
鼠标事件有:
onmousedown 鼠标按键被按下
onmouseup 鼠标按键被松开
onmouseover 鼠标移到某元素表面之上
onmouseout 鼠标从某元素表面移开
onmousemove 鼠标在某元素表面持续移动
onclick 鼠标单击某元素
ondblclick 鼠标双击某元素
键盘事件有:
onkeydown 键盘按键被按下
onkeyup 键盘按键被松开
onkeypress 键盘按键被按下并松开
2.2系统事件
系统事件可以细分为:window对象事件、Form对象事件、焦点事件、数据变更事件等
window对象事件有:
onload 浏览器加载一个网页文档或一个图像完成时
onunload 浏览器卸载一个网页文档时
onresize 浏览器窗口或框架的尺寸发生变化时
onscroll 浏览器窗口或框架中的网页发生滚动时
Form对象事件有:
onsubmit表单提交时
onreset 表单重置时
焦点事件有:
onfocus界面元素获得焦点时
onblur 界面元素失去焦点时
数据变更事件有:
onchange 表单中的文本元素内容发生变化时或列表框发生选项切换时
三 、事件处理程序
3.1事件与事件处理程序的关联方式
3.1.1标签的事件属性示例:
alert("body标签的onload属性 .页面加载");
}
<body οnlοad="body_load();"></body>
3.1.2对象的事件属性示例:
对象.事件属性 = 事件处理程序;
</script>
alert("Window对象的onresize事件.窗口尺寸变化");
}
window.onresize = window_resize;
3.1.3attachEvent或addEventListener
document.getElementById("txt_1").value = "";
}
function bindEventHandler() {
if(document.all) {
document.getElementById("btn_2").attachEvent("onclick" ,clearText);
} else {
document.getElementById("btn_2").addEventListener("click" , clearText , false);
}
document.getElementById("btn_2").value="已经为click事件绑定了事件处理程序";
}
<form >
<input type="button" id="btn_1" name="btn" value="点击" οnclick="bindEventHandler();"/>
<input type="button" id="btn_2" name="btn" value="暂时没有事件处理程序" />
<input type="text" id="txt_1" name="txt" value="默认文本" />
</form>
四、事件对象
4.1事件对象的获取示例
<head>
<script>
function fun(evt)
{
//[事件处理程序,在这里可用形参evt表示Event事件对象]
alert('evt.button返回当事件被触发时,哪个鼠标按钮被点击:' + evt.button);
alert(' evt.clientX返回当事件被触发时,鼠标指针相对于页面正文的水平坐标:' + evt.clientX);
alert('evt.clientY返回当事件被触发时,鼠标指针相对于页面正文的垂直坐标:'+evt.clientY);
alert('evt.screenX返回当事件被触发时,鼠标指针相对于页面正文的垂直坐标:'+evt.screenX);
alert('evt.screenY返回当事件被触发时,鼠标指针相对于页面正文的垂直坐标:'+evt.screenY);
alert('evt.ctrlKey返回当事件被触发时,"CTRL" 键是否被按下:'+evt.ctrlKey);
alert('evt.shiftKey返回当事件被触发时,"SHIFT" 键是否被按下:'+evt.shiftKey);
alert('evt.altKey返回当事件被触发时,"ALT" 键是否被按下:'+evt.altKey);
alert('evt.type返回事件的类型:'+evt.type);
alert('evt.keyCode返回键的虚拟键盘代码或此键的字符的Unicode码。:'+evt.keyCode);}
</script>
</head>
<body>
<input type="button" id="btn" value="点我" οnclick="fun(event);"/>
</body>
</html>
4.2事件对象的属性
clientX 返回当事件被触发时,鼠标指针相对于页面正文的水平坐标。
clientY 返回当事件被触发时,鼠标指针相对于页面正文的垂直坐标。
screenX 返回当某个事件被触发时,鼠标指针相对于屏幕的水平坐标。
screenY 返回当某个事件被触发时,鼠标指针相对于屏幕的垂直坐标。
ctrlKey 返回当事件被触发时,"CTRL" 键是否被按下。
shiftKey 返回当事件被触发时,"SHIFT" 键是否被按下。
altKey 返回当事件被触发时,"ALT" 是否被按下。
type 返回事件的类型。
keyCode 返回键的虚拟键盘代码或此键的字符的Unicode码。
4.3事件源的获取
可以使用事件对象的srcElement属性访问事件源,但这只适用于IE浏览器。
其他浏览器中可使用target属性代替。
var targetElement;
if(document.all) {
targetElement = event.srcElement;
} else {
targetElement = event.target;
}
alert(targetElement.value);
}
<form >
<input type="button" name="btnA" id="btn_1" value="按钮A" οnclick="doclick(event);"/>
<input type="button" name="btnB" id="btn_2" value="按钮B" οnclick="doclick(event);"/>
</form>
4.4阻止事件的默认动作
在IE浏览器中,可以为事件对象的returnValue属性赋值为false实现这一目标,
而在其他浏览器中则要调用事件对象的preventDefult()方法。
五、典型应用
5.1跟随滚动条移动的广告
5.2表单数据有效性验证
5.3即时显示验证失败的错误消息
5.4列表框级联
六、小结
用户事件是指浏览者通过鼠标或键盘操作界面元素引发的事件。
系统事件是指浏览器对象和网页元素对象的状态发生变化而引发的事件。
事件与事件处理程序的关联方式有三种:
1、在标签中为事件属性赋值,
2、在<script></script>脚本块中为对象的事件属性赋值此,
3、使用attachEvent方法或addEventListener()方法绑定。
事件对象提供与每一次事件相关的信息。如事件的类型,返回值,光标的位置,哪个键引发等。