HTML5拖放不起作用

时间:2014-09-10 11:07:44

标签: javascript jquery html5 css3 canvas

目前我正在研究html5拖放应用程序,但我在jsfidle网站上找到了这段代码。它工作正常,但当我在本地系统的webstroms编辑器中使用时,它无法正常工作。所以请告诉我我能做些什么以及如何解决这些问题。

 <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <script src="http://code.jquery.com/jquery-1.9.1.js" type="text/javascript"></script>
        <script src="https://code.jquery.com/ui/1.9.2/jquery-ui.js" type="text/javascript"></script>
    <script type="text/javascript">
        // get reference to the canvas and its context
        var canvas = document.getElementById("canvas");
        var ctx = canvas.getContext("2d");
        ctx.font = "16px helvetica";

        // variables

        // some text objects defining text on the canvas
        var texts = [];

        // variables used to get mouse position on the canvas
        var $canvas = $("#canvas");
        var canvasOffset = $canvas.offset();
        var offsetX = canvasOffset.left;
        var offsetY = canvasOffset.top;
        var scrollX = $canvas.scrollLeft();
        var scrollY = $canvas.scrollTop();

        // variables to save last mouse position
        // used to see how far the user dragged the mouse
        // and then move the text by that distance
        var startX;
        var startY;

        // this var will hold the index of the selected text
        var selectedText = -1;


        // make the <li> draggable
        $("ul li").draggable({
            helper: 'clone'
        });

        // drop on canvas
        $("#canvas").droppable({
            accept: "ul li",
            drop: function (event, ui) {
                ctx.fillText($(ui.draggable).clone().text(), ui.position.left - event.target.offsetLeft, ui.position.top - event.target.offsetTop);

                var text = $(ui.draggable).clone().text();
                var x = ui.position.left - event.target.offsetLeft;
                var y = ui.position.top - event.target.offsetTop;
                var width = ctx.measureText(text).width;
                var height = 16;

                // save this text info in an object in texts[]
                texts.push({
                    text: text,
                    x: x,
                    y: y,
                    width: width,
                    height: height
                });

                // draw all texts to the canvas
                draw();

            }
        });

        // clear the canvas draw all texts
        function draw() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            for (var i = 0; i < texts.length; i++) {
                var text = texts[i];
                ctx.fillText(text.text, text.x, text.y);
            }
        }

        // test if x,y is inside the bounding box of texts[textIndex]
        function textHittest(x, y, textIndex) {
            var text = texts[textIndex];
            return (x >= text.x && x <= text.x + text.width && y >= text.y - text.height && y <= text.y);
        }

        // handle mousedown events
        // iterate through texts[] and see if the user
        // mousedown'ed on one of them
        // If yes, set the selectedText to the index of that text
        function handleMouseDown(e) {
            e.preventDefault();
            startX = parseInt(e.clientX - offsetX);
            startY = parseInt(e.clientY - offsetY);
            // Put your mousedown stuff here
            for (var i = 0; i < texts.length; i++) {
                if (textHittest(startX, startY, i)) {
                    selectedText = i;
                }
            }
        }

        // done dragging
        function handleMouseUp(e) {
            e.preventDefault();
            selectedText = -1;
        }

        // also done dragging
        function handleMouseOut(e) {
            e.preventDefault();
            selectedText = -1;
        }

        // handle mousemove events
        // calc how far the mouse has been dragged since
        // the last mousemove event and move the selected text
        // by that distance
        function handleMouseMove(e) {
            if (selectedText < 0) {
                return;
            }
            e.preventDefault();
            mouseX = parseInt(e.clientX - offsetX);
            mouseY = parseInt(e.clientY - offsetY);

            // Put your mousemove stuff here
            var dx = mouseX - startX;
            var dy = mouseY - startY;
            startX = mouseX;
            startY = mouseY;

            var text = texts[selectedText];
            text.x += dx;
            text.y += dy;
            draw();
        }

        // listen for mouse events
        $("#canvas").mousedown(function (e) {
            handleMouseDown(e);
        });
        $("#canvas").mousemove(function (e) {
            handleMouseMove(e);
        });
        $("#canvas").mouseup(function (e) {
            handleMouseUp(e);
        });
        $("#canvas").mouseout(function (e) {
            handleMouseOut(e);
        });
    </script>
        <style type="text/css">
            body {
                background-color: ivory;
            }
            #canvas {
                border:1px solid red;
            }
        </style>
    </head>
    <body>
    <ul id="drag">
        <li class="new-item">Drag me down1</li>
        <li class="new-item">Drag me down2</li>
        <li class="new-item">Drag me down3</li>
    </ul>
    <canvas id="canvas" width=300 height=300></canvas>
    </body>
    </html>

2 个答案:

答案 0 :(得分:1)

您的脚本在创建页面上的元素之前正在运行 - 您应该在加载时运行它。

你有jQuery,所以你可以用它来做到这一点。只需更改代码如下:

$(function() {
      // the javascript 
}

答案 1 :(得分:1)

您可以在正文中应用script。您可以使用此代码。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script src="http://code.jquery.com/jquery-1.9.1.js" type="text/javascript"></script>
    <script src="https://code.jquery.com/ui/1.9.2/jquery-ui.js" type="text/javascript"></script>

    <style type="text/css">
        body {
            background-color: ivory;
        }
        #canvas {
            border:1px solid red;
        }
    </style>
</head>
<body>
<ul id="drag">
    <li class="new-item">Drag me down1</li>
    <li class="new-item">Drag me down2</li>
    <li class="new-item">Drag me down3</li>
</ul>
<canvas id="canvas" width=300 height=300></canvas>
 <script type="text/javascript">
    // get reference to the canvas and its context
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    ctx.font = "16px helvetica";

    // variables

    // some text objects defining text on the canvas
    var texts = [];

    // variables used to get mouse position on the canvas
    var $canvas = $("#canvas");
    var canvasOffset = $canvas.offset();
    var offsetX = canvasOffset.left;
    var offsetY = canvasOffset.top;
    var scrollX = $canvas.scrollLeft();
    var scrollY = $canvas.scrollTop();

    // variables to save last mouse position
    // used to see how far the user dragged the mouse
    // and then move the text by that distance
    var startX;
    var startY;

    // this var will hold the index of the selected text
    var selectedText = -1;


    // make the <li> draggable
    $("ul li").draggable({
        helper: 'clone'
    });

    // drop on canvas
    $("#canvas").droppable({
        accept: "ul li",
        drop: function (event, ui) {
            ctx.fillText($(ui.draggable).clone().text(), ui.position.left - event.target.offsetLeft, ui.position.top - event.target.offsetTop);

            var text = $(ui.draggable).clone().text();
            var x = ui.position.left - event.target.offsetLeft;
            var y = ui.position.top - event.target.offsetTop;
            var width = ctx.measureText(text).width;
            var height = 16;

            // save this text info in an object in texts[]
            texts.push({
                text: text,
                x: x,
                y: y,
                width: width,
                height: height
            });

            // draw all texts to the canvas
            draw();

        }
    });

    // clear the canvas draw all texts
    function draw() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        for (var i = 0; i < texts.length; i++) {
            var text = texts[i];
            ctx.fillText(text.text, text.x, text.y);
        }
    }

    // test if x,y is inside the bounding box of texts[textIndex]
    function textHittest(x, y, textIndex) {
        var text = texts[textIndex];
        return (x >= text.x && x <= text.x + text.width && y >= text.y - text.height && y <= text.y);
    }

    // handle mousedown events
    // iterate through texts[] and see if the user
    // mousedown'ed on one of them
    // If yes, set the selectedText to the index of that text
    function handleMouseDown(e) {
        e.preventDefault();
        startX = parseInt(e.clientX - offsetX);
        startY = parseInt(e.clientY - offsetY);
        // Put your mousedown stuff here
        for (var i = 0; i < texts.length; i++) {
            if (textHittest(startX, startY, i)) {
                selectedText = i;
            }
        }
    }

    // done dragging
    function handleMouseUp(e) {
        e.preventDefault();
        selectedText = -1;
    }

    // also done dragging
    function handleMouseOut(e) {
        e.preventDefault();
        selectedText = -1;
    }

    // handle mousemove events
    // calc how far the mouse has been dragged since
    // the last mousemove event and move the selected text
    // by that distance
    function handleMouseMove(e) {
        if (selectedText < 0) {
            return;
        }
        e.preventDefault();
        mouseX = parseInt(e.clientX - offsetX);
        mouseY = parseInt(e.clientY - offsetY);

        // Put your mousemove stuff here
        var dx = mouseX - startX;
        var dy = mouseY - startY;
        startX = mouseX;
        startY = mouseY;

        var text = texts[selectedText];
        text.x += dx;
        text.y += dy;
        draw();
    }

    // listen for mouse events
    $("#canvas").mousedown(function (e) {
        handleMouseDown(e);
    });
    $("#canvas").mousemove(function (e) {
        handleMouseMove(e);
    });
    $("#canvas").mouseup(function (e) {
        handleMouseUp(e);
    });
    $("#canvas").mouseout(function (e) {
        handleMouseOut(e);
    });
</script>
</body>
</html>
相关问题