如何捕捉元素外的鼠标上移事件
How to catch mouse-up event outside of element?
我有简单的Javascript代码,类似于以下代码:
var mouseIsDown = false;
...
function canvasMouseDown(e) {
...
mouseIsDown = true;
}
function canvasMouseUp(e) {
mouseIsDown = false;
}
function canvasMouseMove(e) {
if (mouseIsDown) {
...
}
}
通过使用canvas实现我自己的转换(翻译、缩放和旋转)用户界面。
canvasMouseMove()
函数中的这种实现检查mouseIsDown
变量。如果用户在光标/指针位于画布元素之外时不释放鼠标按钮,则一切都可以正常工作。如果发生这种情况,变量mouseIsDown
将保持为true
,并且不会被canvasMouseUp
函数关闭。
对于这个问题,纯JavaScript(无jQuery)中有什么简单的修复或解决方案?
如果您想在文档中的其他地方捕获mouseup
事件,可以在documentelement
中添加一个事件处理程序。请注意,这不会对视口外的mouseup
事件做出反应,因此,当鼠标再次进入视口而不按下按钮时,您可能也需要激发。
如果你想抓住离开画布元素的鼠标,它会变得有点复杂。虽然IE知道mouseleave
事件,但标准DOM有一个mouseout
事件,该事件也会在元素的后代留下时触发(尽管画布通常没有子元素)。更多信息请访问quicksmode.org。
我创建了一个fiddle来演示该行为(仅适用于W3DOM)。您可以尝试将documentelement
更改为body
。在Opera中,<html>
事件上的mouseup
侦听器在文档内部开始"拖动"时检测到文档外部的mouseup
事件——我不知道这是否是标准行为。
window.addEventListener('mouseup', function(event){
// do logic here
})
它可以在浏览器之外释放鼠标
document.onmouseup即使在视口之外也会被抛出,很高兴知道您只能通过绑定到文档对象来获得。在此处测试:http://jsfiddle.net/G5Xr2/
$(document).mouseup(function(e){
alert("UP" + e.pageX);
});
它甚至会接收鼠标的位置!
添加一个捕获mouseUp
事件的更高级别的事件处理程序(可能添加到主体),并将mouseIsDown
设置为false
。
下面是一个演示:http://jsfiddle.net/ZFefV/
在JavaScript中,它将是以下内容:
myElement.addEventListener('mousedown', () => {
const handleMouseUp = (event) => {
// check whether outside the element with event.target and myElement
document.removeEventListener('mouseup', handleMouseUp);
};
document.addEventListener('mouseup', handleMouseUp);
})
我创建了一个变量,在mousedown
上存储目标元素的id字符串。在mouseup
事件中,我检查字符串是否为null。如果不是,我会使用字符串来获取元素,并在代码块中执行我想要的任何操作,然后将变量重置为null。
换句话说,步骤是:
1.)生成一个变量,将其设置为null。2.)在"mousedown"上,将id或类字符串保存到变量中。3.)在"mouseup"上,检查变量(为了安全起见)。如果它不是null。然后使用字符串获取元素并使用它执行某些操作。4.)然后将变量重置为null。
var thisTarget = null
// when I know they click in the right place, save the target.
// you may not need parent(). I was using a UI slider and needed it.
$(".section").mousedown( function(e) {
thisTarget = $(e.target.parent().attr('id');
console.log(thisTarget);
});
// anywhere on the page...
$(document).mouseup( function(e) {
// because I'll make it null after every mouseup event.
if (thisTarget !== null) {
console.log( $("#" + thisTarget) ); // returns element
// do something with it
thisTarget = null;
}
});
- JsFiddle上的鼠标事件不起作用
- 鼠标悬停事件影响列表中所有行中的按钮,而不仅仅是特定按钮
- node-webkit-从父窗口捕获iframe鼠标事件
- 如何在jquery中找到鼠标滚轮/触摸移动事件的走向
- 如何查明鼠标按下事件是否发生在滚动条上或元素中的其他任何位置
- 鼠标事件在OpenLaszlo应用程序中不起作用
- 为画布绘图添加鼠标事件
- 如何在元素中处理鼠标事件,但不能在其子元素上处理
- KineticJS鼠标事件问题
- 捕获鼠标关闭事件并在 Mozilla 中获取 clientX 和 clientY
- D3.js:如何在svg上移动鼠标时创建弹出事件
- 如果鼠标在元素上快速移动和关闭,则防止.hoop事件被垃圾邮件发送
- 如何在asp:linkButton上显示鼠标悬停事件上的图像
- GWT-允许鼠标事件在两个叠加画布之间传播
- 为什么不是't html<对象>元素响应鼠标事件
- 如何恢复Kinetic.js鼠标事件
- 鼠标事件's在CtrlKey不起作用的情况下单击
- 必须更改单击事件鼠标输入鼠标输出事件
- 当一个标记位于打开的infobox -事件鼠标悬停与infobox插件谷歌地图API v3
- 带有按钮的鼠标事件:鼠标悬停、onclick、静态