我有一个鼠标移动事件监听器附加到我的画布上 . 但是在我的画布上是一个具有更高z-index的div,它包含一些菜单按钮 .
我面临的问题是,当鼠标位于菜单元素上时,我希望鼠标移动事件仍然激活 - 其中的菜单元素位于canvas元素上 .
目前,它的作用就好像鼠标不再位于画布顶部,因为菜单元素由于z-index顺序而优先 .
有没有办法让这个事件监听器忽略任何妨碍的方法?
我的代码:
var canvas = new function(){
var self = this
self.outputMouseData = function(evt,el){
var pos = mouse.relativePosition(evt,el);
el.ctx.clearRect(0,0,el.width,el.height);
el.ctx.fillStyle = "white";
el.ctx.font = "bold 16px Arial";
el.ctx.fillText(pos.x+' | '+pos.y, el.width-150,el.height-10);
}
}
elements.addEvent(foreground,'mousemove',
function(evt){ canvas.outputMouseData(evt,foreground); }
);
我的HTML
<div class="parent">
<canvas id="canvas"></canvas>
<div class="menu">Menu output</div>
</div>
父母是相对定位的 . 画布和菜单是绝对定位的,但菜单在画布上是z-index'd .
3 回答
HTML事件正在冒泡节点树(你可以阅读关于here的一个很好的解释) .
这意味着如果你将一个事件处理程序附加到包含其他元素的元素,即使在子元素上发生事件时也会调用该处理程序(给定冒泡不是z-index而不是't explicitly aborted). You can wrap your canvas & div in a wrapper element (a span for example) and attach the handler on that. You' ll .
以下是代码外观的简短示例(从here获取的getOffsetSum):
将canvas和menu-div放入容器div中 .
然后使用jQuery事件委托来侦听容器上的mousemove事件,但让画布响应那些mousemove事件 .
您可以在此处了解有关活动委派的更多信息:http://api.jquery.com/on/
我最初的想法是将“mousemove”事件添加到文档本身(而不是canvas元素或元素),并使用evt.currTarget或evt.target跟踪元素 . 通过这种方式,无论您将鼠标悬停在菜单或画布上(或任何地方),mousemove将始终存在 .