Я не могу перетащить элемент на холсте - PullRequest
0 голосов
/ 11 апреля 2020

Я не могу перетащить элемент на холст. Я использовал console.log внутри функции myDown, чтобы получить информацию о щелкающем узле, но он только захватывает информацию с последнего узла в дереве, даже если он не был нажат.

Что происходит ? Как я могу сделать элемент перетаскиваемым в этом случае?

Я новичок в JavaScript, и я пытаюсь реализовать это в проекте, поэтому, пожалуйста, если вы можете мне помочь, большое спасибо .

var maintree;
function initialize() {
    var canvas = document.getElementById("canvas"),
        context = canvas.getContext("2d"),
        tree = TREE.create("Front-End"),
        nodes = TREE.getNodeList(tree),
        currNode = tree,
        add_child_button = document.getElementById("add_child"),
        remove_node = document.getElementById("remove_node"),
        zoom_in = document.getElementById("zoom_in"),
        zoom_out = document.getElementById("zoom_out");
        
    var offsetX=canvas.offsetLeft;
    var offsetY=canvas.offsetTop;

    // drag related variables
    var dragok = false;
    var startX;
    var startY;

    canvas.addEventListener("click", function (event) {
        var x = event.pageX - canvas.offsetLeft,
            y = event.pageY - canvas.offsetTop;
        for (var i = 0; i < nodes.length; i++) {
            if (x > nodes[i].xPos && y > nodes[i].yPos && x < nodes[i].xPos + nodes[i].width && y < nodes[i].yPos + nodes[i].height) {
                currNode.selected(false);
                nodes[i].selected(true);
                currNode = nodes[i];
                TREE.clear(context);
                TREE.draw(context, tree);
                updatePage(currNode);
                break;
            }
        }

        // listen for mouse events
        canvas.onmousedown = myDown;
        canvas.onmouseup = myUp;

    }, false);


    canvas.addEventListener("mousemove", function (event) {
        var x = event.pageX - canvas.offsetLeft,
            y = event.pageY - canvas.offsetTop;
        for (var i = 0; i < nodes.length; i++) {
            if (x > nodes[i].xPos && y > nodes[i].yPos && x < nodes[i].xPos + nodes[i].width && y < nodes[i].yPos + nodes[i].height) {
                canvas.style.cursor = "pointer";
                break;
            }
            else {
                canvas.style.cursor = "auto";
            }
        }

        canvas.onmousemove = myMove;

    }, false);




// handle mousedown events
function myDown(e){

    // tell the browser we're handling this mouse event
    e.preventDefault();
    e.stopPropagation();

    // get the current mouse position
    var mx = parseInt(e.clientX-offsetX);
    var my = parseInt(e.clientY-offsetY);

    // test each rect to see if mouse is inside
    dragok=false;
    for(var i=0; i < nodes.length; i++){
        node = nodes[i];
        if(mx > node.x && mx < node.x + node.width && my > node.y && my < node.y + node.height){
            // if yes, set that nodes isDragging=true            
            dragok = true;
            node.isDragging = true;
        }
    }
    // save the current mouse position
    startX=mx;
    startY=my;
    console.log(node);
}

    // handle mouseup events
    function myUp(e){
        // tell the browser we're handling this mouse event
        e.preventDefault();
        e.stopPropagation();

        // clear all the dragging flags
        dragok = false;
        for(var i = 0; i < nodes.length; i++){
            nodes[i].isDragging = false;
        }
    }


// handle mouse moves
function myMove(e){
    // if we're dragging anything...
    if (dragok){

      // tell the browser we're handling this mouse event
      e.preventDefault();
      e.stopPropagation();

      // get the current mouse position
      var mx=parseInt(e.clientX-offsetX);
      var my=parseInt(e.clientY-offsetY);

      // calculate the distance the mouse has moved
      // since the last mousemove
      var dx=mx-startX;
      var dy=my-startY;

      // move each rect that isDragging 
      // by the distance the mouse has moved
      // since the last mousemove
      for(var i = 0; i < nodes.length; i++){
          node = nodes[i];
          if(node.isDragging){
              node.x+=dx;
              node.y+=dy;
          }
      }

      // reset the starting mouse position for the next mousemove
      startX=mx;
      startY=my;

    }
}


//Control
    add_child_button.addEventListener('click', function (event) {
        currNode.addChild(TREE.create("Child of " + currNode.text));
        TREE.clear(context);
        nodes = TREE.getNodeList(tree);
        TREE.draw(context, tree);
    }, false);

    remove_node.addEventListener('click', function (event) {
        TREE.destroy(currNode);
        TREE.clear(context);
        nodes = TREE.getNodeList(tree);
        TREE.draw(context, tree);
    }, false);

    zoom_in.addEventListener('click', function (event) {
        for (var i = 0; i < nodes.length; i++){
            nodes[i].width *= 1.05;
            nodes[i].height *= 1.05;
        }
        TREE.config.width *= 1.05;
        TREE.config.height *= 1.05;
        TREE.clear(context);
        TREE.draw(context, tree);
    }, false);

    zoom_out.addEventListener('click', function (event) {
        for (var i = 0; i < nodes.length; i++){
            nodes[i].width = nodes[i].width * 0.95;
            nodes[i].height = nodes[i].height * 0.95;
        }
        TREE.config.width *= 0.95;
        TREE.config.height *= 0.95;
        TREE.clear(context);
        TREE.draw(context, tree);
    }, false);
    context.canvas.width = document.getElementById("main").offsetWidth;
    context.canvas.height = document.getElementById("main").offsetHeight;
    populateDummyData(tree);
    nodes = TREE.getNodeList(tree);
    TREE.draw(context, tree);
    maintree = tree;
}
//end control


function updatePage(tree) {
    var info_panel = document.getElementById("information_panel");
    var header = document.getElementById("header");
    header.innerHTML = "Front-End Tree";
    var info_panel_html = "<ul>";
    info_panel_html += "<li>Name: " +tree.text +"</li>";
    info_panel_html += "</ul>";
    info_panel.innerHTML = info_panel_html;
}

function populateDummyData(tree) {
    tree.selected(true);
    updatePage(tree);
    tree.addChild(TREE.create("HTML")); //0
    tree.addChild(TREE.create("CSS")); //1
    tree.addChild(TREE.create("JavaScript")); //2

    //HTML
    tree.getChildAt(0).addChild(TREE.create("Tag")); //3
    tree.getChildAt(0).addChild(TREE.create("Attribute")); //4
    
    //CSS
    tree.getChildAt(1).addChild(TREE.create("Framework")); //5
    tree.getChildAt(1).addChild(TREE.create("Preprocessors")); //6

    //JavaScript
    tree.getChildAt(2).addChild(TREE.create("Library")); //7
    tree.getChildAt(2).addChild(TREE.create("Framework")); //8
    
    tree.getDescendent(7).addChild(TREE.create("Bootstrap")); //9
    tree.getDescendent(8).addChild(TREE.create("SASS")); //10
    tree.getDescendent(8).addChild(TREE.create("LESS")); //11
    tree.getDescendent(9).addChild(TREE.create("jQuery")); //12
    tree.getDescendent(9).addChild(TREE.create("Backbone")); //13
    tree.getDescendent(9).addChild(TREE.create("React")); //14
    tree.getDescendent(10).addChild(TREE.create("Angular")); //15
    tree.getDescendent(10).addChild(TREE.create("Vue")); //16
}
...