通过html画布获得点击次数

时间:2010-09-01 06:32:56

标签: html5 canvas mouse

我看到很多关于如何让html5 canvas元素接收鼠标点击的问题,我使用画布作为叠加层,鼠标点击不会转到下面的元素。我正在将一个图像加载到画布中,我认为这可能是问题,但我也尝试使用空画布,我得到了相同的结果。

这是一个例子: 与图像: http://www.1luckypixel.com/paranormal/canvas_test.html 该链接转到谷歌,但它没有注册。

我的理解是默认情况下画布对鼠标是透明的吗?

9 个答案:

答案 0 :(得分:9)

如果不要求跨浏览器功能,那么有一个简单的解决方案。在支持非SVG元素(webkit,Mozilla和其他人,但特别是IE)的浏览器上,您可以使用名为 pointer-events 的css属性。来自MDN:

“CSS属性指针事件允许作者控制特定图形元素在什么情况下(如果有的话)成为鼠标事件的目标。当未指定此属性时,visiblePainted值的相同特征适用于SVG内容

除了指示该元素不是鼠标事件的目标之外,值none指示鼠标事件“穿过”该元素并将目标转移到该元素的“下面”。

警告:在非SVG元素的CSS中使用指针事件是实验性的。目前在CSS3 UI草案规范中定义,有讨论将其推迟到CSS4。

至少,您可以使用Modernizr检测指针事件支持,并在不支持它的浏览器上执行Simon Sarris's answer中提到的不透明技巧。

此外,如果您的应用程序特定于谷歌地图,您可以将画布作为谷歌地图叠加层插入,从而避免所有问题。

实施例: http://www.patrick-wied.at/static/heatmapjs/demo/maps_heatmap_layer/gmaps.php

答案 1 :(得分:5)

假设您无法将链接放在画布上方......

对于新的/体面的浏览器,只需使用此CSS:

#canvas { pointer-events:none; }

IE +旧浏览器的一种肮脏的解决方法(你可以删除对jQuery的依赖):

jQuery('#canvas').click(function(e) {
    window.location = jQuery('#element-under-canvas').attr('href');
});

显然,这只支持当前的锚点,你需要知道画布下的特定元素(或者可以使用jQuery选择器魔术找到它)。

答案 2 :(得分:2)

简而言之,您无法通过点击。

但第二个最短的答案是你确实可以做任何你想要的事情!你必须愿意对解决方案感到有点奇怪。

我能想到的第一种方式有点令人抓狂但很容易:对于画布后面的每个项目,在画布前面制作一个类似的秘密物品。然后将您想要的事件放在秘密项目上:

<!-- A visible button behind the canvas -->
<button id="but" type="button" style="position: absolute; top: 100px; left: 100px;">Click Me!</button>

<canvas id="can" width="500" height="500" style="position: absolute;"></canvas>

<!-- A near copy of the visible button, but this one is invisible and in front of the canvas! -->
<button id="but" type="button" onclick="alert('click!')" style="position: absolute; top: 100px; left: 100px; opacity: 0;">Click Me!</button>

如果您想查看代码click here

如果你想要可点击的画布背后有一百个东西,那么还有一些更疯狂但更可维护的方法,但如果你只想要1-3个你喜欢的东西,这可能是最容易做到的点击画布后面。

答案 3 :(得分:2)

我能够通过像这样设置画布来实现这一点:

<div>
    <a href='#'>my link</a>
    <canvas></canvas>
</div>

然后我在CSS中将它设置为以下内容:

canvas {
    display: block;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    position: absolute;
    z-index:-1; /* NOT SURE HOW SUPPORTED THIS IS, IT WORKED IN CHROME */
}

div中的链接是可点击的,无论我在运行时画到画布上的是什么。

希望这有帮助!

答案 4 :(得分:1)

借用Simon Sarris的回答,在某些情况下使用画布和画布可能会更简单。控件在同一平面上。根据控件的不同,它并不总是允许画布在控件的顶部绘制,但在Joe的原始问题中似乎并不需要。重要的是要确保画布和控件在同一个Z平面上,两者都有一个使用“position”关键字的样式,并且控件的HTML在canvas语句之后。以下是使用此方法组合控件的画布示例。

<canvas id="can" width="500" height="500" style="z-index:2; position: absolute;"></canvas>
<!-- Put text and a link on the same plane as the canvas -->
<div style="position: relative; z-index: 2;">
   <a href="http://www.google.com/">Click</a> this Google link.
</div>

答案 5 :(得分:0)

我不确定这个程序如何,但Simon Sarris实际上在评论中提供了解决方案:

  

不幸的是我的其他方法不会   在这种情况下工作。 :(但是,你   可能仍然混淆不透明,直到   你有一些接近你的东西   想。这是一个透明的例子   地图显示它背后的画布。它   看起来好像绿色框在顶部   但它真的只是显示:   jsfiddle.net/un9yW/11当然,这样做   这种方法意味着没有办法   制作一个绿色的盒子来完全覆盖   地图的一部分,依此类推   有点蹩脚。如果我,我会告诉你的   想想任何可行的事情   为了你的情况。 - 西蒙·萨里斯7   小时前

答案 6 :(得分:0)

以下是我解决这个问题的方法......

我有一个圆形的用户界面设备(在纯HTML5画布上绘制,这是一个正方形)。 只有圆圈是彩色的,画布的其余部分是透明的,我想点击它。在方形帆布的角落下,Kinetic JS舞台上有各种形状。

通常,您无法点击画布。

但是你可以将click事件发送到Kinetic形状,并激活该形状中的事件监听器,如下所示:

    $( '#myCanvasUserInterfaceLayer' ).on( 'click', function( e ) {

        var pos = getMousePos( e );
        var obscuredKineticShape = kineticLayer.getIntersection( pos );

   // (Note: console.log(obscuredKineticShape) and you find that 
   // 'getIntersection' returns an object with the topmost shape 
   //  at the click point on the kinetic stage within it, called 'shape').

        obscuredKineticShape.shape.fire( 'mousedown' ); 

    });

     function getMousePos( e ) {

        return {
          x: e.pageX,
          y: e.pageY
        };
      }

答案 7 :(得分:0)

我认为最好动态更改z-index。 如果你需要使用控件设置他们的z-index高于画布。 如果你需要使用canvas - 将它的z-index设置为高于控件。 确切的方法如何做到这一点取决于你的情况。您可以监听mousedown / mouseup事件,或者在某些区域上移动鼠标。

答案 8 :(得分:0)

将画布 previewProvider 设置为“无”将允许触发底层鼠标点击事件。

styles.pointerEvents