IE9 通过屏蔽画布元素转发鼠标事件

Posted

技术标签:

【中文标题】IE9 通过屏蔽画布元素转发鼠标事件【英文标题】:IE9 Forward mouse events through a masking canvas element 【发布时间】:2011-11-18 18:58:00 【问题描述】:

我的绝对定位的画布元素阻止了所有鼠标事件,因此它们下方的任何内容都不能被点击,同样的问题提到了here 和here。

我有多个需要位于特定 z-index 的画布层,因此我需要通过画布转发鼠标事件。 pointer-events: none; 在不错的浏览器中工作,但对于 IE9 我需要 javascript 来完成,这是我目前的解决方案,

 var evts = [ 'click', 'mousedown', 'mouseup', 'dblclick'],
                canvases = $('canvas');

            $.each(evts, function(_, event)
                canvases.bind(event, function(evt)
                    var target,
                        pEvent;
                    $(this).hide();
                    target = document.elementFromPoint(evt.clientX, evt.clientY); 
                    $(this).show();
                    pEvent = $.Event(event);
                    pEvent.target = target;
                    pEvent.data = evt.data;
                    pEvent.currentTarget = target;
                    pEvent.pageX = evt.pageX;
                    pEvent.pageY = evt.pageY;
                    pEvent.result = evt.result;
                    pEvent.timeStamp = evt.timeStamp;
                    pEvent.which = evt.which;
                    $(target).trigger(event, pEvent);
                 );
            );   

工作示例, jsFiddle

问题;

1.我正在创建新事件并传递相关数据,传递 evt var 并修改目标和 currentTarget 是否安全?

2。如何推广右键单击?

或者有没有人有更好的方法来做到这一点?其他相关问题都比较老了。

【问题讨论】:

【参考方案1】:

没有clean 方法可以跨浏览器传递事件。您可以传递(修改后的)事件,但不能保证它会正常工作,尤其是跨浏览器。

要使用您的代码进行右键单击,只需执行以下操作:http://jsfiddle.net/6WMXh/20/

(你一半使用了 jquery 额外信息部分,但从未对它做任何事情)

【讨论】:

我正在尝试通过画布发送事件,而不是发送到画布中。在 IE9 中,画布下方的任何元素都不会获得传递给它的点击事件。你可以在 IE9 中看到我的意思 here。 天哪,我没注意到下面的元素不是画布!我已经编辑了我的答案,但可悲的事实是,仍然没有黄金方法可以做到这一点。 谢谢,我只需要添加一个检查,这样它也适用于不在画布下的元素,e.button == 2 || pEvent.button == 2。 Dam,我讨厌 IE...

以上是关于IE9 通过屏蔽画布元素转发鼠标事件的主要内容,如果未能解决你的问题,请参考以下文章

js 外部按钮点击事件与canvas画布里的线条鼠标事件冲突

在画布元素上创建与鼠标事件交互的碰撞区域

如何获取鼠标单击画布元素的坐标? [复制]

如何在Android应用里屏蔽鼠标点击事件

WPF:画布鼠标事件未在空白处触发

HTML5 Canvas 鼠标滚轮事件