首页 > 其他分享 >原生html+js实现两两元素配对,用线条连接两个元素

原生html+js实现两两元素配对,用线条连接两个元素

时间:2024-06-07 17:25:38浏览次数:14  
标签:checkbox logStr 元素 js lineCache length html var id

效果如下:

画线部分借鉴了“https://blogweb.cn/article/1403842582411”此链接文章作者的代码,感谢!
直接放出代码:

点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>配对</title>
    <script type="text/javascript" src="../../libs/easyui/jquery.min.js"></script>
    <script type="text/javascript" src="../../libs/easyui/jquery.easyui.min.js"></script>
</head>
<body class="easyui-layout">
<div title="帮助" data-options="iconCls:'icon-help',closable:true" style="padding:10px">
    <button id="remove-btn" style="margin-left: 100px;font-size: 20px" onclick="removeBtn()">撤销</button>
    <form id="checkbox-from0" style="float: left">
    </form>
    <form id="checkbox-from1" style="float: left;margin-left: 100px">
    </form>
    <input id="logText" class="easyui-textbox" data-options="multiline:true"
           value="This TextBox will allow the user to enter multiple lines of text."
           style="width:300px;height:500px;float: left">
</div>

<script>
    var webAppName = "/" + window.location.pathname.split("/")[1];
    var lineCache = [];
    var index0_id = null;
    var index1_id = null;
    var logText;
    var logStr = "";
    var colorArray = ['red','green','orange','blue','purple','pink','brown'];
    var colorIndex = 0;

    initTextBox();
    initData();

    function initTextBox() {
        logText = $('#logText').textbox();
        logText.textbox('setValue', logStr);
        logStrAppend('已配对记录:');
    }

    function initData() {
        var checkDataItem0 = [];
        var checkDataItem1 = [];
        for (let i = 0; i < 10; i++) {
            var item0 = {};
            item0['label'] = 'item' + i;
            item0['value'] = 'item' + i;
            item0['checked'] = false;
            checkDataItem0.push(item0);

            var item1 = {};
            item1['label'] = 'item' + (9 - i);
            item1['value'] = 'item' + (9 - i);
            item1['checked'] = false;
            checkDataItem1.push(item1);
        }
        var checkboxFrom0 = $('#checkbox-from0');
        for (let i = 0; i < checkDataItem0.length; i++) {
            var item = checkDataItem0[i];
            var checkboxId = 'checkbox-0-' + i;
            var checkboxItem0 = $('<h2 id="' + checkboxId + '" style="text-align: center;padding:5px;border: 2px solid #b2b2b2">'+item.label+'</h2></br></br>');
            checkboxFrom0.append(checkboxItem0);

            var checkboxView = document.getElementById(checkboxId);
            checkboxView.onclick = function () {
                if (updateObjId('checkbox-0-' + i)){
                    index0_id = 'checkbox-0-' + i;
                }
                if (index0_id != null && index1_id != null){
                    drawLine(index0_id,index1_id);
                }
            }
        }
        var checkboxFrom1 = $('#checkbox-from1');
        for (let i = 0; i < checkDataItem1.length; i++) {
            item = checkDataItem1[i];
            checkboxId = 'checkbox-1-' + i;
            var checkboxItem1 = $('<h2 id="' + checkboxId + '" style="text-align: center;padding:5px;border: 2px solid #b2b2b2">'+item.label+'</h2></br></br>');
            checkboxFrom1.append(checkboxItem1);

            checkboxView = document.getElementById(checkboxId);
            checkboxView.onclick = function () {
                if (updateObjId('checkbox-1-' + i)){
                    index1_id = 'checkbox-1-' + i;
                }
                if (index0_id != null && index1_id != null){
                    drawLine(index0_id,index1_id);
                }
            }
        }
        console.log("testSelector.html");
        drawLine('checkbox-0-1','checkbox-1-8');
    }

    function updateObjId(id){
        for (let i = 0; i < lineCache.length; i++) {
            var link0 = lineCache[i]['link0'];
            var link1 = lineCache[i]['link1'];
            if (id === link0 || id === link1){
                return false;
            }
        }
        return true;
    }

    function drawLine (id0, id1) {
        var obj1 = document.getElementById(id0);
        var obj2 = document.getElementById(id1);
        var color = colorArray[colorIndex];
        obj1.style.color = color;
        obj2.style.color = color;
        if (colorIndex < colorArray.length){
            colorIndex ++;
        }if (colorIndex >= colorArray.length){
            colorIndex = 0;
        }
        // 起点坐标
        var x1 = obj1.getBoundingClientRect().left + obj1.clientWidth / 2
        var y1 = obj1.getBoundingClientRect().top + obj1.clientHeight / 2

        // 终点坐标
        var x2 = obj2.getBoundingClientRect().left + obj2.clientWidth / 2
        var y2 = obj2.getBoundingClientRect().top + obj2.clientHeight / 2

        // 计算连接线长度
        var length = Math.sqrt((x2 -x1) * (x2 -x1) + (y2 -y1) * (y2 -y1))

        // 计算连接线旋转弧度值
        var rad = Math.atan2((y2 -y1), (x2 -x1))

        // 连接线未旋转前,起点坐标计算
        var top = (y1 + y2) / 2
        var left = (x1 + x2) / 2 - length / 2

        // 创建连接线 dom 节点,并设置样式
        var line = document.createElement('div')
        var style = 'position: absolute; background-color: '+color+'; height: 3px; top:' +
            top + 'px; left:' + left + 'px; width: ' + length + 'px; transform: rotate(' + rad + 'rad);'
        line.setAttribute('style', style)
        document.body.appendChild(line);

        var lineObj = {};
        lineObj['link0'] = id0;
        lineObj['link1'] = id1;
        lineObj['line'] = line;
        lineCache.push(lineObj);

        index0_id = null;
        index1_id = null;

        logStrAppend(obj1.innerText + "-----" + obj2.innerText);
    }

    function removeBtn() {
        let length = lineCache.length;
        if (length > 0){
            var link0 = lineCache[length - 1]['link0'];
            var link1 = lineCache[length - 1]['link1'];
            var line = lineCache[length - 1]['line'];
            document.body.removeChild(line);
            lineCache.splice(length - 1,1);
        }
    }

    function logStrAppend(str) {
        logStr += "\n" + str;
        let len = logStr.split('\n').length;
        if (len > 200) {
            let index = logStr.indexOf("\n", 2);
            logStr = logStr.substring(index, logStr.length);
        }
        logText.textbox('setValue', logStr);
    }
</script>
</body>
</html>

标签:checkbox,logStr,元素,js,lineCache,length,html,var,id
From: https://www.cnblogs.com/mtpmm-bky/p/18237551

相关文章

  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
    .netcore使用js,.netcore使用javascript,在.netcore项目中怎么使用javascript我项目里需要用到“文字编码”,为了保证前端和后端的编码解码不处bug,所以,我在项目中用了这个下面推荐之前在.netF4.0时的方法文章一:c#解码js的escape_c#escape-CSDN博客文章二:c#对js......
  • JS 逆向
    #-*-coding:utf-8-*-#字体文件处理网站:https://font.qqe2.com/index-en.html"""任务:先处理字体文件从他的请求当中获取到当前请求附带的字体文件爬虫每次运行,获取的数据都是最新的--获取最新的请求--获取最新的字体文件固定的请求参数会过期......
  • js
    特点不完善有很多默认遵守的规则语法注释://空*#单行注释/**/#多行注释书写位置1.<head><script>第一种位置</script></head><body>2.第二种位置body底部</body>3.直接写一个js脚本,引入<scriptsrc=''>第三种方式</script&......
  • web开发者必备:用nvm-windows优雅地使用多个版本的Node.js 附下载链接
    一、为什么要安装多个版本的node.js现在开发前端项目,有的需要node.js版本是18以上的,或者其他版本,然而电脑上安装的是v16,直接升级到18,又怕影响老项目,最好的办法就是安装多个版本,需要哪个切换一下就行。网上有一些安装多个版本node.js的做法,很麻烦。推荐nvm这个工具,很方便。nvm全......
  • vue+cesium+heatmap.js 实现热力图
    效果如下图:1.安装heatmap.jsnpmi heatmap.js官网:heatmap.js:DynamicHeatmapsfortheWeb(patrick-wied.at)2.把这两个文件放到项目里heatmap.jsimportutilfrom"./util"importh337from'heatmap.js'/***@description二维热力图类,基于h337类扩展*@......
  • 学习前端3DThreejs一篇就够了,从入门到实战
    vue安装three.jsnpminstall--savethree引入three.jsimport*asTHREEfrom'three'three.js结构### three.js坐标创建一个场景scene场景,camera相机,renderer渲染器创建一个场景this.scene=newTHREE.Scene()创建一个透视摄像机this.camera=newTHR......
  • HTML5+CSS3+JS小实例:网格图库
    实例:网格图库技术栈:HTML+CSS+JS效果:源码:【HTML】<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">......
  • 获取自定义 HTML 开头标记和结尾标记之间的文本
    $data="<Data>hello</Data>";preg_match_all("/\<Data\>[.]+\<\/Data\>/",$data,$match);print_r($match);返回:Array([0]=>Array())Array([0]=>Array())所以我猜没有匹配到?你是对的,你的正则表达式没有匹配......
  • html
    基本标签注释<!--注释标签--><!---->DOCTYPE<!--标签是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(DTD)来解析文档。--><!DOCTYPEhtml>html<!--html的代码都写在这个标签中,写在标签外是不会显......
  • 数组大扫雷行动:JavaScript中的高效移除指定元素
    数组大扫雷行动:JavaScript中的高效移除指定元素基本概念:移除元素,何为?方法一:splice()大法方法二:filter()轻功功能使用角度与技巧案例一:简单移除案例二:条件移除实战分析遇到的坑与对策结语与讨论在JavaScript编程的征途中,数组是我们的常伴,而“移除元素”这一任务,则像......