JS - 浏览器事件总结

1,CSS:

  CSS 伪类中的每个事件,其显示效果,在各自对应的特定浏览器事件触发时会自动解除。更精确的说,那些都不是事件,而是一种状态。

  CSS 的事件相关伪类,在用于 a 元素时,CSS 1 时代有四个::link、:visited、:hover、:active。其中 :link 与 :visited 是描述默认状态的,相当于直接定义 a 元素的静态样式;另外,在时间上不可能同时发生,每次只有一个触发,也就是说,这两个伪类的事件和产生效果是永远不会叠加的,所以互相之间谁先写是没有影响的。其他事件相关伪类与它们可以叠加。:hover 必须写在默认状态之后,指鼠标移入事件到鼠标移出事件之间的状态;:active 发生在 :hover 之后,也必须写在 :hover 之后,在 CSS1 时代的浏览器是指鼠标左键按下到鼠标左键在别处按下(左键按下 - 左键弹回 - 移出 - 左键按下;或者,左键按下 - 移出 -  左键弹回 - 左键按下)。
  CSS 的事件相关伪类,在用于 a 元素时,CSS 2 时代追加了一个::focus,目的是替代并扩充原先的 :active。此时,:active 指鼠标左键按下到鼠标左键弹回,或鼠标左键按下到鼠标移出;:focus 指鼠标左键按下到鼠标左键在别处按下或键盘 Tab 键等操控选中。此刻的 :active 可以用于制作“非状态型按钮”,号称“控件按钮杀手”。IE 6 不支持 CSS 2 是众所周知的,但是即使支持部分 CSS 2 的 IE7 ,也不支持 :focus 伪类。看来 :focus 并不像 :first-child 那样幸运。还有一点,IE 6 不支持伪类后的后代选择器,强行使用的话效果比较混乱(经过圣堂测试,后代选择器的 background-position 属性还算正常),但这点 IE7 是支持的。

  CSS 的通用事件相关伪类,当然可以用于其他元素,默认状态就是以往的样式,不再区分 :link 与 :visited(本来就无法区分),其他和用于 a 元素时一样,所以是最多 :hover、:active、:focus 三个伪类。在 IE 系列中通用事件相关伪类也是由 IE7 开始支持的。


2,JS:

   JS 中的每个事件,其显示效果,必须要开发者或用户人为地去解除。所以很多事件句柄函数都是成对的——触发显示、触发消除。JS 事件句柄函数执行慢于 CSS 伪类样式加载。

   IE 系列有两个专属的事件:mouseenter 和 mouseleave,这两个事件和 load、unload、blur、focus 一样,属于 JS 中少有的非冒泡事件。onmouseenter 和 onmouseleave 原本就是为了代替会冒泡的 onmouseover 和 onmouseout 而存在的,对 IE6、7 来说正好用于模拟 :hover CSS 伪类。
   语意上是 click = mousedown + mouseup,但实际上,在大多浏览器上,同时执行某些特殊句柄函数时(比如 alert() 函数),onmousedown 会替换掉 onclick 句柄;在 IE 上更奇怪,全部都绑定 alert() 时,onmousedown 和 onmouseup 都会时不时地替换掉 onclick 句柄。另外,IE 系列还有一个大 bug,用户在目标上人工点击鼠标左键,放开时除了触发 onmouseup 和 onclick句柄外还会触发 onmouseleave 和 onmouseout 句柄。
   鼠标左键弹回时,有几个事件是几乎同时发生的(不一定全部发生),其句柄先后顺序是:onmouseup - onclick - onmouseleave - onmouseout。