- 浏览: 178824 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (140)
- java (138)
- 佳能500d (1)
- 佳能 (1)
- Oracle数据库文档构造器--Oraschemadoc (1)
- EJB调用的原理分析 (1)
- 使用css3画"静音"icon (1)
- 张小庆,在路上(16)-给弟弟找工作 (1)
- Android短信编解码方式 (1)
- lua web 开发 (1)
- zk安装 (1)
- 菜单多国语言化遇到的问题 (1)
- 【转】纯文本配置还是注册表 (1)
- C++ delete删除动态分配的内存 (1)
- eclipse下修改项目名导致tomcat内发布名不一致的解决方法 (1)
- Lucene实现各种常见文档的全文检索 (1)
- 项目风险之人员流动风险 (1)
- 时空数据模型简介 (1)
- XSLT学习笔记 (1)
- 依然是计划 如果没有计划似乎就没有了动力 (1)
- How to Succeed in A Professional Career (1)
- 编程环境应该和讨论社区完美的进行结合 (1)
- C#坦克大战实现 (1)
- 电脑用户密码忘记了怎么办? (1)
- java.lang.NoClassDefFoundError: org/dom4j/DocumentException (1)
- 关于成立北京Android爱好者俱乐部的声明 (1)
- Android开发之初探音频的播放 (1)
- Struts标签循环List (1)
- CAP原理 (1)
- javabean的自动生成 (1)
- 打开CMD一闪就关的解决方案 (1)
- 我是项目经理,我的项目管理日记【20111202】 (1)
- Html5游戏开发入门笔记--<躲砖块> (1)
- mysql中查看和设置系统字符编码 (1)
- PhoneGap-Accelerometer (1)
- [Jetty]Jetty工作原理 (1)
- Ibatis+Spring整合实例Demo+源码 (1)
最新评论
-
u012985907:
dsdsdsdsd
FLASH上传与拍照 -头像-avatart -
a379933101:
?????????????????????????????
android listview 连续调用 getview问题分析及解决 -
151tmac:
拜托下次粘贴的时候,粘贴为纯文本
android listview 连续调用 getview问题分析及解决 -
liudezhong135:
...
Spring3MVC 在JSP中使用@ModelAttribute -
香飘飘2011:
要是不知道层次级别,如何退回到根目录呢
FTP退回到根目录
document.addeventlistener("click",doclick,false);
里最后一个属性设置该事件的响应顺序;
true的话将是最先触发
顺序为 addeventlistener->标签的onclick事件->document.onclick
false的话是最后触发
顺序为 标签的onclick事件->document.onclick->addeventlistener
在很多语言的学习中,“事件”都是个比较难理解,但是又是个很重要的概念。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>
三、 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=(e.clientx-deltax)+"px";
elementtodrag.style.top=(e.clienty-deltay)+"px";
if(e.stoppropagation) e.stoppropagation();
else e.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;
}
原文来自(本人对例子做了小改动): http://hi.baidu.com/lc2tp/blog/item/cfabba1fc54905cda686690b.html
里最后一个属性设置该事件的响应顺序;
true的话将是最先触发
顺序为 addeventlistener->标签的onclick事件->document.onclick
false的话是最后触发
顺序为 标签的onclick事件->document.onclick->addeventlistener
在很多语言的学习中,“事件”都是个比较难理解,但是又是个很重要的概念。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>
三、 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=(e.clientx-deltax)+"px";
elementtodrag.style.top=(e.clienty-deltay)+"px";
if(e.stoppropagation) e.stoppropagation();
else e.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;
}
原文来自(本人对例子做了小改动): http://hi.baidu.com/lc2tp/blog/item/cfabba1fc54905cda686690b.html
发表评论
-
Ibatis+Spring整合实例Demo+源码
2012-02-08 12:58 1429<span style="color: ... -
[Jetty]Jetty工作原理
2012-02-07 17:29 1011http://www.ibm.com/develo ... -
PhoneGap-Accelerometer
2012-02-07 14:23 1228采集设备在x、y、z方向上的动作。 acce ... -
mysql中查看和设置系统字符编码
2012-02-04 14:28 1732--查看数据库的字符集 show variables ... -
Html5游戏开发入门笔记--<躲砖块>
2012-02-03 12:04 1186学习了html5中的canvas画布元素,自己写了一个 ... -
我是项目经理,我的项目管理日记【20111202】
2012-02-03 10:19 1018其实前段时间项目 ... -
打开CMD一闪就关的解决方案
2012-02-02 12:14 1419转:http://blog.163.com/cumt_ ... -
javabean的自动生成
2012-02-02 11:59 1432在jcreator pro中自动生成 在j ... -
CAP原理
2012-02-01 09:00 1180作者:NinGoo 原文链接:ht ... -
Struts标签循环List
2012-01-31 14:18 986<pre name="code&quo ... -
Android开发之初探音频的播放
2012-01-11 16:29 1137<h1>Android开发之初探音频的播放 ... -
关于成立北京Android爱好者俱乐部的声明
2012-01-11 14:33 887<blockquote dir="lt ... -
java.lang.NoClassDefFoundError: org/dom4j/DocumentException
2011-12-28 13:03 15156<span style="font-f ... -
电脑用户密码忘记了怎么办?
2011-12-28 12:14 1008<span style="fon ... -
C#坦克大战实现
2011-12-20 13:29 1147记得在大学学java ... -
编程环境应该和讨论社区完美的进行结合
2011-12-19 11:54 787在学习.NET过程中,经常会遇到很多问题,有的时候会找 ... -
How to Succeed in A Professional Career
2011-12-19 10:29 766(From Microsoft)<br>& ... -
依然是计划 如果没有计划似乎就没有了动力
2011-12-15 10:39 900</span></span>& ... -
XSLT学习笔记
2011-12-14 14:04 692<p class="MsoNorma ... -
时空数据模型简介
2011-12-14 13:59 1512<p class="MsoNo ...
相关推荐
JavaScript 事件机制详细研究 JavaScript 事件机制是指浏览器中发生的各种事件,例如点击、鼠标悬停、键盘输入等,JavaScript 通过捕捉这些事件来执行相应的操作。本文将详细介绍 JavaScript 事件机制的实现方式和...
### JavaScript事件机制详解 #### 一、引言 在学习编程语言的过程中,"事件"这一概念往往是初学者遇到的一个难点,然而它又是编程中极为重要的一个组成部分。在JavaScript中,事件处理更是不可或缺的一部分,它是...
JavaScript 事件机制是网页交互的...总之,理解JavaScript事件机制,特别是捕获/冒泡和DOM事件流,对于解决移动端兼容性问题至关重要。通过使用合适的工具和策略,开发者可以创建出具有良好交互体验的跨平台网页应用。
在Node.js中,事件机制是其核心特性之一,它基于异步I/O处理,使得程序能够高效地处理多个并发操作。事件驱动的架构使得代码结构更简洁,避免了回调地狱的问题。本文将深入探讨Node.js事件机制以及`events`模块的...
JavaScript事件监听机制是前端开发中极其重要的一环,它允许开发者对用户行为(如点击、按键、鼠标移动等)作出响应。事件监听涉及的几个核心概念包括事件传播的两种方式:事件捕获和事件冒泡,以及兼容性问题和事件...
总结,JavaScript事件机制是实现网页交互的核心,理解并熟练运用事件处理程序、事件绑定、常见事件类型以及事件冒泡和阻止默认行为,能够帮助开发者创建更加动态和用户友好的Web应用。通过学习和实践这些示例,你...
JavaScript事件机制是Web开发中的核心概念之一,它负责页面中事件的响应和处理。为了保证在不同的浏览器中能够正确地执行事件处理函数,开发者需要对不同浏览器之间的事件机制兼容性有所了解,并进行相应的处理。...
在W3C规范出台之前,JavaScript事件机制在IE和Netscape浏览器中有两种不同的处理方式:冒泡和捕获。IE采用冒泡模型,事件从子元素向上冒泡到父元素;Netscape则采用捕获模型,事件从父元素向下捕获到子元素。W3C标准...
本文实例讲述了js事件机制—-捕获与冒泡机制。分享给大家供大家参考,具体如下: 先从事件绑定机制说起, 事件绑定机制通过绑定方法addEventListener()实现, 语法格式如下: element.addEventListener(event, function...
总的来说,Backbone.js的事件机制和服务器同步功能是其强大之处,它们简化了前端和后端之间的数据交互,同时也促进了组件间的解耦。理解并熟练运用这些机制,可以帮助开发者构建更高效、更易于维护的JavaScript应用...
JavaScript事件是浏览器或Node.js环境中发生的特定行为,如用户点击按钮、页面加载完成或输入框获得焦点等。事件驱动编程是JavaScript的核心特性之一,通过监听和处理这些事件,我们可以创建响应式的用户体验。 二...
JavaScript事件机制是JavaScript中处理用户交互的核心部分,它允许开发者响应用户的各种操作,如点击、鼠标移动等。在JavaScript中,事件的传播分为两个阶段:捕获阶段和冒泡阶段。 **捕获阶段**(Capture Phase)...
事件机制是OpenLayers的核心部分,它使得用户与地图进行交互成为可能。在OpenLayers中,事件机制主要涉及到控件(Controls)和处理器(Handlers)的概念。 控件在OpenLayers中扮演着重要的角色,它们是附加到地图上...
此外,还有一些高级事件机制,如事件委托(event delegation),它利用事件冒泡原理,将事件监听器添加到父元素上,从而减少内存消耗和提高性能。还有`Event`对象,它提供了`preventDefault()`方法阻止默认行为(如...
本文将深入探讨JavaScript事件机制,特别是事件的捕获和冒泡阶段。 首先,理解JavaScript事件的基础概念至关重要。事件是用户或浏览器在与网页交互时发生的动作,比如点击按钮、页面加载或滚动等。当这些事件发生时...
实验报告详细介绍了JavaScript事件处理的相关知识,这在Web开发中是非常关键的一部分,因为事件是用户与网页交互的主要方式。以下是对各个知识点的详细说明: 1. **JavaScript事件基本概念**: - **事件**:是用户...
JavaScript事件绑定机制是JavaScript编程中一个非常重要的概念,它涉及到用户与网页交互时的响应处理。在提供的内容中,展示了三种不同的事件绑定方式,分别使用jQuery库的不同方法来实现。这里我们将详细探讨这些...