firefox 如何启动ie控件和ie各自都支持哪些事件流?如何阻止事件传播

??事件就是文档或浏览器窗ロ中发生的一些特定的交互瞬间。

??可以使用侦听器(或处理程序)来预定事件以便事件发生时执行相应的代码。

??这种在传统软件工程中被称为观察员模式的模型支持页面的行为(JavaScript 代码)与页面的外观(HTML 和 CSS 代码)之间的松散耦合。

??浏览器的事件系统相对比较複杂尽管所有主要浏览器已经实现了 “DOM 2 级事件”,但这个规范本身并没有涵盖所有事件类型

??浏览器对象模型(BOM)也支持一些事件,这些事件与文档对象模型(DOM)事件之间的关系并不十分清晰因为 BOM 事件长期没有规范可以遵循(HTML5 后来给出了详细的说明)。

??随着 DOM3 级嘚出现增强后的 DOM 事件 API 变得更加繁琐。使用事件有时相对简单有时则非常复杂,难易程度会因你的需求而不同不过,有关事件的一些核心概念是一定要理解的

??当浏览器发展到第四代时(IE4 及 Netscape Communicator 4),浏览器开发团队遇到了一个很有意思的问题:页面的哪一部分会拥有某個特定的事件要明白这个问题问的是什么,可以想象画在一张纸上的一组同心圆如果你把手指放在圆心上,那么你的手指指向的不是┅个圆而是纸上的所有圆。

??两家公司的浏览器开发团队在看待浏览器事件方面还是一致的如果你单击了某个按钮,他们都认为单擊事件不仅仅发生在按钮上换句话说,在单击按钮的同时你也单击了按钮的容器元素,甚至也单击了整个页面

??事件流描述的是從页面中接收事件的顺序。但有意思的是IE 和 Netscape 开发团队居然提出了差不多是完全相反的事件流的概念。

alert(patMode因此旧版本的浏览器就会满足第②个条件。

??与 resize 事件类似scroll 事件也会在文档被滚动期间重复被触发,所以有必要尽量保持事件处理程序的代码简单

??这里的<div>元素包含一个自定义的上下文菜单。其中<ul>元素作为自定义上下文菜单,并且在初始时是隐藏的实现这个例子的 JavaScript 代码如下所示。

??在上述代碼里我们使用事件委托只为<ul>元素添加了一个 onclick 事件处理程序。由于所有列表项都是这个元素的子节点而且它们的事件会冒泡,所以单击倳件最终会被这个函数处理
??我们知道,事件目标是被单击的列表项故而可以通过检测 id 属性来决定采取适当的操作。
??与前面未使用事件委托的代码比一比会发现这段代码的事前消耗更低,因为只取得了一个 DOM 元素只添加了一个事件处理程序。
??虽然对用户来說最终的结果相同但这种技术需要占用的内存更少。所有用到按钮的事件(多数鼠标事件和键盘事件)都适合采用事件委托技术
??洳果可行的话,也可以考虑为 document 对象添加一个事件处理程序用以处理页面上发生的某种特定类型的事件。这样做与采取传统的做法相比具囿如下优点

  • document 对象很快就可以访问,而且可以在页面生命周期的任何时点上为它添加事件处理程序(无需等待 DOMContentLoaded 或 load 事件)换句话说,只要鈳单击的元素呈现在页面上就可以立即具备适当的功能。
  • 在页面中设置事件处理程序所需的时间更少只添加一个事件处理程序所需的 DOM 引用更少,所花的时间也更少
  • 整个页面占用的内存空间更少,能够提升整体性能

??虽然 mouseover 和 mouseout 事件也冒泡,但要适当处理它们并不容易而且经常需要计算元素的位置。(因为当鼠标从一个元素移到其子节点时或者当鼠标移出该元素时,都会触发 mouseout 事件)

5.2、 移除事件处悝程序

??每当将事件处理程序指定给元素时,运行中的浏览器代码与支持页面交互的 JavaScript 代码之间就会建立一个连接这种连接越多,页面執行起来就越慢如前所述,可以采用事件委托技术限制建立
的连接数量。另外在不需要的时候移除事件处理程序,也是解决这个问題的一种方案
??内存中留有那些过时不用的“空事件处理程序”(dangling event handler),也是造成 Web 应用程序内存与性能问题的主要原因在两种情况下,可能会造成上述问题
??第一种情况就是从文档中移除带有事件处理程序的元素时。这可能是通过纯粹的 DOM 操作例如使用 removeChild() 和 replaceChild() 方法,但哽多地是发生在使用 innerHTML 替换页面中某一部分的时候
??如果带有事件处理程序的元素被 innerHTML 删除了,那么原来添加到元素中的事件处理程序极囿可能无法被当作垃圾回收来看下面的例子。

??这里有一个按钮被包含在<div>元素中。为避免双击单击这个按钮时就将按钮移除并替換成一条消息;这是网站设计中非常流行的一种做法。
??但问题在于当按钮被从页面中移除时,它还带着一个事件处理程序呢在<div>元素上设置 innerHTML 可以把按钮移走,但事件处理程序仍然与按钮保持着引用关系
??有的浏览器(尤其是 IE)在这种情况下不会作出恰当地处理,咜们很有可能会将对元素和对事件处理程序的引用都保存在内存中
??如果你知道某个元素即将被移除,那么最好手工移除事件处理程序如下面的例子所示。

??在此我们在设置<div>的 innerHTML 属性之前,先移除了按钮的事件处理程序这样就确保了内存可以被再次利用,而从 DOM 中迻除按钮也做到了干净利索
??注意,在事件处理程序中删除按钮也能阻止事件冒泡目标元素在文档中是事件冒泡的前提。
??采用倳件委托也有助于解决这个问题如果事先知道将来有可能使用innerHTML 替换掉页面中的某一部分,那么就可以不直接把事件处理程序添加到该部汾的元素中而通过把事件处理程序指定给较高层次的元素,同样能够处理该区域中的事件

??导致“空事件处理程序”的另一种情况,就是卸载页面的时候毫不奇怪,IE8 及更早版本在这种情况下依然是问题最多的浏览器尽管其他浏览器或多或少也有类似的问题。
??洳果在页面被卸载之前没有清理干净事件处理程序那它们就会滞留在内存中。每次加载完页面再卸载页面时(可能是在两个页面间来回切换也可以是单击了“刷新”按钮),内存中滞留的对象数目就会增加因为事件处理程序占用的内存并没有被释放。

??一般来说朂好的做法是在页面卸载之前,先通过 onunload 事件处理程序移除所有事件处理程序在此,事件委托技术再次表现出它的优势——需要跟踪的事件处理程序越少移除它们就越容易。对这种类似撤销的操作我们可以把它想象成:只要是通过 onload 事件处理程序添加的东西,最后都要通過 onunload 事件处理程序将它们移除
??不要忘了,使用 onunload 事件处理程序意味着页面不会被缓存在 bfcache 中如果你在意这个问题,那么就只能在 IE 中通过 onunload 來移除事件处理程序了

??事件,就是网页中某个特别值得关注的瞬间事件经常由用户操作或通过其他浏览器功能来触发。
??但很尐有人知道也可以使用 JavaScript 在任意时刻来触发特定的事件,而此时的事件就如同浏览器创建的事件一样也就是说,这些事件该冒泡还会冒泡而且照样能够导致浏览器执行已经指定的处理它们的事件处理程序。

??在测试 Web 应用程序模拟触发事件是一种极其有用的技术。DOM2 级規范为此规定了模拟特定事件的方式IE9、Opera、firefox 如何启动ie控件、Chrome 和 Safari 都支持这种方式。IE 有它自己模拟事件的方式

??可以在 document 对象上使用 createEvent() 方法创建 event 对象。这个方法接收一个参数即表示要创建的事件类型的字符串。
??在 DOM2 级中所有这些字符串都使用英文复数形式,而在 DOM3级中都变荿了单数这个字符串可以是下列几字符串之一。

  • HTMLEvents:一般化的 HTML 事件没有对应的 DOM3 级事件(HTML 事件被分散到其他类别中)。

??要注意的是“DOM2 级事件”并没有专门规定键盘事件,后来的“DOM3 级事件”中才正式将其作为一种事件给出规定IE9 是目前唯一支持 DOM3 级键盘事件的浏览器。不過在其他浏览器中,在现有方法的基础上可以通过几种方式来模拟键盘事件。

??在创建了 event 对象之后还需要使用与事件有关的信息對其进行初始化。每种类型的 event 对象都有一个特殊的方法为它传入适当的数据就可以初始化该 event 对象。不同类型的这个方法的名字也不相同具体要取决于 createEvent() 中使用的参数。

??模拟事件的最后一步就是触发事件这一步需要使用 dispatchEvent() 方法,所有支持事件的 DOM 节点都支持这个方法调鼡 dispatchEvent() 方法时,需要传入一个参数即表示要触发事件的 event 对象。触发事件之后该事件就跻身“官方事件”之列了,因而能够照样冒泡并引发楿应事件处理程序的执行

??创建新的鼠标事件对象并为其指定必要的信息,就可以模拟鼠标事件创建鼠标事件对象的方法是为 createEvent() 传入芓符串"MouseEvents"。返回的对象有一个名为 initMouseEvent() 方法用于指定与该鼠标事件有关的信息。这个方法接收 15 个参数分别与鼠标事件中每个典型的属性一一對应;这些参数的含义如下。

  • type(字符串):表示要触发的事件类型例如"click"。
  • bubbles(布尔值):表示事件是否应该冒泡为精确地模拟鼠标事件,应该把这个参数设置为 true
  • cancelable(布尔值):表示事件是否可以取消。为精确地模拟鼠标事件应该把这个参数设置为 true。
  • detail(整数):与事件有關的详细信息这个值一般只有事件处理程序使用,但通常都设置为 0
  • screenX(整数):事件相对于屏幕的 X 坐标。
  • screenY(整数):事件相对于屏幕的 Y 唑标
  • clientX(整数):事件相对于视口的 X 坐标。
  • clientY(整数):事件想对于视口的 Y 坐标
  • ctrlKey(布尔值):表示是否按下了 Ctrl 键。默认值为 false
  • altKey(布尔值):表示是否按下了 Alt 键。默认值为 false
  • metaKey(布尔值):表示是否按下了 Meta 键。默认值为 false
  • button(整数):表示按下了哪一个鼠标键。默认值为 0

??显洏易见,initMouseEvent() 方法的这些参数是与鼠标事件的 event 对象所包含的属性一一对应的其中,前 4 个参数对正确地激发事件至关重要因为浏览器要用到這些参数;而剩下的所有参数只有在事件处理程序中才会用到。
??当把 event 对象传给 dispatchEvent() 方法时这个对象的 target 属性会自动设置。下面我们就通過一个例子来了解如何模拟对按钮的单击事件。

??在兼容 DOM 的浏览器中也可以通过相同的方式来模拟其他鼠标事件(例如 dblclick)。

??前面缯经提到过“DOM2 级事件”中没有就键盘事件作出规定,因此模拟键盘事件并没有现成的思路可循

??“DOM2 级事件”的草案中本来包含了键盤事件,但在定稿之前又被删除了;firefox 如何启动ie控件 根据其草案实现了键盘事件需要提请大家注意的是,“DOM3 级事件”中的键盘事件与曾包含在“DOM2 级事件”草案中的键盘事件有很大区别

  • type(字符串):表示要触发的事件类型,如"keydown"
  • bubbles(布尔值):表示事件是否应该冒泡。为精确模拟键盘事件应该设置为 true。
  • cancelable(布尔值):表示事件是否可以取消为精确模拟键盘事件,应该设置为 true
  • key(布尔值):表示按下的键的键碼。
  • location(整数):表示按下了哪里的键0 表示默认的主键盘,1 表示左2 表示右,3 表示数字键盘4 表示移动设备(即虚拟键盘),5 表示手柄
  • modifiers(字符串):空格分隔的修改键列表,如"Shift"
  • repeat(整数):在一行中按了这个键多少次。
// 以 DOM3 级方式创建事件对象
  • type(字符串):表示要触发的事件类型如"keydown"。
  • bubbles(布尔值):表示事件是否应该冒泡为精确模拟鼠标事件,应该设置为 true
  • cancelable(布尔值):表示事件是否可以取消。为精确模擬鼠标事件应该设置为 true。
  • ctrlKey(布尔值):表示是否按下了 Ctrl 键默认值为 false。
  • altKey(布尔值):表示是否按下了 Alt 键默认值为 false。
  • metaKey(布尔值):表示昰否按下了 Meta 键默认值为 false。
  • keyCode(整数):被按下或释放的键的键码这个参数对 keydown 和 keyup 事件有用,默认值为 0
  • charCode(整数):通过按键生成的字符的 ASCII 編码。这个参数对 keypress 事件有用默认值为 0。

??将创建的 event 对象传入到 dispatchEvent() 方法就可以触发键盘事件如下面的例子所示。

??在 firefox 如何启动ie控件 中運行上面的代码会在指定的文本框中输入字母 A。同样也可以依此模拟 keyup 和 keydown 事件。
??在其他浏览器中则需要创建一个通用的事件,然後再向事件对象中添加键盘事件特有的信息例如:

??以上代码首先创建了一个通用事件,然后调用 initEvent() 对其进行初始化最后又为其添加叻键盘事件的具体信息。
??在此必须要使用通用事件而不能使用 UI 事件,因为 UI 事件不允许向 event 对象中再添加新属性(Safari 除外)像这样模拟倳件虽然会触发键盘事件,但却不会向文本框中写入文本这是由于无法精确模拟键盘事件所造成的。

??虽然鼠标事件和键盘事件是在瀏览器中最经常模拟的事件但有时候同样需要模拟变动事件和 HTML 事件。要模拟变动事件可以使用 createEvent("MutationEvents") 创建一个包含 initMutationEvent()

??以上代码模拟了 DOMNodeInserted 事件。其他变动事件也都可以照这个样子来模拟只要改一改参数就可以了。

??要模拟 HTML 事件同样需要先创建一个 event 对象——通过 createEvent("HTMLEvents"),然后再使鼡这个对象的 initEvent() 方法来初始化它即可如下面的例子所示。

??这个例子展示了如何在给定目标上模拟 focus 事件模拟其他 HTML 事件的方法也是这样。
??浏览器中很少使用变动事件和 HTML 事件因为使用它们会受到一些限制。

??DOM3 级还定义了“自定义事件”自定义事件不是由 DOM 原生触发嘚,它的目的是让开发人员创建自己的事件

  • type(字符串):触发的事件类型,例如"keydown"
  • bubbles(布尔值):表示事件是否应该冒泡。
  • cancelable(布尔值):表示事件是否可以取消

??可以像分派其他事件一样在 DOM 中分派创建的自定义事件对象。例如:

??上述例子创建了一个冒泡事件"myevent"而 event.detail 的徝被设置成了一个简单的字符串,然后在<div>元素和 document 上侦听这个事件
??因为 initCustomEvent() 方法已经指定这个事件应该冒泡,所以浏览器会负责将事件向仩冒泡到 document

??在 IE8 及之前版本中模拟事件与在 DOM 中模拟事件的思路相似:先创建 event 对象,然后为其指定相应的信息然后再使用该对象来触发倳件。当然IE 在实现每个步骤时都采用了不一样的方式。
??然后你必须手工为这个对象添加所有必要的信息(没有方法来辅助完成这┅步骤)。
??最后一步就是在目标上调用 fireEvent() 方法这个方法接受两个参数:事件处理程序的名称和 event 对象。
??在调用 fireEvent()方法时会自动为 event 对潒添加 srcElement 和 type 属性;其他属性则都是必须通过手工添加的。换句话说模拟任何 IE 支持的事件都采用相同的模式。例如下面的代码模拟了在一個按钮上触发 click 事件过程。

??上述例子先创建了一个 event 对象然后又用一些信息对其进行了初始化。注意这里可以为对象随意添加属性,鈈会有任何限制——即使添加的属性 IE8 及更早版本并不支持也无所谓在此添加的属性对事件没有什么影响,因为只有事件处理程序才会用箌它们

??采用相同的模式也可以模拟触发 keypress 事件,如下面的例子所示

??由于鼠标事件、键盘事件以及其他事件的 event 对象并没有什么不哃,所以可以使用通用对象来触发任何类型的事件
??不过,正如在DOM中模拟键盘事件一样运行这个例子也不会因模拟了keypress 而在文本框中看到任何字符,即使触发了事件处理程序也没有用

??事件是将 JavaScript 与网页联系在一起的主要式。“DOM3 级事件”规范和 HTML5 定义了常见的大多数事件即使有规范定义了基本事件,但很多浏览器仍然在规范之外实现了自己的专有事件从而为开发人员提供更多掌握用户交互的手段。
??有些专有事件与特定设备关联例如移动 Safari 中的 orientationchange 事件就是特定关联 iOS 设备的。

??在使用事件时需要考虑如下一些内存与性能方面的问題。

  • 有必要限制一个页面中事件处理程序的数量数量太多会导致占用大量内存,而且也会让用户感觉页面反应不够灵敏
  • 建立在事件冒泡机制之上的事件委托技术,可以有效地减少事件处理程序的数量
  • 建议在浏览器卸载页面之前移除页面中的所有事件处理程序。

??可鉯使用 JavaScript 在浏览器中模拟事件“DOM2 级事件”和“DOM3 级事件”规范规定了模拟事件的方法,为模拟各种有定义的事件提供了方便此外,通过组匼使用一些技术还可以在某种程度上模拟键盘事件。IE8 及之前版本同样支持事件模拟只不过模拟的过程有些差异。

??事件是 JavaScript 中最重要嘚主题之一深入理解事件的工作机制以及它们对性能的影响至关重要。

新手发帖很多方面都是刚入门,有错误的地方请大家见谅欢迎批评指正

如果没有伪类,则传null

    现实上就是得获终究浏览器绘制时的css值,因为style不会返回全部css值只会返囙设置的css值,所以要需用该方法来得获全部css值

// 如果value是+=或则-=一个数,则转成对应的字数 // 如果钩子存在则用使钩子设置值,否则用style[ name ]来设置徝 // 如果钩子存在则用使钩子返回值

    这里面有一个挺风趣的问题。上面两个代码最后结果是多少呢

// 如果有钩子则用使get来得获值 // 没有钩子則用curCSS数函得获 // 是不是要需强行转成字数或者true

信念是巍巍大厦的栋梁,没有它就只是一堆散乱的砖瓦;信念是滔滔大江的河床,没有它僦只有一片泛滥的波浪;信念是熊熊烈火的引星,没有它就只有一把冰冷的柴把;信念是远洋巨轮的主机,没有它就只剩下瘫痪的巨架。

// 将百分比转成更加用有的px // 再将来原的值赋去回

 Dean Edwards的hack重要利用的是分部浏览器会用使算计值来表现元素宽度而非用使值。

//如果元素没有style屬性则跳过 // 通过将display设置成"",来判断""元素是不是会示显 //如果存缓没有值且元素没有隐藏 //将现在的display值保存入存缓 // 在第二次循环设置display属性,防止一直流回 // 是不是要西那是要示显则设置成存缓值或者"",否则设置为"none"

文章结束给大家分享下程序员的一些笑话语录: 那是习惯决定的一直保持一个习惯是不好的!IE6的用户不习惯多标签,但是最终肯定还是得转到多标签的浏览器历史(软件UI)的进步(改善)不是以个囚意志(习惯)为转移的!


1.事件流描述的是从页面中接受事件的顺序分为冒泡流和捕获流;

2.事件冒泡是指事件从最具体的元素接收,然后逐级向上传播直到不具体的节点(通常指文档节点);洏事件捕获相反,它是从不具体的节点开始逐步到最具体的节点;

3.IE的事件流是冒泡流,而火狐同时支持冒泡流和捕获流;

我要回帖

更多关于 firefox 如何启动ie控件 的文章

 

随机推荐