`
alwaysnew
  • 浏览: 28093 次
  • 性别: Icon_minigender_1
  • 来自: 肇庆
社区版块
存档分类
最新评论

js关于ie的一些东东

    博客分类:
  • js
阅读更多
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元素的例子


01./*

02.该函数由mousedown事件处理调用

03.他为随后发生的mousemove和mouseup事件注册了临时的捕获事件处理程式

04.并用这些事件处理程式拖动指定的文档元素

05.第二个参数必须是mousedown事件的事件对象

06.*/

07.function beginDrag(elementToDrag,event)

08.{

09.//该元素当前位于何处

10.//该元素的样式性质必须具备left和top css属性

11.//此外,我们假定他们用象素做单位

12.//var x=parseInt(elementToDrag.style.left);

13.//var y=parseInt(elementToDrag.style.top);

14.

15.//计算一个点和鼠标点击之间的距离,下面的嵌套的moveHandler函数需要这些值

16.var deltaX=event.clientX-parseInt(elementToDrag.style.left);

17.var deltaY=event.clientY-parseInt(elementToDrag.style.top);

18.

19.// 注册mousedown事件后发生的mousemove和mouseup事件的处理程式

20.// 注意,他们被注册为文档的捕获事件处理程式

21.// 在鼠标按钮保持按下的状态的时候,这些事件处理程式保持活动的状态

22.// 在按钮被释放的时候,他们被删除

23.document.attachEvent("onmousemove",moveHandler);

24.document.attachEvent("onmouseup",upHandler);

25.

26.//我们已处理了该事件,不要让别的元素看到他

27.event.cancelBubble=true;

28.event.returnValue=false;

29.

30./*

31.这是在元素被拖动时候捕获mousemove事件的处理程式,他响应移动的元素

32.

33.*/

34.function moveHandler(e)

35.{

36.//把元素移动到当前的鼠标位置

37.e=window.event;

38.elementToDrag.style.left=(event.clientX-deltaX)+"px";

39.elementToDrag.style.top=(event.clientY-deltaY)+"px";

40.

41.//不要让别的元素看到该事件

42.event.cancelBubble=true;

43.

44.}

45.

46./*

47.该事件将捕获拖动结束的时候发生的mouseup事件

48.*/

49.function upHandler(e)

50.{

51.//注销事件处理程式

52.document.detachEvent("onmouseup",upHandler);

53.document.detachEvent("onmousemove",moveHandler);}

54.

55.event.cancelBubble=true;

56.}

57.调用他的HTML文档代码:

58. <html>

59. <head>

60.  <title>Untitled Page</title>

61.  <script type="text/javascript" src="dragIE.js"></script>

62. </head>

63. <body>

64. <div style="position:absolute;left:100px;top:100px;background-color:White;border:solid black;">

65.  <div style="background-color:Gray;border-bottom:solid black;padding:3px;font-family:Sans-Serif;font-weight:bold;" onmousedown="beginDrag(this.parentNode,event);">

66.  拖动我        

67.  </div>

68.  <div>

69.  <p>This is a test.Testing,testing</p></div>

70. </div>

71. </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两种主流浏览器的拖拽程式呢?代码如下:


01.function beginDrag(elementToDrag,event)

02.{

03.var deltaX=event.clientX-parseInt(elementToDrag.style.left);

04.var deltaY=event.clientY-parseInt(elementToDrag.style.top);

05.

06.if(document.addEventListener)

07.{

08.document.addEventListener("mousemove",moveHandler,true);

09.document.addEventListener("mouseup",upHandler,true);

10.}

11.else if(document.attachEvent)

12.{

13.document.attachEvent("onmousemove",moveHandler);

14.document.attachEvent("onmouseup",upHandler);

15.

16.}

17.

18.if(event.stopPropagation) event.stopPropagation();

19.else event.cancelBubble=true;

20.if(event.preventDefault) event.preventDefault();

21.else event.returnValue=false;

22.

23.function moveHandler(e)

24.{

25.  if (!e) e=window.event; //假如是IE的事件对象,那么就用window.event

26.  //全局属性,否则就用DOM二级标准的Event对象。

27.elementToDrag.style.left=(event.clientX-deltaX)+"px";

28.elementToDrag.style.top=(event.clientY-deltaY)+"px";

29.

30.if(event.stopPropagation) event.stopPropagation();

31.else event.cancelBubble=true;

32.

33.}

34.

35.function upHandler(e)

36.{

37.if(document.removeEventListener)

38.{

39.document.removeEventListener("mouseup",upHandler,true);

40.document.removeEventListener("mousemove",moveHandler,true);}

41.else

42.{

43.document.detachEvent("onmouseup",upHandler);

44.document.detachEvent("onmousemove",moveHandler);}

45.}

46.if(event.stopPropagation) event.stopPropagation();

47.else event.cancelBubble=true;

48.

49.}
分享到:
评论

相关推荐

    js判断IE6/IE7/FF的代码[XMLHttpRequest]

    大家有的时候想在页面中加一些东东,又限于浏览器的不同,效果不尽都能表现出来,这下我们可以想到浏览器的判断,根据不同的浏览器给出不同的展示效果,是不是很炫呢?那当然,你能想到的很多人都能想的到,就好像...

    JavaScript对IE操作的经典代码(推荐)

    之前在网上搜集了一些关于JavaScript对IE操作的代码(具体在哪里cope的记不清了,所以出处就不加了),感觉在开发过程中很有用,当然只适用于IE,FF会有问题的。现在贴出来分享。 代码如下:1.将彻底屏蔽鼠标右键...

    javascript+xml实现简单图片轮换(只支持IE)

    最近无聊,看着许多网站都有广告自动轮换,自己试着写了一个图片轮换,代码和功能都很简单,只支持IE的,FF的还要加些东东. xml文件:test.xml 代码如下: &lt;?xml version=”1.0″ encoding=”gb2312″?&gt; &lt;ad&gt; ”image...

    js 内存释放问题

    CollectGarbage(); setTimeout(“CollectGarbage();”, 1); 这里之所以使用setTimeout(),因为可以彻底回收...”就可以帮助浏览器释放内存,IE在最小化和关闭时释放,所以,长时间开着IE窗口,会导致IE再次打开的瞬间速

    CSS条件注释详解(根据不同浏览器加载CSS)

    由于浏览器版本的不同,对CSS里...这里XXX是一些特定的东东,在此列表几个出来,详细介绍各自的含义: 复制代码代码如下:&lt;!–[if IE]&gt; / 如果浏览器是IE /&lt;!–[if IE 5]&gt; / 如果浏览器是IE 5 的版本 /&lt;!–[i

    PB和HTML做的电子笔记本

    pb9开发,内嵌了一个Html编辑器用来编辑文档,利用Access做数据库,并用PB和js做了一个网页插件(后来不好用了,可能是IE升级和安全的缘故),可以触发运行并下载网页内容和图片,批量多线程下载,还用BCB写了个解析...

    JS日历 推荐

     兼容多种浏览器 了解了不少东东,特别是对于W3C标准化. 如 FF和IE 对box模型的理解不同 box.style{width:100;border 1px;} ie理解 为 box.width = 100 ff 理解 为 box.width = 100 + 1*2 = ...

    脚本开发插件

    IE下的查看网页DOM对象的插件,微软自己的东东,很不错。

    有道JavaScript监听浏览器的问题

    但不知道大家有没遇到这样一种情况,新开的窗口是通过打开 的,而不是window.opener或showModalDialog打开的。...(通过javascript,不要说什么进程啥的东东). 假设有a.html如下: 代码如下: &lt;!DOCTYPE html P

    dreamweaver的各种组件

    js depending on browser 根据不同的浏览器选择不同的javascript代码 Externel CSS file 插入外部的CSS文件 Externel Javascript file 插入外部的js文件 Video embed 插入activemovie windowsMaxmizer 最大化...

    javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)

    平时工作中写网页涉及的运动往往都非常简单,比如改变宽高,透明度,位置,是最常用的几种形式,为了省事,整合了下,于是就有了下面这个东东: 兼容:IE系列、chrome、firefox、opera、Safari、360 /* javascript...

    通过JQuery,JQueryUI和Jsplumb实现拖拽模块

    前言 由于时间的原因。这个demo只兼容IE8,IE9。其他浏览器暂时不支持。...它可以让你用很少的代码实现一些很酷的js功能(实际它封装了很多js)。 第二个JQueryUI提供了一整套核心交互插件,UI部分用jQue

    javascript的console.log()用法小结

    这一招,IE8 学会了,不过用起来比 Firebugs 麻烦,只有在开启调试窗口(F12)的时候,console.log 才能出结果,不然就报错。 今天看到 Opera 也有个叫 dragonfly 的东东,用这东西查看 DOM,已经可以和 Firebug 媲美...

    高效的表格行背景隔行变色及选定高亮的JS代码

    一个项目要用,又不想用jquery之类的东东。先去网上搜索了下,找到了不少在CSS中执行JS的表格行变色方式,不过这类方式在表格行多的时候相当卡,在IE7和firefox3中测试正常。

    用js来解决ajax读取页面乱码

    前两天写过服务端的,可以解决所有的浏览器读取中文乱码的问题,总是有点不爽,憋了一天,想出这个东东来,能解决firefox和ie读中文乱码的问题,opera不行,chome也没测试,暂且放着吧。

    JSValidation-----强大而灵活的表单客户端验证框架

    JSValidation是强大灵活的客户端验证框架。在应用服务器或者开发框架不提供验证的情况下,例如,普通的JSP, ASP, PHP等开发,以及一些不提供验证支持的开发... &lt;br&gt;请大家帮忙顶,这么好的东东不能叫他沉了啊

    计算机应用技术(实用手册)

    如果没有安装IDE设备,我们可以选择NONE参数,这样可以加快系统的启动速度,在一些特殊操作中,我们也可以通过这样来屏蔽系统对某些硬盘的自动检查。 图中2部分是DRIVE A和DRIVE B软驱设置,如果没有A或B驱动器,...

    网管教程 从入门到精通软件篇.txt

    网管教程 从入门到精通软件篇 ★一。★详细的xp修复控制台命令和用法!!! 放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 ...JS:javascript源文件 JSP:HTML网页,其中包含有对一个Java servlet...

Global site tag (gtag.js) - Google Analytics