gpt4 book ai didi

javascript - 如何在 mousedown 元素之外捕获 mouseup 事件? (即为了正确的拖放?)

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:24:50 30 4
gpt4 key购买 nike

Javascript onmouseup event如果在触发 onmousedown 的元素外释放鼠标按钮,则不会触发。

这会导致 JQuery UI 中的拖放错误:A JQuery draggable当鼠标按钮在其容器外释放时,元素不会停止拖动(因为元素在到达其父边界时将停止移动)。重现步骤:

  • 转到 http://jqueryui.com/draggable/ .
  • 向下拖动 draggable 直到鼠标离开周围的容器
  • 释放鼠标按钮(此时没有按下鼠标按钮)
  • 将鼠标移回容器
  • 并且 draggable 仍在被拖动。我希望只要松开鼠标按钮,拖动就会停止 - 无论在何处松开。

我在最新的 Chrome 和 IE 中看到了这种行为。

有什么解决方法吗?

我知道我们可以在 mouseoutmouseleave 上停止拖动容器,但我想继续拖动,即使我在父容器之外,就像在 google maps (无论你在哪里释放鼠标,它总是停止拖动 map )。

最佳答案

您可以让 mousedown 元素“捕获”指针。然后它总是会收到 mouseup 事件。在 React 中,这可能看起来像这样:

const onPointerDownDiv1 = (event: React.PointerEvent) => {
(event.target as HTMLDivElement).setPointerCapture(event.pointerId);
// Do something ...
};

const onPointerUpDiv1 = (event: React.PointerEvent) => {
(event.target as HTMLDivElement).releasePointerCapture(event.pointerId);
// Do something ...
};
<div
ref={div1}
id="div1"
className="absolute top-[200px] left-[390px] h-8 w-8 bg-red-300"
onPointerDown={onPointerDownDiv1}
onPointerUp={onPointerUpDiv1}
/>

这是一个使用“普通”html + javascript 的实现:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<div
id="div1"
style="
position: absolute;
left: 50px;
top: 50px;
width: 20px;
height: 20px;
background-color: red;
"
></div>
</body>
<script>
let isDragging = false;
let offsetX = 0;
let offsetY = 0;
let divElement = document.getElementById("div1");

divElement.addEventListener("pointerdown", onPointerDown);
divElement.addEventListener("pointermove", onPointerMove);
divElement.addEventListener("pointerup", onPointerUp);

function onPointerDown(event) {
divElement.setPointerCapture(event.pointerId);
offsetX = event.clientX - divElement.offsetLeft;
offsetY = event.clientY - divElement.offsetTop;
isDragging = true;
}

function onPointerMove(event) {
if (isDragging) {
divElement.style.left = (event.clientX - offsetX).toString() + "px";
divElement.style.top = (event.clientY - offsetY).toString() + "px";
}
}

function onPointerUp(event) {
divElement.releasePointerCapture(event.pointerId);
isDragging = false;
}
</script>
</html>

关于javascript - 如何在 mousedown 元素之外捕获 mouseup 事件? (即为了正确的拖放?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21073863/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com