Search code examples
javascriptdrag-and-dropdraggabledrag

Simple drag and drop code


Im struggling with seemingly a simple javascript exercise, writing a vanilla drag and drop. I think Im making a mistake with my 'addeventlisteners', here is the code:

var ele = document.getElementsByClassName ("target")[0];
var stateMouseDown = false;
//ele.onmousedown = eleMouseDown;
ele.addEventListener ("onmousedown" , eleMouseDown , false);

function eleMouseDown () {
    stateMouseDown = true;
    document.addEventListener ("onmousemove" , eleMouseMove , false);
}

function eleMouseMove (ev) {
    do {
        var pX = ev.pageX;
        var pY = ev.pageY;
        ele.style.left = pX + "px";
        ele.style.top = pY + "px";
        document.addEventListener ("onmouseup" , eleMouseUp , false);
    } while (stateMouseDown === true);
}

function eleMouseUp () {
    stateMouseDown = false;
    document.removeEventListener ("onmousemove" , eleMouseMove , false);
    document.removeEventListener ("onmouseup" , eleMouseUp , false);
}

Solution

  • Here's a jsfiddle with it working: http://jsfiddle.net/fpb7j/1/

    There were 2 main issues, first being the use of onmousedown, onmousemove and onmouseup. I believe those are only to be used with attached events:

    document.body.attachEvent('onmousemove',drag);
    

    while mousedown, mousemove and mouseup are for event listeners:

    document.body.addEventListener('mousemove',drag);
    

    The second issue was the do-while loop in the move event function. That function's being called every time the mouse moves a pixel, so the loop isn't needed:

    var ele = document.getElementsByClassName ("target")[0];
    ele.addEventListener ("mousedown" , eleMouseDown , false);
    
    function eleMouseDown () {
        stateMouseDown = true;
        document.addEventListener ("mousemove" , eleMouseMove , false);
    }
    
    function eleMouseMove (ev) {
        var pX = ev.pageX;
        var pY = ev.pageY;
        ele.style.left = pX + "px";
        ele.style.top = pY + "px";
        document.addEventListener ("mouseup" , eleMouseUp , false);
    }
    
    function eleMouseUp () {
        document.removeEventListener ("mousemove" , eleMouseMove , false);
        document.removeEventListener ("mouseup" , eleMouseUp , false);
    }
    

    By the way, I had to make the target's position absolute for it to work.