为什么fillRect命令不允许创建命中区域,而rect和fill的组合允许创建命中区域?
Why doesn't fillRect command allow to create a hit region while a combination of rect and fill does?
我在使用CanvasRenderingContext2D.addHitRegion()
时偶然发现了这个问题,我试图理解这是否是一种预期的行为,如果是,这背后的原因是什么。
这是我的工作JSFIDDLE,我创建了一个画布,点击区域,可以显示点击区域的id。
我是这样添加hit区域的:
ctx.beginPath();
ctx.rect(0, i, canvasWidth, itemHeight);
ctx.fill();
ctx.addHitRegion({'id': count, 'cursor': 'pointer'});
这里是同样的例子,只有一个小的改变(,这就是我最初尝试这样做的方式-当我可以使用一个命令来做同样的事情时,为什么要使用两个命令?)
ctx.fillRect(0, i, canvasWidth, itemHeight);
ctx.addHitRegion({'id': count, 'cursor': 'pointer'});
不幸的是,它不起作用,如下所示JSFIDDLE
控制台显示以下错误:
未捕获NotSupportedError:未能执行'addHitRegion''CanvasRenderingContext2D':指定的路径没有像素。
所以似乎为了创建命中区域,你不能使用fillRect
命令-我找不到任何解释这个行为。
很高兴听到任何想法!
fillRect
是Context2D
的直接命令之一:它创建一个"幕后"路径并立即填充它。
这意味着当命中区域需要路径时,它不会像rect那样构建路径。
请注意,您不需要填充它,所以只有在需要时才这样做。
作为旁注,浏览器对hit区域的支持不是那么好,正如你在这里看到的:https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/addHitRegion,它仍然是实验性的,所以如果你想要/需要广泛的支持,请查看此
正如@MarkE引用的那样,实现击中区域的安全方法是自己处理鼠标(getBoundingClientRect
是你的朋友!),你的路径集合,并使用isPointInPath
检查坐标。
再次注意,isPointInPath
需要一个路径,所以它不能用于直接命令(fillXXX/strokeXXX/ImageData之类的)。
- onkeyup无法动态创建多个文本区域
- 如何为高图中的区域线创建z索引
- 如何在php中创建一个函数,该函数与文本区域一起工作,通过输入类似[color:red]的内容来打印具有等效颜色的文本
- 如何为动态创建的文本区域中输入的值更新ng模型
- 如何在sap.m.Image元素上创建可点击区域
- 在文本输入区域中创建双向更新
- 使用不同的日期格式和区域设置创建时刻
- 如何在不使用iframe或库的情况下创建剪切显示窗口区域
- 在SVG中创建带有外来对象的文本区域的Javascript不起作用
- 设置焦点动态创建的文本区域
- 在提交之前创建文本区域预览
- 在文本区域(密文器)中创建自动分页符
- 如何创建具有滚动背景图像的可滚动文本区域
- 创建选项卡,每个选项卡有两个文本区域
- 如何根据电子邮件模板名称的选择创建依赖的同义词文本区域
- 无法检索动态创建的文本区域 jquery 的文本
- 可以't将通过Javascript创建的画布指定为放置区域
- 使用php创建的下拉列表中的选择单独填充文本区域
- 为基于html/javascript的文本区域创建一个退格按钮
- 如何防止XSS,使用文本区域创建javascript代码