RxJs: Drag and Drop example : add mousedragstart

前端 未结 3 1045
梦毁少年i
梦毁少年i 2020-12-21 08:51

How to implement a mousedragstart Observable using the Drag and Drop RxJs\'s example.

mousedragstart should be emit before the first

3条回答
  •  无人及你
    2020-12-21 09:36

    An alternative solution for drag and drop:

    let dragDiv = document.getElementById('drag');
    let mouseisdown = false;
    let startPos;
    
    Observable.fromEvent(dragDiv, "mousedown").subscribe((e) => {
        mouseisdown = true;
        startPos = { x: e.offsetX, y: e.offsetY}
    });
    Observable.fromEvent(document, "mouseup").subscribe(e => mouseisdown = false); 
    
    
    Observable
        .fromEvent(document, "mousemove")
        .filter(e => mouseisdown)
        .map((e) => {
            return   {
              left: e.clientX - startPos.x,
              top: e.clientY - startPos.y
            }
        })
        .subscribe( p => {
        dragDiv.style.top = p.top + "px";
        dragDiv.style.left = p.left + "px";
    });
    

    The typescript version:

    let dragDiv = document.getElementById('drag');
    let mouseisdown = false;
    let startPos;
    
    Observable.fromEvent(dragDiv, "mousedown").subscribe((e:MouseEvent) => {
        mouseisdown = true;
        startPos = { x: e.offsetX, y: e.offsetY}
    });
    Observable.fromEvent(document, "mouseup").subscribe(e => mouseisdown = false); 
    
    
    Observable
        .fromEvent(document, "mousemove")
        .filter(e => mouseisdown)
        .map((e:MouseEvent) => {
            return   {
              left: e.clientX - startPos.x,
              top: e.clientY - startPos.y
            }
        })
        .subscribe( p => {
        dragDiv.style.top = p.top + "px";
        dragDiv.style.left = p.left + "px";
    });
    

提交回复
热议问题