花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 18|回复: 3

textarea模拟高亮关键字

[复制链接]
  • TA的每日心情
    奋斗
    2026-7-6 20:55
  • 签到天数: 1864 天

    [LV.Master]伴坛终老

    3268

    主题

    13万

    回帖

    29万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2026-7-6 20:57 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    <style>
        .tMid { text-align: center; }
        .hlight { background: tan; }
        /* 编辑区域容器 */
        .wrap {
            width: 600px;
            height: 460px;
            box-sizing: border-box;
            padding: 0;
            margin: 20px auto 0;
            position: relative;
        }
        /* 编辑区域内 pre 和 textarea 核心属性 */
        .edCommon {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            font: normal 18px/24px Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
            background: none;
            white-space: pre-wrap;
            word-break: break-all;
            box-sizing: border-box;
            overflow: auto;
            border: 1px solid gray;
            outline: none;
            resize: none;
            padding: 12px;
            margin: 0;
            transition: 1s;
        }
        /* pre 初始状态 */
        #pre { color: blue; transform: translate(-50%, 0); }
        /* textarea 初始状态 */
        #ta { color: black; transform: translate(50%, 0); }
    </style>
    
    <h2 class="tMid">textarea模拟高亮关键字</h2>
    <p class="tMid">检验方法:在文本框输入任何文字后选择任意文字,匹配选择文字的字符将以背景高亮的形式呈现。编辑区内两个元素合并、分离状态下均可操作。</p>
    <!-- 编辑区 :pre 在前 textarea 在后 -->
    <div class="wrap">
        <pre id="pre" class="edCommon">pre</pre>
        <textarea id="ta" class="edCommon" placeholder="请输入 ..."></textarea>
    </div>
    <p class="tMid"><button onclick="separateElms(this)">合并</button></p>
    
    <script>
        let keyword = ''; // 查找关键词
    
        // 辅助演示 :两个元素的 分离/叠加
        function separateElms(btn) {
            if (btn.textContent === '分离') {
                ta.style.transform = 'translate(50%, 0)';
                pre.style.transform = 'translate(-50%, 0)';
                pre.style.color = 'blue';
            } else {
                ta.style.transform = 'translate(0, 0)';
                pre.style.transform = 'translate(0, 0)';
                pre.style.color = 'transparent';
            }
            btn.textContent = btn.textContent === '分离' ? '合并' : '分离';
        }
        
        function syncScroll(e) {
            const targetElm = e.target === pre ? ta : pre;
            targetElm.scrollTop = e.target.scrollTop;
            targetElm.scrollLeft = e.target.scrollLeft;
        }
        
        // 核心函数 :高亮关键词函数
        function hlight() {
            if (!ta.value) {
                pre.innerHTML = '';
                return;
            }
            // 处理 textarea 内容(转义尖括号)
            let code = ta.value.replaceAll('<', '&lt;').replaceAll('>', '&gt;');
            // 若查找关键词存在高亮所有匹配的关键词
            if (keyword) code = code.replaceAll(
                keyword, 
                `<span class="hlight">${keyword}</span>`
            );
            pre.innerHTML = code; // 处理结果呈现在 pre 里
        }
        
        ta.oninput = () => hlight(); // textarea 输入时处理高亮关键字
            
        ta.onscroll = (e) => syncScroll(e); // 滚动同步
        
        pre.onscroll = (e) => syncScroll(e); // 滚动同步
        
        // 编辑框选择事件
        ta.onmouseup = () => {
            const start = ta.selectionStart;
            const end = ta.selectionEnd;
            if (start === end) return;
            keyword = ta.value.substring(start, end);
            if (keyword) hlight(); // 有关键词高亮显示
        };
    </script>
    

    评分

    参与人数 1威望 +50 金钱 +100 经验 +50 收起 理由
    红影 + 50 + 100 + 50 匠心独运,细节精致入微!

    查看全部评分

  • TA的每日心情
    奋斗
    2026-7-6 20:55
  • 签到天数: 1864 天

    [LV.Master]伴坛终老

    3268

    主题

    13万

    回帖

    29万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2026-7-6 21:02 | 显示全部楼层
    说明:

    (一)textarea 自身只支持一个全局背景色、一个全局文本色,它并不能高亮渲染所有匹配的查找关键词;

    (二)本例利用叠加技术将一个 pre 和 一个 textarea 放在一起(演示效果中的“合并状态)。pre 元素可以较好地和 textarea 元素共享核心 CSS 属性;

    (三)可能存在的问题:textarea 的 value 转到 pre 中,在 pre 中实现高亮关键词效果,必须使用 HTML 格式,这对绝大多数文本没问题,但如果 textarea 的文本是复杂的相关代码,因为转移问题可能会出现偏差,因此上例中简单的尖括号转义可能达不到要求。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1898

    主题

    33万

    回帖

    40万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2026-7-6 21:38 | 显示全部楼层
    复制了一段文字,这个能很好地找到相同的字,真方便啊
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-7-6 20:55
  • 签到天数: 1864 天

    [LV.Master]伴坛终老

    3268

    主题

    13万

    回帖

    29万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2026-7-6 21:48 | 显示全部楼层
    红影 发表于 2026-7-6 21:38
    复制了一段文字,这个能很好地找到相同的字,真方便啊

    这个演示对普通文本的匹配和高亮没问题,但对特殊文本的处理机制还远远不够,需要深入处理。

    但这个仅是简单演示,个人认为:限于篇幅和水平问题,就酱紫吧。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2026-7-7 01:10 , Processed in 0.376341 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表