理解JavaScript中的事件javascript

在很多语言的学习中,“事件”都是一个比较难理解,但是又是一个很重要的概念。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的时候可以组织浏览器执行默认的事件动作,相当于。  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节点定义的事件处理函数。
       到了上层的节点如果还有和下层相同事件类型的事件处理函数。
       那么上层的事件处理函数也会执行。例如。
       标签包含了

       如果这两个标签都有onclick事件的处理函数。
       那么执行的情况就是先执行标签的onclick事件处理函数。
       再执行的事件处理函数。如果希望的事件处理函数执行完毕之后。
       不希望执行上层的的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 pagetitle>  <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,testingp>div> div> body>三、 dom中的高级事件处理 ie 6中的事件处理。
       并不是w3c dom标准的事件处理模型。
       所以如果上述代码运行在mozilla firefox的浏览器中。
       就会失去作用。
       同时即将发布的ie 7也将支持w3c dom的二级标准。
       所以掌握dom的高级事件处理显得就很重要了。
       因为w3c dom二级标准是未来web的发展方向。
       同时w3c dom的api非常常用。
       为未来更加复杂的web开发提供了良好的基础。(一)事件处理程序的作用域和事件的传播  在正式讨论dom高级事件处理之前。
       我们有必要了解一下事件处理程序的作用域。事件处理程序的作用域要比普通的函数作用域复杂很多。普通的函数作用域链比较容易。
       例如在一个普通函数中查找一个变量a。
       那么javascript解释器会先在该函数的调用对象中查找是否有a这个变量。
       如果没有。
       将会在作用域链的下一个对象。
       一般是全局对象中查找。但是事件处理程序没这么简单。
       特别是用html的属性定义的。
       它们的作用域链的头部是调用它们的对象。
       而下一个对象并不是全局对象。
       而是触发事件处理程序的对象。这样就会出现一个问题。
       window和document都有一个方法open()。
       如果open()前面不加修饰。
       那么在事件处理的函数中将会调用document.open()方法。
       而不是常用的window.open()方法。
       所以使用的时候应该明确指明是window.open()。(二)事件传播和注册事件处理程序1.事件传播  在二级dom标准中。
       事件处理程序比较复杂。
       当事件发生的时候。
       目标节点的事件处理程序就会被触发执行。
       但是目标节点的父节点也有机会来处理这个事件。事件的传播分为三个阶段。
       首先是捕捉阶段。
       事件从document对象沿着dom树向下传播到目标节点。
       如果目标的任何一个父节点注册了捕捉事件的处理程序。
       那么事件在传播的过程中就会首先运行这个程序。下一个阶段就是发生在目标节点自身了。
       注册在目标节点上的相应的事件处理程序就会执行;最后是起泡阶段。
       事件将从目标节点向上传回给父节点。
       同样。
       如果父节点有相应的事件处理程序也会处理。在ie中。
       没有捕捉的阶段。
       但是有起泡的阶段。可以用stoppropagating()方法来停止事件传播。
       也就是让其他元素对这个事件不可见。
       在ie 6中。
       就是把cancelbubble设置为true。2.注册事件处理程序  和ie一样。
       dom标准也有自己的事件处理程序。
       不过dom二级标准的事件处理程序比ie的强大一些。
       事件处理程序的注册用addeventlistner方法。
       该方法有三个参数。
       第一个是事件类型。
       第二个是处理的函数。
       第三个是一个布尔值。
       true表示制定的事件处理程序将在事件传播的阶段用于捕捉事件。
       否则就不捕捉。
       当事件发生在对象上才触发执行这个事件处理的函数。
       或者发生在该对象的字节点上。
       并且向上起泡到这个对象上的时候。
       触发执行这个事件处理的函数。例如:document.addeventlistener("mousemove",movehandler,true);就是在mousemove事件发生的时候。
       调用movehandler函数。
       并且可以捕捉事件。  可以用addeventlistener为一个事件注册多个事件处理的程序。
       但是这些函数的执行顺序是不确定。
       并不像c#那样按照注册的顺序执行。  在mozilla firefox中用addeventlistener注册一个事件处理程序的时候。
       this关键字就表示调用事件处理程序的文档元素。
       但是其他浏览器并不一定是这样。
       因为这不是dom标准。
       正确的做法是用currenttarget属性来引用调用事件处理程序的文档元素。3.二级dom标准中的event  和ie不同的是。
       w3c dom中的event对象并不是window全局对象下面的属性。
       换句话说。
       event不是全局变量。通常在dom二级标准中。
       event作为发生事件的文档对象的属性。event含有两个子接口。
       分别是uievent和mutationevent。
       这两个子接口实现了event的所有方法和属性。
       而mouseevent接口又是uievent的子接口。
       所以实现了uievent和event的所有方法和属性。下面。
       我们就看看event、uievent和mouseevent的主要属性和方法。  1.event   type:事件类型。
       和ie类似。
       但是没有“on”前缀。
       例如单击事件只是“click”。   target:发生事件的节点。   currenttarget:发生当前正在处理的事件的节点。
       可能是target属性所指向的节点。
       也可能由于捕捉或者起泡。
       指向target所指节点的父节点。   eventphase:指定了事件传播的阶段。是一个数字。   timestamp:事件发生的时间。   bubbles:指明该事件是否起泡。   cancelable:指明该事件是否可以用preventdefault()方法来取消默认的动作。   preventdefault()方法:取消事件的默认动作;   stoppropagation()方法:停止事件传播。  2.uievent   view:发生事件的window对象。   detail:提供事件的额外信息。
       对于单击事件、mousedown和mouseup事件都代表的是点击次数。  3.mouseevent   button:一个数字。
       指明在mousedown、mouseup和单击事件中。
       鼠标键的状态。
       和ie中的button属性类似。
       但是数字代表的意义不一样。
       0代表左键。
       1代表中间键。
       2代表右键。   altkey、ctrlkey、shiftkey、metakey:和ie相同。
       但是ie没有最后一个。   clientx、clienty:和ie的含义相同。
       但是在dom标准中。
       这两个属性值都不考虑文档的滚动情况。
       也就是说。
       无论文档滚动到哪里。
       只要事件发生在窗口左上角。
       clientx和clienty都是0。
       所以在ie中。
       要想得到事件发生的坐标相对于文档开头的位置。
       要加上document.body.scrollleft和document.body.scrolltop。   screenx、screeny:鼠标指针相对于显示器左上角的位置。
       如果你想打开新的窗口。
       这两个属性很重要。   relatedtarget:和ie中的fromelement、toelement类似。
       除了对于mouseover和mouseout有意义外。
       其他的事件没什么意义。(三)兼容于两种主流浏览器的拖动dom元素的例子  好了。
       刚才讲了这么多dom编程和ie中的事件。
       那么如何编写兼容ie和mozilla firefox两种主流浏览器的拖拽程序呢?代码如下:function begindrag(elementtodrag,event){ var deltax=event.clientx-parseint(elementtodrag.style.left); var deltay=event.clienty-parseint(elementtodrag.style.top); if(document.addeventlistener) { document.addeventlistener("mousemove",movehandler,true); document.addeventlistener("mouseup",uphandler,true);}else if(document.attachevent){ document.attachevent("onmousemove",movehandler); document.attachevent("onmouseup",uphandler); } if(event.stoppropagation) event.stoppropagation(); else event.cancelbubble=true; if(event.preventdefault) event.preventdefault(); else event.returnvalue=false; function movehandler(e) {  if (!e) e=window.event; //如果是ie的事件对象。
       那么就用window.event
  //全局属性。
       否则就用dom二级标准的event对象。
elementtodrag.style.left=(event.clientx-deltax)+"px"; elementtodrag.style.top=(event.clienty-deltay)+"px"; if(event.stoppropagation) event.stoppropagation(); else event.cancelbubble=true; }
function uphandler(e) { if(document.removeeventlistener) { document.removeeventlistener("mouseup",uphandler,true); document.removeeventlistener("mousemove",movehandler,true);} else { document.detachevent("onmouseup",uphandler); document.detachevent("onmousemove",movehandler);} } if(event.stoppropagation) event.stoppropagation(); else event.cancelbubble=true; }
demodrag


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值