问题描述
我想弄清楚,如何在 contentEditable 元素中使用插入符号。 首先,我想要插入符号索引位置。 其次,我想将我的内容分成 3 个:选择、选择前和选择后。
我已经制作了这段代码,它可以工作:) ...但我不确定我没有让它变得比必要的更复杂。我确实不为我使用的所有“useRef”感到自豪。
如果您认为我可以改进代码,请给我留言。
import { useState,useRef } from "react";
const Test = () => {
const inputRef = useRef(null),beforeRef = useRef(null),currentRef = useRef(null),afterRef = useRef(null);
const [state] = useState(
"Lorem <strong>ipsum dolor</strong> sit amet,<em>consectetur adipiscing</em> elit,<u>sed do</u> eiusmod..."
);
const [caret,setCaret] = useState(null);
const updateinformation = () => {
beforeRef.current.innerHTML = "";
currentRef.current.innerHTML = "";
afterRef.current.innerHTML = "";
const range = window.getSelection().getRangeAt(0);
let tempRange = document.createrange();
currentRef.current.appendChild(range.cloneContents());
tempRange.setStartBefore(inputRef.current.firstChild);
tempRange.setEnd(range.startContainer,range.startOffset);
beforeRef.current.appendChild(tempRange.cloneContents());
tempRange.setStart(range.endContainer,range.endOffset);
tempRange.setEndAfter(inputRef.current.lastChild);
afterRef.current.appendChild(tempRange.cloneContents());
tempRange = range.cloneRange();
tempRange.selectNodeContents(inputRef.current);
tempRange.setEnd(range.endContainer,range.endOffset);
setCaret(tempRange.toString().length);
};
return (
<div>
<div
className='column is-full p-3 has-background-light'
ref={inputRef}
contentEditable={true}
suppressContentEditableWarning={true}
spellCheck={false}
dangerouslySetInnerHTML={{ __html: state }}
onKeyUp={updateinformation}
onmouseup={updateinformation}
onBlur={updateinformation}
/>
<div className='tag m-2'>caret: {caret}</div>
<div className='columns is-not-hidden'>
<div className='column is-one-third' ref={beforeRef}></div>
<div className='column is-one-third' ref={currentRef}></div>
<div className='column is-one-third' ref={afterRef}></div>
</div>
</div>
);
};
export default Test;
顺便说一句,css 是布尔玛。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)