- From: Hawkeyes Wind <hawkeyes0.cn@gmail.com>
- Date: Fri, 16 Mar 2012 13:52:05 +0800
- To: public-html-ig-zh@w3.org
- Message-ID: <4F62D505.6060601@gmail.com>
Firefox的行为跟其浏览器架构有关。 Firefox浏览器本身就是由其浏览器核心渲染呈现的,所以其右键的上下文菜单的 原理与网页一致,即由鼠标事件触发,然后判断如果显示上下文菜 单,则继续触 发contextmenu,否则跳过。 而Chrome和IE的浏览器本身并不是由浏览器核心渲染的,所以只好把一切都做成事 件,然后在决定是否处理事件。 于 2012/3/16 13:35, Gray Zhang 写道: > 根据昨天在#javascript罗浮宫2群#与@可乐 同学的讨论,浏览器在处理鼠标右 > 键的MosueEvent序列时存在一些不同,在此摘录并邀请大家讨论: > 测试页面如下: > > <!DOCTYPE html> > <html> > <head> > <meta charset="utf-8" /> > <title>Hello World</title> > </head> > <body> > <div style="width: 400px; height: 400px; background: red;"></div> > <script> > var div = document.getElementsByTagName('div')[0]; > div.addEventListener('mousedown', function() { > console.log('mousedown on div'); }, false); > div.addEventListener('up', function() { > console.log('mousedown on div'); }, false); > div.addEventListener('click', function() { > console.log('mousedown on div'); }, false); > div.addEventListener('contextmenu', function() { > console.log('mousedown on div'); }, false); > document.addEventListener('mousedown', function() { > console.log('mousedown on document'); }, false); > document.addEventListener('up', function() { > console.log('mousedown on document'); }, false); > document.addEventListener('click', function() { > console.log('mousedown on document'); }, false); > document.addEventListener('contextmenu', function() { > console.log('mousedown on document'); }, false); > </script> > </body> > </html> > > 在红色的<div>元素上右键单击一次后,出现的事件顺序在各浏览器中如下: > Chrome 17: > mousedown on div > mousedown on document > mouseup on div > mouseup on document > contextmenu on div > contextmenu on document > Firefox 11: > mousedown on div > mousedown on document > mouseup on div > mouseup on document > click on document > contextmenu on div > contextmenu on document > IE 9: > mousedown on div > mousedown on document > mouseup on div > mouseup on document > contextmenu on div > contextmenu on document > 可以看到,Chrome和IE行为相同,而Firefox会额外在document上触发一个click > 事件,且该事件不 捕获(有使用useCapture参数测试)不冒泡。 > 如果给所有的事件处理函数加上preventDefault行为,则各浏览器中的结果如下: > Chrome 17: > mousedown on div > mousedown on document > mouseup on div > mouseup on document > contextmenu on div > contextmenu on document > 不弹出菜单 > Firefox 11: > mousedown on div > mousedown on document > mouseup on div > mouseup on document > click on document > 不弹出菜单 > IE 9: > mousedown on div > mousedown on document > mouseup on div > mouseup on document > contextmenu on div > contextmenu on document > 不弹出菜单 > 同样Chrome和IE9有相同的结果,Firefox则会因为click事件中的 > preventDefault行为影响 contextmenu事件的触发 > 根据DOM Event Level3(http://www.w3.org/TR/DOM-Level-3-Events/#event- > type-click) 中的描述: > > The default action of the click event type varies based on the > proximal event target of the event and the value of the > MouseEvent.button or MouseEvent.buttons attributes. Typical > default actions of the click event type are as follows: > Left click (MouseEvent.button value is 0, MouseEvent.buttons value > is 1): > If the proximal event target has associated activation > behavior, the default action must be to execute that activation > behavior (see Activation triggers and behavior). > If the proximal event target is focusable, the default action > must be to give that element document focus. > Right click (MouseEvent.button value is 1, MouseEvent.buttons > value is 2): > The default action must be to provide a context menu of > options related to that proximal event target. > Middle click (MouseEvent.button value is 2, MouseEvent.buttons > value is 4): > If the proximal event target has associated activation > behavior, the default action must be to execute that activation > behavior in an alternate fashion (such as opening a link in a new > tab or window). > If the proximal event target has no associated activation > behavior, the default action must be device- and user-defined, but > when associated with a device wheel, is often to activate an > alternate scrolling or panning mode. > > 可以有以下结论: > 1. click事件的default action根据按键的不同有不同的行为,并且明确定义了 > 右键(Right click)时的行为,因此认为鼠标右键应当能触发click事件。在这 > 一点上,Firefox更靠近标准实现,但仅在document上触发一个不捕获 不冒泡的 > 事件,行为较为怪异。在关于右键与click事件的关系上,请大家提供更多的资 > 料或讨论。 > 2. 鼠标右键click事件的default action是“提供contextmenu”,因此在click事 > 件中使用preventDefault,会阻止contextmenu的出现,这一点 所有浏览器一 > 致。但是“不提供contextmenu”是否意味着同时“不触发contextmenu”事件,在这 > 点上各浏览器 理解不同,Chrome和IE都选择触发contextmenu但不显示菜单,这 > 一点类似HTML标准中由tabindex引起 不可聚焦元素变为可聚焦时 > (http://www.whatwg.org/specs/web-apps/current-work/multipage > /editing.html#focus) 的相关行为(activation behavior which will fire > a xxx event but does nothing)。但是Firefox选择同时阻止contextmenu事件 > 的触发。在这两者之间哪一个正为准确,邀请大家讨论。 > -------------------------------------------------------- > > Gray Zhang > Mail: otakustay@gmail.com > Blog: http://www.otakustay.com > Weibo: http://www.weibo.com/otakustay -- Regards Hawkeyes Wind
Received on Friday, 16 March 2012 05:52:56 UTC