Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用innerHTML更改焦点节点时如何重置选择焦点文本节点_Javascript_Html_Contenteditable - Fatal编程技术网

Javascript 使用innerHTML更改焦点节点时如何重置选择焦点文本节点

Javascript 使用innerHTML更改焦点节点时如何重置选择焦点文本节点,javascript,html,contenteditable,Javascript,Html,Contenteditable,我尝试使用use ContentEditable元素制作标记富文本编辑器,并希望使标记源代码具有某种风格,因此编写以下解析器: <body> <div class="editor-content" ContentEditable="true" onKeyUp="inputChanges"></div> </body> <script type="text/javascript"> let inputChanges = (

我尝试使用use ContentEditable元素制作标记富文本编辑器,并希望使标记源代码具有某种风格,因此编写以下解析器:

<body>
    <div class="editor-content" ContentEditable="true" onKeyUp="inputChanges"></div>
</body>
<script type="text/javascript">
    let inputChanges = (event) => {

        //old selection info
        let selection = window.getSelection();
        let oldRange = selection.anchorOffset;
        let oldContainer = selection.anchorNode;

        let markdown = event.target.innerTex;

        let parserArray = [...];
        for (const i of parserArray) {
            markdown = markdown.replace(i.EXP, i.todo);
        }

        event.target.innerHTML = markdown;

        // I tried below to make cursor back

        const range = document.createRange();
        range.selectNodeContents(oldContainer);
        range.setStart(oldContainer, oldRange);
        range.collapse(true);
        selection.removeAllRanges();
        selection.addRange(range);
    }
</script>

让inputChanges=(事件)=>{
//旧选择信息
让selection=window.getSelection();
设oldRange=selection.anchorOffset;
让oldContainer=selection.anchorNode;
让markdown=event.target.innerTex;
让parseraray=[…];
for(parserArray的常数i){
markdown=markdown.replace(i.EXP,i.todo);
}
event.target.innerHTML=markdown;
//我试图在下面使光标返回
常量范围=document.createRange();
范围。选择NodeContents(旧容器);
range.setStart(oldContainer,oldRange);
范围。塌陷(真);
selection.removeAllRanges();
选择。添加范围(范围);
}
键入时,光标将位于编辑器的第一个位置。 我试图修复,但它报告了一个错误: 文档中没有给定范围。

检查执行innerHTML之前和之后的选择:

我猜这是选择焦点节点的问题。如果是如何将焦点转移到文本节点

(文本节点是ContentEditable div的文本
[这里是文本节点]


我认为最好的答案是使用CodeMirror。嗯,我认为最好的答案是使用CodeMirror。