1. 总述:
本章将讲三种完全不同的不兼容的事件处理模型:
1.1 原始事件模型
这是一种简单的事件处理模式,我们可以非正式地把它看作是0级DOM API的一部份内容,所有的启用了js的浏览器都支持它,因此用它不用考虑浏览器的兼容性。
1.2 标准事件模型
这是一种强大的具有完整性的事件模型,2级DOM对它进行了标准化,除了IE外的所有浏览器都支持它。
1.3 IE事件模型
它具有标准事件模型的许多特征,但不具有全部特征,所以,必须为IE浏览器编写特定的代码来解决兼容性的问题。
2.原始基本事件模型
原始基本事件模型在我们的代码中很常用了,这里就简单地介绍下,首先说说事件句柄。
事件句柄像onclick、onmouseover等都很常用了,以下几个句柄需要再熟悉一下:
onkeyup//如在下拉提示框中就有用到:输入一个字符后onkeyup事件被执行,这刚好是提示所需要的。(关于下拉提示框的相关说明见另一篇blog文章)
onblur//失去焦点,这在当一个元素输入完后离开元素时对元素的输入值有效性进行判断很常用
onfocus//当一个元素得到焦点时触发,这在在鼠标刚刚点击元素获得焦点时用到
onchange//这是select下拉框的option选择时触发,注意,选择option时不是触发onclick,而是onchange,这点易混
onresize//在窗口大小变化时触发。如gis的地图当窗口大小变化时,一些热点元素要重新画等。
onsubmit//这个句柄常用,注意的是如果不你想让form提交,可以把onsubmit设置为false,则不会自动提交。
对于事件句柄的常用做法,我们常常把函数赋值给事件句柄的方式,如下:
e.onclick = function(){}
或者:
function a(){}
e.onclick = a
注意上面的第二种写法,e.onclick = a后面的a没有括号,也就是我们是把函数自身a赋值给onclick句柄,而不是函数的执行结果赋值给句柄,所以没有括号。
有的时候,比如一个元素的句柄其它开发人员已经写好了,如果我们想在后面加上我们自己要处理的事情,可以先把原先的句柄函数备份起来,再执行新的函数,如下:
var oldHandle = e.onclick;
function newHandle(){}
e.onclick = {
oldHandle();
newHandle();
}
这样,就可以兼容其它人写的代码,并执行我们要的新代码了。
3. 标准事件模型
4. IE的事件模型
4.1 IE Event对象:
ie的event对象是一个很重要的对象,因为所有的应用开发都与用户的操作事件有关联。event对象的重要属性如下:
*srcElement
*cancelBubble
true可以阻止当前事件进一步起泡到包容层次的元素。它与DOM的stopPropagation()方法相同。这个属性很常用,可常与returnValue属性一起用。比如一个grid的行,要起它的右键菜单,就要先设置returnValue,再设置cancelBubble。
cancelBubble只适用于当前事件,如果有新的event事件,则cancelBubble会自动还原为默认值false。
*returnValue
设置为false可以阻止浏览器执行与事件相关的默认动作。很经常地与上面的cancelBubble一起用。它与DOM的preventDefault()方法相同。
*ClientX,ClientY
指的是事件发生时的鼠标坐标(注意是鼠标坐标),这个坐标是相对于窗口的左上角的,因为是文档坐标,所以对于比窗口大的文档,两个坐标值与文档的位置不一样,需要把窗口坐标转化为文档坐标,需要添加一个文档的滚动值。
*shiftKey,ctrlKey,altKey
事件发生时是否按住了shift、ctrl、alt键。
*button
指的是鼠标事件中是点击了左键(1)还是右键(2)还是中键(3)。
*keyCode
指明keydown和keyup事件的键代码及keypress事件的Unicode字符。
ie的event是全局变量:
因为我们一次只能处理一个事件,从来不会并发处理两个事件,所以,用全局变量来存放event是安全的。
IE的event对象是全局变量与2级DOM事件模型不兼容,可以用如下代码来解决:
var e = event||window.event
4.2 IE事件句柄的注册
IE事件句柄的注册用attachEvent()和detachEvent()方法,它们比较常用。比如有很多元素,不需要一个个去写onclick事件,只需要在js里写个循环,attachEvent("onclic",function(){});
它们与DOM的addEventListener()和removeEventListener()方法相似。
4.3 捕获鼠标事件
捕获鼠标事件对于如拖放元素等操作很重要。捕获鼠标事件主要是通过setCapture()和releaseCapture()来实现。当一当一个元素setCapture()后,所有的后续操作都引导到这个元素上,并且这个元素的所有句柄(如onclick\onmouseover等)都可以在起泡前处理它们。但我们一般是在setCapture()后,接着是对mousedown事件来做响应,以保证后续的mouseover事件能够被同一元素接收。元素执行拖动操作后调用releaseCapture()来响应一个mouseup事件。
5.鼠标事件
鼠标事件涉及到两个知识点:一个是鼠标的位置;另一个是鼠标的捕获事件。分别用一个tip例子和一个drag例子代码来说明。这两个例子将以单独文章的形式发布。
分享到:
相关推荐
恶意js代码学习笔记,恶意代码识别.IE在处理Javascript执行的过程中存在漏洞,攻击者可以利用此漏洞在用户机器上执行恶意代码。因为当前正在执行的Javascript存在一个机会窗口,以旧页面的权限对新加载页面的内容执行...
1、目前共存在四种事件处理模型分别是:原始事件模型、标准事件模型、IE事件模型,还有一种Netscape4事件模型,但基本可忽略 2、事件处理模型又可以分为基本事件处理和高级事件处理两种,原始事件模型属于基本事件...
共70页,复制两页供参考,如下: 1 JavaScript基本语法 1) 读未声明的变量会产生错误。写未声明的变量会是JavaScript环境自动产生一个全局变量。...16) onload()和onunload()事件分别在网页装载完成后和卸载前执行。
JavaScript学习笔记包括正则表达式、异常处理、调试、关键字等
{12.13.4}update}{176}{subsection.12.13.4} {12.13.5}delete}{177}{subsection.12.13.5} {12.13.6}drop}{177}{subsection.12.13.6} {12.13.7}rename}{177}{subsection.12.13.7} {12.14}SQL脚本}{177}{section....
Ext JS4学习教程+笔记(二)事件处理 Ext JS4学习教程+笔记(六)DataView面板 Ext JS4学习教程+笔记(七)树面板Tree Panel Ext JS4学习教程+笔记(三)Ajax请求 Ext JS4学习教程+笔记(五)Form Panel的使用 Ext...
Javascript学习笔记:错误处理.
Java/JavaEE 学习笔记 作者在杰普学习时的学习笔记,是J2ee初学者必备手册,是大家学习J2EE开发的很好的参考笔记。 Java/JavaEE 学习笔记 内容目录: Unix 学习笔记..........7 一、Unix前言............7 二、...
二、JavaScript的程序控制结构和对象 2 1、for循环语句: 2 2、while循环: 2 3、do-while循环: 2 4、JavaScript函数: 2 5、在JavaScript中基于对象的编程: 3 6、内置的JavaScript对象: 3 7、处理对象的内置方法...
最好的Ajax学习笔记 Ajax 是处理异步请求的技术。 ajax,请求处理流程: 客户端浏览器发出异步请求。根据MVC请求处理流程找到请求处理逻辑,处理请求,反馈数据。将反馈的数据处理js元素,最后反馈到前台。由js 技术...
事件流就是事件发生顺序,这是IE和其他浏览器在事件支持上的主要差别。 一、事件流 1、冒泡型事件 IE上的解决方案就是冒泡型事件,它的基本思想是从最特定的目标到最不特定的事件目标(document对象)的顺序触发。 ...
Javascript第4版学习笔记 本书从 JavaScript 的起源开始,逐步讲解到新出现的技术,其中重点介绍 ECMAScript 和 DOM 标准。在 此基础上,接下来的各章揭示了 JavaScript 的基本概念,包括类、期约、迭代器、代理...
HTML&JavaScript学习笔记.....................198 HTML: 超文本标记语言.......................198 1、html简介...........198 2、动态网页开发技术......................199 3、html的基本构成....................
技术分享:DWR 处理各种form表单Selectoption,table等,List,Bean
JS里面的对象 全局对象window 浏览器上是window ...如果是var n=2声明方式的话,n本不应该有任何属性,但是js发明者为了方便开发者应用,从中做了处理,可以出现类似于n.toString n.name = ‘nihao
JavaScript高级程序设计 错误处理与调试学习笔记,学习js的朋友可以参考下。
JavaScript_DOM编程 DOM 的常用方法属性 经典实例 浏览器兼容处理