亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

語法熒光筆無法更新文本

語法熒光筆無法更新文本

臨摹微笑 2023-08-24 10:26:59
我正在嘗試使用 HTML 制作一個代碼編輯器:<!DOCTYPE html><html><head>    <meta charset='UTF-8'>    <meta http-equiv='X-UA-Compatible' content='IE=Edge'>    <meta name='viewport' content='width=device-width, initial-scale=1'>    <link rel='stylesheet' href='style.css'></head><body>    <pre id='editor'><code contenteditable='true'></code></pre>        <script type='module'>        import { highlight } from './highlighter.js';        import { Caret } from './caret.js';        (() =>        {            const editor = document.querySelector('#editor code');            const caret = new Caret(editor);            highlight(editor);            editor.addEventListener('input', e =>            {                highlight(editor);                e.preventDefault();            });            editor.addEventListener('keydown', e =>            {                const TAB   = 9;                const ENTER = 13;                switch (e.keyCode)                {                    // ...                }            });        })();    </script></body></html>熒光筆.js:import { Caret } from './caret.js';export function highlight(editor){    // ...    const NORM = '#E6E6FA';    // ...    const Highlighter = {        source: editor.innerText,        start: 0,        curr: 0,        // ...        fin()        {            return this.curr >= this.source.length;        },        advance()        {            return this.source[this.curr++];        },        // ...        scan()        {            let result = '';            this.start = this.curr;            if (this.fin())            {                return null;            }基本上,它獲取用戶代碼的文本內容,掃描它以生成帶有顏色數據的詞素,將這些詞素拆分為字符,并將其放入帶有顏色的 <span> 標簽中,然后將這些 <span> 附加到字符串中編輯器的innerHTML更新為,最后用戶的光標放回到正確的位置;這是根據輸入完成的。但有一個問題:如果用戶輸入速度太快,他們輸入的文本可能會加倍。我嘗試使用其他類型的事件偵聽器來解決此問題,并嘗試簡單地使用 setInterval,但效果并不好。
查看完整描述

1 回答

?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

從你所描述的情況來看


如果用戶輸入太快


并看到在元素highlight()的每次更改時都會調用計算量大的函數input


editor.addEventListener('input', e => {

? highlight(editor); // <--

? e.preventDefault();

});

我建議取消該調用以突出顯示。


嘗試這樣的事情:

// Vanilla debounce: https://gist.github.com/peduarte/7ee475dd0fae1940f857582ecbb9dc5f


function debounce(func, wait = 100) {

? let timeout;

? return function(...args) {

? ? clearTimeout(timeout);

? ? timeout = setTimeout(() => {

? ? ? func.apply(this, args);

? ? }, wait);

? };

}


// ...


// adjust delay to find a balance between responsiveness and performance

const delay = 500;?


const runHighlight = () => highlight(editor);

const debouncedHighlight = debounce(runHighlight, delay);


editor.addEventListener('input', e => {

? e.preventDefault();

? debouncedHighlight();

});


查看完整回答
反對 回復 2023-08-24
  • 1 回答
  • 0 關注
  • 248 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號