醉美水芙蓉 发表于 2026-5-20 20:49:45

马黑黑老师 textarea符号补全演示

</div>
<div class="codebox" data-prev="1">
&lt;style&gt;
    .wrap { margin: 30px auto; width: 800px; height: 460px; }
    #editor { width: 100%; height: 100%; box-sizing: border-box; padding: 10px; font-size: 1.5em; }
&lt;/style&gt;

&lt;div class="wrap"&gt;
    &lt;textarea id="editor" placeholder="输入小角括号引号等..."&gt;&lt;/textarea&gt;
&lt;/div&gt;

&lt;script&gt;
    // 自动补全成对符号函数
    function autoCompletePair(textarea, leftChar, rightChar) {
      const start = textarea.selectionStart;
      const end = textarea.selectionEnd;
      const oldValue = textarea.value;
      const selectedText = oldValue.substring(start, end);
      let newText, cursorPos;
      // 若有选中文本:包裹选中的内容
      if (selectedText.length &gt; 0) {
            newText = leftChar + selectedText + rightChar;
            cursorPos = start + leftChar.length + selectedText.length + rightChar.length;
            textarea.value = oldValue.slice(0, start) + newText + oldValue.slice(end);
            textarea.setSelectionRange(cursorPos, cursorPos);
      // 若无选中文本:插入成对符号,光标置于中间
      } else {
            newText = leftChar + rightChar;
            textarea.value = oldValue.slice(0, start) + newText + oldValue.slice(end);
            textarea.setSelectionRange(start + 1, start + 1);
      }
    }

    // 自动补全的成对符号设置(可以增补,但仅限于键盘符号)
    const pairs = {
      '(': ')',
      '[': ']',
      '{': '}',
      '&lt;': '&gt;',
      "'": "'",
      '"': '"',
      '`': '`',
    };

    // 编辑器 :按键按下
    editor.onkeydown = (e) =&gt; {
      if (pairs) {
            e.preventDefault(); // 阻止默认输入
            autoCompletePair(editor, e.key, pairs); // 调用自动补全函数
            return;
      }
    };
&lt;/script&gt;
</div>

<script>
   function loadLineNumFile() {
       const script = document.createElement('script');
       script.charset = 'utf-8';
       script.src = 'https://638183.freep.cn/638183/web/helight/linenumber-2026.js';
       script.defer = true;
       script.onload = () => addLineNumber();
       document.head.appendChild(script);
   }

   loadLineNumFile();
</script>

醉美水芙蓉 发表于 2026-5-20 20:51:06

核心:event.key<br />
<br />
textarea 文本框控件可以处理键盘按下、弹起、输入等事件,并通过 event.key 识别键位名称。键盘输入时(本例监听键位按下事件),当监听到符合 pairs 对象的键名时,自动补上其键值,就达成了符号补全的功能。自动补全函数还针对是否有文本被选中,两种情形插入自动补全符号时处理行为不同。</td></tr></table>

klxf 发表于 2026-5-21 20:41:43

新知识~谢谢精彩分享
页: [1]
查看完整版本: 马黑黑老师 textarea符号补全演示