iou3344 2021-09-07 21:11 采纳率: 85.2%
浏览 195
已结题

如何点击选中表格中用空格分开的内容(不要选中空格)

注意,翻页时也要起作用哈。(不要选中空格)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>简约表格插件</title>
    <script src="https://www.jq22.com/jquery/jquery-1.10.2.js"></script>
    <script src="https://www.jq22.com/demo/jquerytablePlugin201901132312/js/tableXR.js"></script>
    <style>
        #root{word-spacing:0.5em}
    </style>
</head>
<body>
    <div id="root" style="width: 800px"></div>
    <script type="text/javascript">
        $('#root').tableXR({
            //表格标题
            title:'学生成绩列表',
            //表格头部设置
            columns:[
                {data:'name',title:'名字'},
                {data:'age',title:'年龄'},
                {data:'store',title:'得分'},
                {data:'level',title:'特点'},
            ],
            //表格数据:
            data:[
                {name:'小红',age:'18',store:'98',level:'爱思考 爱劳动 不爱吃饭 不爱打游戏'},
                {name:'小化',age:'18',store:'97',level:'爱吃好吃的 不爱学习 聪明 不爱劳动'},
                {name:'小杰',age:'15',store:'95',level:'喜欢逗人笑 捣蛋鬼 爱讲段子 鬼马'},
                {name:'小刚',age:'17',store:'95',level:'无厘头 有创造力 爱发明奇奇怪怪的东西'},
                {name:'大水',age:'23',store:'97',level:'爱思考 爱劳动 不爱吃饭 不爱打游'},
                {name:'小胡',age:'22',store:'88',level:'爱吃好吃的 不爱学习 聪明 不爱劳'},
                {name:'热热',age:'19',store:'90',level:'喜欢逗人笑 捣蛋鬼 爱讲段子 鬼马'},
                {name:'二娃',age:'17',store:'92',level:'无厘头 有创造力 爱发明奇奇怪怪的'},
                {name:'小瑟',age:'16',store:'89',level:'无厘头 有创造力 爱发明奇奇怪怪的东西'},
                {name:'滑板',age:'15',store:'91',level:'爱吃好吃的 不爱学习 聪明 不爱劳'},
                {name:'Ddd',age:'17',store:'95',level:'喜欢逗人笑 捣蛋鬼 爱讲段子 鬼马'},
                {name:'DSD',age:'17',store:'95',level:'无厘头 有创造力 爱发明奇奇怪怪的东西'},
                {name:'DSD',age:'17',store:'95',level:'喜欢逗人笑 捣蛋鬼 爱讲段子 鬼马'},
                {name:'DSD',age:'17',store:'95',level:'爱思考 爱劳动 不爱吃饭 不爱打游戏'},
            ]
        })
    </script>
</body>
</html>

注意,翻页时也要起作用哈。
PS:空格之所以比较宽,是因为设置了css(word-spacing:0.5em),所以,实际上真的是半角空格。

img


就是当你点击爱劳动附近时,就选中爱劳动三个字。如果同时可以复制爱劳动三个字,我就继续追加30元哈。

  • 写回答

6条回答 默认 最新

  • 峰子哥哥 2021-09-09 15:20
    关注
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>简约表格插件</title>
        <script src="https://www.jq22.com/jquery/jquery-1.10.2.js"></script>
        <script src="https://www.jq22.com/demo/jquerytablePlugin201901132312/js/tableXR.js"></script>
        <style>
            #root, #text, #textOne, #textEmpty {
                word-spacing: 0.5em
            }
    
            #text, #textOne, #textEmpty {
                display: none;
            }
    
        </style>
    </head>
    <body>
    <div id="root" style="width: 800px"></div>
    <span id="text"></span>
    <span id="textOne"></span>
    <span id="textEmpty">&nbsp;</span>
    <script type="text/javascript">
        $('#root').tableXR({
            //表格标题
            title: '学生成绩列表',
            //表格头部设置
            columns: [
                {data: 'name', title: '名字'},
                {data: 'age', title: '年龄'},
                {data: 'store', title: '得分'},
                {data: 'level', title: '特点'},
            ],
            //表格数据:
            data: [
                {name: '小红', age: '18', store: '98', level: '爱思考 爱劳动 不爱吃饭 不爱打游戏'},
                {name: '小化', age: '18', store: '97', level: '爱吃好吃的 不爱学习 聪明 不爱劳动'},
                {name: '小杰', age: '15', store: '95', level: '喜欢逗人笑 捣蛋鬼 爱讲段子 鬼马'},
                {name: '小刚', age: '17', store: '95', level: '无厘头 有创造力 爱发明奇奇怪怪的东西'},
                {name: '大水', age: '23', store: '97', level: '爱思考 爱劳动 不爱吃饭 不爱打游'},
                {name: '小胡', age: '22', store: '88', level: '爱吃好吃的 不爱学习 聪明 不爱劳'},
                {name: '热热', age: '19', store: '90', level: '喜欢逗人笑 捣蛋鬼 爱讲段子 鬼马'},
                {name: '二娃', age: '17', store: '92', level: '无厘头 有创造力 爱发明奇奇怪怪的'},
                {name: '小瑟', age: '16', store: '89', level: '无厘头 有创造力 爱发明奇奇怪怪的东西'},
                {name: '滑板', age: '15', store: '91', level: '爱吃好吃的 不爱学习 聪明 不爱劳'},
                {name: 'Ddd', age: '17', store: '95', level: '喜欢逗人笑 捣蛋鬼 爱讲段子 鬼马'},
                {name: 'DSD', age: '17', store: '95', level: '无厘头 有创造力 爱发明奇奇怪怪的东西'},
                {name: 'DSD', age: '17', store: '95', level: '喜欢逗人笑 捣蛋鬼 爱讲段子 鬼马'},
                {name: 'DSD', age: '17', store: '95', level: '爱思考 爱劳动 不爱吃饭 不爱打游戏'},
            ]
        })
        $("#root").on("dblclick", "td", function (e) {
            //双击时选中的文本
            let selectText = getSelectText();
    
            //td的文本
            let text = $(this).html();
            let textArray = text.split(" ");
    
            //选中的文本 可能所在的区域
            let selectArray = textArray.filter(item => {
                return item.indexOf(selectText) > -1;
            })
            if (selectArray.length === 0) {
                //选中的是空格 并未双击在文字上 清除选中后直接returnwindow.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
                return;
            }
            console.log(selectArray.length)
            //当只有一个时直接用
            if (selectArray.length === 1) {
                //选中的文本
                selectText = selectArray[0];
                let startIndex = text.indexOf(selectText);
                setSelectText(this.firstChild, startIndex, startIndex + selectText.length);
                return;
            }
    
            //点击td的位置
            let offsetX = e.offsetX;
    
            //放入一个div里 计算该文本在该样式下的宽度
            $("#text").html(text);
            $("#textOne").html(text.substr(0, 1));
            let textWidth = $("#text").width();
            //该td的宽度
            let width = $(this).width();
            //取的左边的距离,因为是居中,所以这里用总宽度减去文本宽度 再除以2
            let left = (width - textWidth) / 2;
            //点击文本的位置
            let textOffsetX = offsetX - left;
    
            //一个文字所占宽度
            let textOneWidth = $("#textOne").width();
            let textEmptyWidth = $("#textEmpty").width();
    
            //计算每段文字所在位置
            let array = [];
            for (let i = 0; i < textArray.length; i++) {
                let p = {
                    textOffsetStart: i === 0 ? 0 : array[i - 1].textOffsetEnd + textEmptyWidth,
                    textOffsetEnd: i === 0 ? textArray[i].length * textOneWidth :
                        textArray[i].length * textOneWidth + array[i - 1].textOffsetEnd + textEmptyWidth
                }
                array.push(p);
            }
            for (let i = 0; i < array.length; i++) {
                if (array[i].textOffsetStart <= textOffsetX && array[i].textOffsetEnd >= textOffsetX) {
                    //选中的文本
                    selectText = textArray[i];
                    let startIndex = text.indexOf(selectText);
                    setSelectText(this.firstChild, startIndex, startIndex + selectText.length);
                }
            }
        });
    
    
        function getSelectText() {
            let text = "";
            if (window.getSelection) {
                text = window.getSelection().toString();
            } else if (document.selection && document.selection.type !== "Control") {
                text = document.selection.createRange().text;
            }
            return text;
        }
    
        function setSelectText(node, startIndex, endIndex) {
            window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
            // window.find(text);
            if (document.body.createTextRange) {
                let range = document.body.createTextRange();
                range.setStart(node, startIndex);
                range.setEnd(node, endIndex);
            } else if (window.getSelection) {
                let selection = window.getSelection();
                let range = document.createRange();
                range.setStart(node, startIndex);
                range.setEnd(node, endIndex);
                selection.removeAllRanges();
                selection.addRange(range);
            }
            document.execCommand("Copy");
        }
    
    </script>
    </body>
    </html>
    

    主要采用两个解决方案
    1、先获取双击时自动选中的文本,然后判断该文本处于整段文本中什么位置,如果只出现在该文本中一次,则直接选中该段文本
    2、当自动选中的文本在整段文本中出现多次,则根据双击时的坐标计算出点击的位置的文本是什么,主要是根据计算整段文本宽度,单个文字宽度,空格宽度,最后按照规律算出。

    复制方法在setSelectText函数最下方。

    如果能帮到你,望【采纳】

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 9月17日
  • 已采纳回答 9月9日
  • 赞助了问题酬金 9月8日
  • 修改了问题 9月8日
  • 展开全部

悬赏问题

  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥20 java在应用程序里获取不到扬声器设备