前端-鼠标滑动实现高亮与复制 - V2EX const topicId = 628568; var Once= "53513"; document.addEventListener("DOMContentLoaded", () => { protectTraffic(); if (typeof reloadTopicTips !== 'undefined') { window.reloadTopicTips = reloadTopicTips; } const observer = new IntersectionObserver( ([e]) => e.target.toggleAttribute('stuck', e.intersectionRatio < 1), {threshold: [1]} ); observer.observe(document.getElementById('reply-box')); hljs.initHighlightingOnLoad(); $('#Main').on('click', '.no, .ago', function () { location.hash = $(this).parents('.cell').prop('id'); }); // refresh once document.addEventListener('visibilitychange', e => { if (document.visibilityState === 'visible') { fetchOnce().then(Once=> { $('#once').val(once); }); } }); if (location.search.indexOf('p=') > -1) { const p = Number(location.search.split('p=')[1].split('&')[0]); if (p) { const key = 'tp628568'; if (lscache.set(key, p, 60 * 24 * 30)) { // 30 days console.log(`Saved topic page number to ${key}: ` + p); } } } });
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Oilybear

前端-鼠标滑动实现高亮与复制

  •  
  •   Oilybear Dec 13, 2019 via iPhone 3299 views
    This topic created in 2330 days ago, the information mentioned may be changed or developed.

    大家好,最近的项目需求中,有一项前端需求困扰着弟弟。

    项目背景:

    前端 React 框架

    需求如下:

    1. 鼠标滑动选中一段文字,实现对选中文字的高亮,并复制文字

    问题:

    1. 是否有现成的控件可以支持这一需求
    2. 如果需要自己手写控件,可以通过什么样的实现思路去实现 不知道各位朋友有什么高招
    Supplement 1    Dec 13, 2019

    谢谢各位大家,刚刚review问题发现我在需求表达出现了问题。复制>获取文字的位置。 Eg. hello hello比如选中第一个hello期望得到一个[0, 4]的array,选中第二个则为期望为[5, 10]这样一个array

    11 replies    2019-12-13 10:45:44 +08:00
    findsomeone
        1
    findsomeone  
       Dec 13, 2019 via Android
    我觉得应该不会很难? 比如现在各种 chrome 翻译插件都有划词翻译 而且一般也开源 参考下监控事件?
    orzorzorzorz
        2
    orzorzorzorz  
       Dec 13, 2019
    复制的话,简单粗暴就是 document.execCommand('copy')。链接在[这里]( https://stackoverflow.com/questions/6300213/copy-selected-text-to-the-clipboard-without-using-flash-must-be-cross-browser)
    改高亮的话有两种思路,一种是直接改 ::selection,一种是去掉 ::selection 的默认样式,想办法获得选中时的字,然后改这些字所在 dom 的样式。
    orzorzorzorz
        3
    orzorzorzorz  
       Dec 13, 2019
    这跟 re 不 react 没啥关系,市面上我是没见过有这样的组件的。
    RV0n
        4
    RV0n  
       Dec 13, 2019
    window.getSelection()获取选中文字 再走正则匹配 匹配文字显示高亮 再利用 clipboard 实现复制
    orzorzorzorz
        5
    orzorzorzorz  
       Dec 13, 2019
    https://github.com/bvaughn/react-highlight-words
    查了下,是有个相关的库,看上去能用。
    Oilybear
        6
    Oilybear  
    OP
       Dec 13, 2019 via iPhone
    @orzorzorzorz 谢谢大佬,刚刚我在需求表述上出现了问题,复制文字如果变化为获取文字相对一段文字的位置的话。不知有什么好的思路实现。例子已添加到附言中。
    Oilybear
        7
    Oilybear  
    OP
       Dec 13, 2019 via iPhone
    @findsomeone 好的,我去参考一下
    learnshare
        8
    learnshare  
       Dec 13, 2019
    MDN: selection & range
    Cbdy
        9
    Cbdy  
       Dec 13, 2019 via Android
    浏览器给你提供了 onSelect 事件
    netnr
        10
    netnr  
       Dec 13, 2019
    https://www.netnr.com/run/code/5068762375722166316

    写了个 单节点 选中高亮的 demo,跨节点需要更复杂的逻辑判断,已拿到选中内容如何复制应该不成问题了
    oubenruing
        11
    oubenruing  
       Dec 13, 2019
    About     Help     Advertise     Blog     API     FAQ     Solana     1403 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 16:52 PVG 00:52 LAX 09:52 JFK 12:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86