随鼠标左键点击出现连续svg折线

组态项目中,要实现随鼠标左键点击出现连续svg折线,点鼠标右键结束当前折现的绘制。

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>svg折线</title>
    <style>
        #svgCanvas {
            border: 1px solid #000;
        }
    </style>
</head>

<body>
 <svg id="svgCanvas" width="800" height="600">
    </svg>
    <script>
        const svg = document.getElementById("svgCanvas");
        let isDrawing = false;
        let pathString = ''; //绘制路径
        let currentPath;
        let newPath = "";//路径标签
        let isOver = false;//是否点击了右键完成当前绘制
        let strench_Path = ""; //辅助路径标签
        let strench_currentPath;

        svg.addEventListener("mousedown", function (event) {
            if (event.button === 2) {
                // 右键点击结束当前路径绘制
                if (currentPath) {
                    isOver = true; //右键的话当前路径完结
                }
                isDrawing = false;
                return;
            }

            isDrawing = true;
            const { offsetX, offsetY } = event;

            // 初始化添加标签或当前绘制完成添加下一个标签
            if (pathString === '' || isOver) {
                newPath = document.createElementNS("http://www.w3.org/2000/svg", "polyline");
                isOver = false;
                pathString = "";

            }

            pathString += `${offsetX},${offsetY} `;
            newPath.setAttribute("points", pathString);
            newPath.setAttribute("stroke", "black");
            newPath.setAttribute("fill", "none");
            currentPath = newPath;
            svg.appendChild(newPath);

           // 获取需要移除的元素
            var element = document.getElementById("assistPath");
            console.log("ele", element);
            if (element) {
                element.parentNode.removeChild(element);
            }
            // 创建辅助路径标签
            strench_Path = document.createElementNS("http://www.w3.org/2000/svg", "line");

            strench_Path.setAttribute("x1", offsetX);
            strench_Path.setAttribute("y1", offsetY);
            strench_Path.setAttribute("x2", offsetX);
            strench_Path.setAttribute("y2", offsetY);

            strench_Path.setAttribute("stroke", "#ffb27c");
            strench_Path.setAttribute("fill", "none");
            strench_Path.setAttribute("id", "assistPath");
            strench_currentPath = strench_Path;
            svg.appendChild(strench_Path);

        });

        svg.addEventListener("mousemove", function (event) {
            if (!isDrawing) return;

            if (strench_currentPath) {
                const { offsetX, offsetY } = event;

               strench_Path.setAttribute("x2", offsetX);
                strench_Path.setAttribute("y2", offsetY);
            }
        });

        svg.addEventListener("contextmenu", function (event) {
            event.preventDefault();
            // 右键点击后删除辅助标签
            var element = document.getElementById("assistPath"); // 获取需要移除的元素
            if (element) {
                element.parentNode.removeChild(element);
            }

            // 如果只有一对坐标点时,清除对应的路径标签
            if (pathString.trim().split(" ").length === 1) {
                if (newPath) {
                    svg.removeChild(newPath);
                }
                pathString = "";
                return;
            }
        });

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值