理解JavaScript中的事件
点击次数:33 次 发布日期:2008-11-26 23:06:43 作者:源代码网
|
源代码网推荐
源代码网整理以下在很多语言的学习中,“事件”都是一个比较难理解,但是又是一个很重要的概念。JavaScript中的事件处理也是一样,正因为有了事件处理,才会出现Ajax拖动的效果。本文就讨论一下JavaScript中的事件处理,读过之后,您就会知道,很多Ajax框架实现拖动效果的原理了。 一、 IE Event对象 (一)IE Event对象的主要属性和方法 在IE中有一个专门负责事件处理的对象Event,这个对象负责对事件的处理,含有很多的属性和方法,通过这些方法和属性的调用,就能完成很多的事件处理。 type:事件的类型,就是HTML标签属性中,没有“on”前缀之后的字符串,例如“Click”就代表单击事件。 srcElement:事件源,就是发生事件的元素。 button:声明了被按下的鼠标键,是一个整数。1代表鼠标左键,2代表鼠标右键,4代表鼠标的中间键,如果按下了多个鼠标键,就把这些值加在一起,所以3就代表左右键同时按下。 clientX/clientY:是指事件发生的时候,鼠标的横、纵坐标,返回的是整数,它们的值是相对于包容窗口的左上角生成的。 offsetX/offsetY:鼠标指针相对于源元素的位置,可以确定单击Image对象的哪个象素。 altKey,ctrlKey,shiftKey:顾名思义,这些属性是指鼠标事件发生的时候,是否同时按住了Alt、Ctrl或者Shift键,返回的是一个布尔值。 keyCode:返回keydown和keyup事件发生的时候,按键的代码以及keypress事件的Unicode字符。 fromElement、toElement前者是指代mouseover事件移动过的文档元素,后者指代mouseout事件中鼠标移动到的文档元素。 cancelBubble:一个布尔属性,把它设置为true的时候,将停止事件进一步起泡到包容层次的元素。 returnValue:一个布尔值属性,设置为false的时候可以组织浏览器执行默认的事件动作,相当于<a href=”#” onclick=”ProcessMethod();return false;” />。 attachEvent()和detachEvent()方法:为制定DOM对象事件类型注册多个事件处理函数的方法,它们有两个参数,第一个是事件类型,第二个是事件处理函数。在attachEvent()事件执行的时候,this关键字指向的是window对象,而不是发生事件的那个元素。 (二)IE Event对象的一些说明 1.IE Event对象是一个全局属性 在IE中,不能把Event对象作为参数传递给事件处理程序,只能用window.event或者event来引用Event对象。因为在IE中,Event是window的一个属性,也就是说event是一个全局变量,这个变量提供了事件的细节。 2.IE中事件的起泡:IE中事件可以沿着包容层次一点点起泡到上层,也就是说,下层的DOM节点定义的事件处理函数,到了上层的节点如果还有和下层相同事件类型的事件处理函数,那么上层的事件处理函数也会执行。例如,<div>标签包含了<a>,如果这两个标签都有onclick事件的处理函数,那么执行的情况就是先执行<a>标签的onclick事件处理函数,再执行<div>的事件处理函数。如果希望<a>的事件处理函数执行完毕之后,不希望执行上层的<div>的onclick的事件处理函数了,那么就把cancelBubble设置为false即可。 二、 IE中拖动DOM元素的例子 /* 该函数由mousedown事件处理调用 它为随后发生的mousemove和mouseup事件注册了临时的捕捉事件处理程序 并用这些事件处理程序拖动指定的文档元素 第二个参数必须是mousedown事件的事件对象 */ function beginDrag(elementToDrag,event) { //该元素当前位于何处 //该元素的样式性质必须具有left和top css属性 //此外,我们假定他们用象素做单位 //var x=parseInt(elementToDrag.style.left); //var y=parseInt(elementToDrag.style.top); //计算一个点和鼠标点击之间的距离,下面的嵌套的moveHandler函数需要这些值 var deltaX=event.clientX-parseInt(elementToDrag.style.left); var deltaY=event.clientY-parseInt(elementToDrag.style.top); // 注册mousedown事件后发生的mousemove和mouseup事件的处理程序 // 注意,它们被注册为文档的捕捉事件处理程序 // 在鼠标按钮保持按下的状态的时候,这些事件处理程序保持活动的状态 // 在按钮被释放的时候,它们被删除 document.attachEvent("onmousemove",moveHandler); document.attachEvent("onmouseup",upHandler); //我们已经处理了该事件,不要让别的元素看到它 event.cancelBubble=true; event.returnValue=false; /* 这是在元素被拖动时候捕捉mousemove事件的处理程序,它响应移动的元素 */ function moveHandler(e) { //把元素移动到当前的鼠标位置 e=window.event; elementToDrag.style.left=(event.clientX-deltaX)+"px"; elementToDrag.style.top=(event.clientY-deltaY)+"px"; //不要让别的元素看到该事件 event.cancelBubble=true; } /* 该事件将捕捉拖动结束的时候发生的mouseup事件 */ function upHandler(e) { //注销事件处理程序 document.detachEvent("onmouseup",upHandler); document.detachEvent("onmousemove",moveHandler);} event.cancelBubble=true; } 调用它的HTML文件代码: <html> <head> <title>Untitled Page</title> <script type="text/javascript" src="dragIE.js"></script> </head> <body> <div style="position:absolute;left:100px;top:100px;background-color:White;border:solid black;"> <div style="background-color:Gray;border-bottom:solid black;padding:3px;font-family:Sans-Serif;font-weight:bold;" onmousedown="beginDrag(this.parentNode,event);"> 拖动我 </div> <div> <p>This is a test.Testing,testing</p></div> </div> </body> 源代码网整理以下
源代码网供稿. |