我在canvas元素上使用了指针锁,画布全屏显示。我想检测右键点击和左键点击以响应它们。是否可以响应全屏和指针锁定中的点击?我已经知道如何使用指针锁api和全屏api,我不想要任何解释如何使用它们的答案。任何帮助将不胜感激。
答案 0 :(得分:2)
根据我已经完成的实验,简短的答案是"它取决于。"看看下面的演示。画布按比例缩放为每个尺寸的屏幕尺寸的四分之一。将光标移到它上面时,画布上会出现一个白色圆圈。当您左键单击时,您将在画布上绘制一个红色圆圈,当您右键单击时,您将在画布上绘制一个青色圆圈。当您单击"全屏"按钮,您将激活指针锁定并进入全屏模式。如果按下" Esc"键,您将退出指针锁定和全屏模式。
请注意,您需要将代码复制并粘贴到文件中并加载它。如果您只需点击"运行代码段,该演示就不会运行。"
就你的问题而言,我有两个问题:
click
,mousedown
,mouseup
,contextmenu
)获得右键单击事件。当不在全屏/指针锁定时,左右两个事件都会在两个浏览器中按预期触发。如果有人在全屏/指针锁定时有任何听取右键单击事件的解决方案,我很乐意听到它们。canvas
位于div
内。 div
具有指针锁定。 onclick
,canvas
和div
附加document
个处理程序,以报告控制台中的点击事件。如果没有指针锁定,单击画布会触发所有三个元素onclick
,canvas
和div
)的document
处理程序。但是,在div
上使用指针锁定时,onclick
的{{1}}处理程序永远不会被触发,尽管canvas
和div
的处理程序也会触发。 我还向Firefox发现了一些其他的怪癖,虽然与您的初始问题没有直接关系,但可能对有兴趣实施此类事情的人有所帮助:
document
样式(即占据全屏)。相反,我必须将canvas
包裹在canvas
中并在div
上输入全屏。有关详细信息,请参阅Fullscreen API documentation on MDN:如果您尝试在Gecko上模拟WebKit的行为,则需要将要呈现的元素放在另一个元素中,而您将使用全屏模式,并使用CSS规则调整内部元素以匹配您想要的外观。
在Firefox中,激活全屏模式停用指针锁定。为了激活两者,我必须首先激活全屏模式,然后激活指针锁定。但是简单的两行代码:
div
无效。我对正在发生的事情的理解是,在全屏模式完全建立之前,对requestPointerLock的调用已经启动。这导致指针锁定被激活,然后再次快速停用。我发现在调用canvasContainer.requestFullscreen();
canvasContainer.requestPointerLock();
之前必须等到全屏模式完全建立。检查requestPointerLock()
似乎足以检查全屏模式是否完全正常运行。以下单击处理程序定义可以解决此问题:
document.mozFullScreenElement !== null
此功能会反复检查是否已建立全屏模式。如果是,它会启动指针锁定。如果在2秒后无法确定全屏模式,则超时。
我还没有在IE中进行任何测试。
document.getElementById('fullscreen_button').onclick = function(e) {
// When button is clicked, enter both full screen and pointer lock
canvasContainer.requestFullscreen();
var timeout = 2000;
var interval = window.setInterval(function() {
if (document.mozFullScreenElement !== null) {
window.clearInterval(interval);
canvasContainer.requestPointerLock();
} else if (timeout <= 0) {
addErrorMessage('Unable to establish pointer lock.');
clearTimeout(interval);
} else {
timeout -= 50;
}
}, 50);
}
&#13;
答案 1 :(得分:1)
这对于我在指针锁定后处理rightClick很有用。
const onMouseDown = (evt) => {
switch (evt.which) {
case 1: return handleLeftClick();
case 3: return handleRightClick();
}
};
document.body.addEventListener('mousedown', onMouseDown, true);