gpt4 book ai didi

javascript - RxJs 如何处理文档事件

转载 作者:数据小太阳 更新时间:2023-10-29 06:01:34 27 4
gpt4 key购买 nike

开始使用 RxJs。找不到解决此问题的方法。我有一个可拖动的控件:

startDrag = rx.Observable.fromEvent(myElem,'mousedown')

现在,因为控件太小 mousemovemouseup 事件应该在文档级别(否则它不会停止拖动,除非光标正好在元素上)

endDrag = rx.Observable.fromEvent document,'mouseup'

position = startDrag.flatMap ->
rx.Observable.fromEvent document,'mousemove'
.map (x)-> x.clientX
.takeUntil endDrag

现在如何“捕捉”不再被拖动的正确时刻(mouseup)。您看到订阅 endDrag 的问题了吗?每次点击任何地方都会触发,而不仅仅是 myElem如何一次检查所有 3 个属性?它应该只采用恰好在 startDragposition

之后发生的那些 document.mouseups

Upd:我的意思是问题不在于移动元素。这部分很简单 - 订阅 position,更改元素的 css。我的问题是 - 我需要检测 mouseup 的时刻并知道被拖动的确切元素(页面上有多个元素)。我不知道该怎么做。

最佳答案

我已经改编了drag and drop example在 RxJS 存储库中提供,以按您的需要运行。

显着变化:

  • mouseUp 监听 document

  • 目标元素被添加到 select 的返回值中。

  • 拖动 Action 在 map 内部处理,map 返回在 mouseDown 事件中定位的元素。

  • 调用lasttakeUntil(mouseUp) 之后,所以 subscribe 只会在拖动过程结束时到达(每次拖动一次)。

工作示例:

function main() {
var dragTarget = document.getElementById('dragTarget');

// Get the three major events
var mouseup = Rx.Observable.fromEvent(document, 'mouseup');
var mousemove = Rx.Observable.fromEvent(document, 'mousemove');
var mousedown = Rx.Observable.fromEvent(dragTarget, 'mousedown');


var mousedrag = mousedown.selectMany(function(md) {

// calculate offsets when mouse down
var startX = md.offsetX;
var startY = md.offsetY;

// Calculate delta with mousemove until mouseup
return mousemove.select(function(mm) {
if (mm.preventDefault) mm.preventDefault();
else event.returnValue = false;

return {
// Include the targeted element
elem: mm.target,
pos: {
left: mm.clientX - startX,
top: mm.clientY - startY
}
};
})
.map(function(data) {
// Update position
dragTarget.style.top = data.pos.top + 'px';
dragTarget.style.left = data.pos.left + 'px';

// Just return the element
return data.elem;
})
.takeUntil(mouseup)
.last();
});


// Here we receive the element when the drag is finished
subscription = mousedrag.subscribe(function(elem) {
alert('Drag ended on #' + elem.id);
});
}
main();
#dragTarget {
position: absolute;
width: 20px;
height: 20px;
background: #0f0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.7/rx.all.min.js"></script>
<div id="dragTarget"></div>

关于javascript - RxJs 如何处理文档事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28477146/

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