开始使用RxJs.无法找到解决这个问题的方法.我有一个可拖动的控件:
startDrag = rx.Observable.fromEvent(myElem,'mousedown')
Run Code Online (Sandbox Code Playgroud)
现在,因为控件太小mousemove而且mouseup事件应该在文档级别(否则它将不会停止拖动,除非光标正好在元素上)
endDrag = rx.Observable.fromEvent document,'mouseup'
position = startDrag.flatMap ->
rx.Observable.fromEvent document,'mousemove'
.map (x)-> x.clientX
.takeUntil endDrag
Run Code Online (Sandbox Code Playgroud)
现在,当我不再被拖动时,我如何"抓住"正确的时刻(mouseup).你看到订阅的问题endDrag?每次点击任何地方都会触发,而不仅仅是myElem
如何一次检查所有3个属性?它应该只采取那些完全发生在startDrag和之后的document.mouseupsposition
Upd:我的意思是问题不在于移动元素.那部分很容易 - 订阅position,更改元素的CSS.我的问题是 - 我需要检测时刻mouseup并知道被拖动的确切元素(页面上有多个元素).怎么做我不知道.
我已经调整了RxJS repo中提供的拖放示例,以满足您的需要.
mouseUp听着document.
目标元素被添加到返回select.
拖动动作在内部处理map并map返回mouseDown事件中目标的元素.
通话last后,takeUntil(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();Run Code Online (Sandbox Code Playgroud)
#dragTarget {
position: absolute;
width: 20px;
height: 20px;
background: #0f0;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.7/rx.all.min.js"></script>
<div id="dragTarget"></div>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4762 次 |
| 最近记录: |