这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
事件本身相当直观,常用的有:
Javascript 中的事件都是与对象相关联的,而不是语言本身所有,当 Javascript 在浏览器中运行的时候,事件与每个浏览器实现的 DOM 模型有关。
事件 | 描述 |
abort | 图片被阻止而不能加载 |
blur,focus | 失去焦点,获得焦点 |
change | 适用于表单元素,当元素使其焦点的时候判断是否发生改变 |
click,dblclick | 单击,双击 |
keydown,keyup,keypress | 按下键,键离开,按下键的时候触发,注意 keypress 只对数字字母键有效 |
load | 加载图片或者页面的时候 |
mousedown,mouseup | 按下键,放开键 |
mouseover,mouseout | over 是当鼠标进入的时候出发,out 是离开的时候触发 |
mousemove | 鼠标移动 |
reset,submit | 重置和提交表单 |
以上仅仅是常用的事件的列表,完整具体的列表可以查找相关手册。
1. 0 级 DOM 上的事件处理0 级 DOM 上的事件处理方法是比较早的,目前也广泛应用,从 IE4.0 开始就支持这类方法。
1.1 事件注册下面主要介绍如何添加响应事件,也就是为事件添加处理程序。 (1)内联注册(inline registration) 这是最简单的一种,将事件响应程序作为 html 标签的一个属性来设置,如下例,可以是代码,当然更多情况下是一个函数调用。事件的句柄一般就是事件的名称加上前缀 on。
[Ctrl+A 全选 注:
- <html>
- <head>
- <title>event sample</title>
- <style type="text/CSS">
- #adiv{
- width:200px;
- height:200px;
- background-color:#00aa00;
- }
- </style>
- </head>
- <body>
- <div onmouseover="this.innerHTML+='OK'" >
- a
- </div>
- </body>
- </html>
如需引入外部 Js 需刷新才能执行
]这种方法很简单,任何浏览器都支持,缺点是将 Javascript 代码和 HTML 代码混杂在一起,而且不能动态添加事件响应程序,也不能添加多个响应程序。
(2)传统模式 (traditional registration)这种模式将事件作为对象的属性进行添加。例如:
[Ctrl+A 全选 注:
- <script type="text/javascript">
- function helloWorld() {
- alert("Hello World");
- var d = document.getElementById("adiv");
- d.onmouseout = function() {
- this.innerHTML += 'Bye';
- }
- }
- window.onload = helloWorld;
- </script>
如需引入外部 Js 需刷新才能执行
]1.2 事件的参数(Event 对象)有些事件处理程序需要一些关于事件更多的信息,比如 click 事件发生的位置等。这些信息是通过事件参数传给事件处理程序的。IE 事件模型和 W3C 事件模型对此的实现是不同的。 IE 把 event 对象作为 window 对象的一个属性,而 W3C 把 event 对象作为处理程序的一个参数。下面以 click 事件为例,分别写一个程序用于 IE 和支持 W3C 标准的浏览器。
[Ctrl+A 全选 注:
- <html>
- <head>
- <title>
- event sample
- </title>
- <style type="text/css">
- #adiv{ width:200px; height:200px; background-color:#00aa00; }
- </style>
- <script type="text/javascript">
- function IEClick() {
- var res = document.getElementById("result");
- var s;
- for (var p in window.event) {
- s += p.toString() + ":" + window.event[p] + "
- ";
- }
- res.innerHTML = s;
- }
- function W3CClick(args) {
- var res = document.getElementById("result");
- var s;
- for (var p in args) {
- s += p.toString() + ":" + args[p] + "
- ";
- }
- res.innerHTML = s;
- }
- </script>
- </head>
- <body>
- <div onclick="W3CClick(event)">
- a
- </div>
- <div>
- </div>
- </body>
- </html>
如需引入外部 Js 需刷新才能执行
]这一段页面代码可以把 click 事件对象的所有属性都展示出来。上面的例子是 W3C 的浏览器所用的方法,要在 IE 下使用,只要改成 onclick="IEClick()". 注意,W3CClick 中的参数名,只能是 event。打印出来的属性很多,我分别用 FF3.5,Chrome3,IE8(标准模式和兼容模式)运行,他们共有的属性并不多,其实也就这些共有的属性才有意义,他们是: altKey,shiftKey,ctrlKey: 是否按下 alt,shift,ctrl 键 clientX,clientY: 客户区坐标(浏览器窗口),screenX,screenY:屏幕区坐标
type: 事件类型虽然事件的参数的传递方式有点不同,但是对于写跨浏览器的代码也没有造成太多的麻烦,只需要在函数一开始判断下 window.event 有没有定义即可。
- function BothClick(args) {
- var evnt = window.event ? window.event : args;
- alert(evnt.clientX);
- }
注册句柄为:
如果采用第二种方式注册句柄,则不需要什么特别处理。
1.3 事件的浮升页面上的对象通常是重叠的,比如一个 div 中可以包括若干 div 或者其他元素。当某一事件触发的时候,同时有多个元素受影响,并且它们都有相应的事件处理程序,那么这些事件处理程序执行哪些?以何种顺序执行?这就是本节要讨论的问题。通常情况下,一个事件被多个句柄捕获的情形并不多见。先看一个例子 (CSS 省略):
[Ctrl+A 全选 注:
- <script type="text/javascript">
- function body_click(){
- var dis=document.getElementById("res");
- dis.innerHTML+="Body Click
- ";
- }
- function out_click(){
- var dis=document.getElementById("res");
- dis.innerHTML+="Outer Click
- ";
- }
- function inner_click(){
- var dis=document.getElementById("res");
- dis.innerHTML+="Inner Click
- ";
- }
- </script>
- </head>
- <body onclick="body_click()">
- <div onclick="out_click()">
- Outer Div
- <div onclick="inner_click()" >
- Inner Div
- </div>
- </div>
- <div>
- </div>
- </body>
如需引入外部 Js 需刷新才能执行
]在 body,外层 div 和内层 div 都响应了 click 事件,结果如下:
可见,事件是由内向外层的元素依次触发的。(一般教材上的说法是向上浮升,bubbling, 我觉得这个向上是有歧义的,我一开始就误认为内层的元素是上面的,因为它能覆盖外层的元素)用 0 级 DOM 注册的事件,它的浮升方法无论是 IE 还是 W3C 都是统一的。 1.4 浮升的取消 有时候我们需要在响应了一个事件之后,就不需要外层的元素再响应了,可以取消事件的浮升。取消的方法 IE 和 W3C 是不一致的。IE 是通过设置事件对象的 cancelBubble 属性来实现,W3C 则是调用事件对象的 stopPropagation 方法。 例如上面的例子改为:
- function inner_click(arg){
- var evnt=window.event?window.event:arg;
- var dis=document.getElementById("res");
- dis.innerHTML+="Inner Click <br/>";
- if(evnt.stopPropagation){
- evnt.stopPropagation();
- }else{
- evnt.cancelBubble=true;
- }
- }<div id="innerdiv" onclick="inner_click(event)" >
其他不变,这样就只能看到一行输出。 1.5 事件处理函数中的 this 这个 this 指向的是触发事件的对象。下面介绍 2 级 DOM 的事件句柄。这种方式是比较新的方式,它不依赖于任何特定的事件句柄属性。W3C 规定的方式是 object.addEventListener('event',function,boolean) 第一个参数是事件名,第二个是事件响应函数,第三个变量如果是 true,则事件函数在事件冒泡阶段被触发,否则是在事件的捕获阶段被触发。W3C 规定事件的发生有两个阶段,首先是捕获,即事件以此从最外层层的元素向内层传递,相应的事件处理函数被依次触发,然后是冒泡阶段,事件从最内层的元素向外层传递。 看一个例子:
[Ctrl+A 全选 注:
- <html>
- <head>
- <title>
- DOM 2 Event
- </title>
- <script type="text/javascript">
- function setup() {
- var div = document.getElementById('testDiv');
- div.addEventListener('click',
- function() {
- alert('div true');
- },
- true);
- document.addEventListener('click',
- function() {
- alert('body true');
- },
- true);
- div.addEventListener('click',
- function() {
- alert('div false');
- },
- false);
- document.addEventListener('click',
- function() {
- alert('body false');
- },
- false);
- }
- window.onload = setup;
- </script>
- </head>
- <body>
- <div>
- </div>
- <body>
- </html>
如需引入外部 Js 需刷新才能执行
]点击灰色框,会依次弹出 body true,div true,div false,body false. 很遗憾,IE 不支持这种方式, 最新的 IE8 也不支持。不过 IE 也有类似的注册事件的方法,名字是 attachEvent. 不过这个方法没有第三个参数,它支持冒泡阶段的事件响应。attachEvent 函数传递事件参数的时候是和 W3C 一致的,也是通过 event 参数传递,但是,其函数内部的 this 指向的不是触发事件对象,而永远指向 window。在 event 对象中有一个属性指向触发该事件的对象,W3C 中是 target,IE 中是 srcElement, 在符合 W3C 规范的浏览器中,事件处理函数中的 this 和 event.target 指向的是同一个对象。下面的程序展示了一个 IE 和 W3C 兼容的事件处理程序:
[Ctrl+A 全选 注:
- <html>
- <head>
- <title>
- DOM 2 Event
- </title>
- <script type="text/javascript">
- function ClickMe(event) {
- var target1 = event.target ? event.target: event.srcElement;
- alert(target1.innerHTML);
- }
- function setup() {
- var div = document.getElementById('testDiv');
- if (div.addEventListener) {
- div.addEventListener('click', ClickMe, false);
- } else {
- div.attachEvent('onclick', ClickMe);
- }
- }
- window.onload = setup;
- </script>
- </head>
- <body>
- <div>
- Hello World.
- </div>
- </body>
- </html>
如需引入外部 Js 需刷新才能执行
]事件处理程序中 W3C 和 IE 还有诸多不一致之处,十分麻烦。好在大多都有较好的解决方案。更多信息请参考 http://www.quirksmode.org/js/events_events.html
来源: http://www.phperz.com/article/17/0419/285594.html