function codeHandle(e) {
            const $selectionElem = editor.selection.getSelectionContainerElem()
            if (!$selectionElem) {
                return
            }
            const $parentElem = $selectionElem.parent()
            const selectionNodeName = $selectionElem.getNodeName()
            const parentNodeName = $parentElem.getNodeName()

            if (selectionNodeName !== 'CODE' || parentNodeName !== 'PRE') {
                // 不符合要求 忽略
                return
            }

            if (!editor.cmd.queryCommandSupported('insertHTML')) {
                // 必须原生支持 insertHTML 命令
                return
            }

            // 处理：光标定位到代码末尾，联系点击两次回车，即跳出代码块
            if (editor._willBreakCode === true) {
                // 此时可以跳出代码块
                // 插入 <p> ，并将选取定位到 <p>
                const $p = $('<p><br></p>')
                $p.insertAfter($parentElem)
                editor.selection.createRangeByElem($p, true)
                editor.selection.restoreSelection()

                // 修改状态
                editor._willBreakCode = false

                e.preventDefault()
                return
            }

            const _startOffset = editor.selection.getRange().startOffset

            // 处理：回车时，不能插入 <br> 而是插入 \n ，因为是在 pre 标签里面
            editor.cmd.do('insertHTML', '\n')
            editor.selection.saveRange()
            if (editor.selection.getRange().startOffset === _startOffset) {
                // 没起作用，再来一遍
                editor.cmd.do('insertHTML', '\n')
            }

            const codeLength = $selectionElem.html().length
            if (editor.selection.getRange().startOffset + 1 === codeLength) {
                // 说明光标在代码最后的位置，执行了回车操作
                // 记录下来，以便下次回车时候跳出 code
                editor._willBreakCode = true
            }

            // 阻止默认行为
            e.preventDefault()
        }
function codeHandle(e) {
            const $selectionElem = editor.selection.getSelectionContainerElem()
            if (!$selectionElem) {
                return
            }
            const $parentElem = $selectionElem.parent()
            const selectionNodeName = $selectionElem.getNodeName()
            const parentNodeName = $parentElem.getNodeName()

            if (selectionNodeName !== 'CODE' || parentNodeName !== 'PRE') {
                // 不符合要求 忽略
                return
            }

            if (!editor.cmd.queryCommandSupported('insertHTML')) {
                // 必须原生支持 insertHTML 命令
                return
            }

            // 处理：光标定位到代码末尾，联系点击两次回车，即跳出代码块
            if (editor._willBreakCode === true) {
                // 此时可以跳出代码块
                // 插入 <p> ，并将选取定位到 <p>
                const $p = $('<p><br></p>')
                $p.insertAfter($parentElem)
                editor.selection.createRangeByElem($p, true)
                editor.selection.restoreSelection()

                // 修改状态
                editor._willBreakCode = false

                e.preventDefault()
                return
            }

            const _startOffset = editor.selection.getRange().startOffset

            // 处理：回车时，不能插入 <br> 而是插入 \n ，因为是在 pre 标签里面
            editor.cmd.do('insertHTML', '\n')
            editor.selection.saveRange()
            if (editor.selection.getRange().startOffset === _startOffset) {
                // 没起作用，再来一遍
                editor.cmd.do('insertHTML', '\n')
            }

            const codeLength = $selectionElem.html().length
            if (editor.selection.getRange().startOffset + 1 === codeLength) {
                // 说明光标在代码最后的位置，执行了回车操作
                // 记录下来，以便下次回车时候跳出 code
                editor._willBreakCode = true
            }

            // 阻止默认行为
            e.preventDefault()
        }
function codeHandle ( e ) { const $selectionElem = editor . selection . getSelectionContainerElem ( ) if ( ! $selectionElem ) { return } const $parentElem = $selectionElem . parent ( ) const selectionNodeName = $selectionElem . getNodeName ( ) const parentNodeName = $parentElem . getNodeName ( ) if ( selectionNodeName !== 'CODE' || parentNodeName !== 'PRE' ) { // 不符合要求 忽略 return } if ( ! editor . cmd . queryCommandSupported ( 'insertHTML' ) ) { // 必须原生支持 insertHTML 命令 return } // 处理：光标定位到代码末尾，联系点击两次回车，即跳出代码块 if ( editor . _willBreakCode === true ) { // 此时可以跳出代码块 // 插入 <p> ，并将选取定位到 <p> const $p = $ ( '<p><br></p>' ) $p . insertAfter ( $parentElem ) editor . selection . createRangeByElem ( $p , true ) editor . selection . restoreSelection ( ) // 修改状态 editor . _willBreakCode = false e . preventDefault ( ) return } const _startOffset = editor . selection . getRange ( ) . startOffset // 处理：回车时，不能插入 <br> 而是插入 \n ，因为是在 pre 标签里面 editor . cmd . do ( 'insertHTML' , '\n' ) editor . selection . saveRange ( ) if ( editor . selection . getRange ( ) . startOffset === _startOffset ) { // 没起作用，再来一遍 editor . cmd . do ( 'insertHTML' , '\n' ) } const codeLength = $selectionElem . html ( ) . length if ( editor . selection . getRange ( ) . startOffset + 1 === codeLength ) { // 说明光标在代码最后的位置，执行了回车操作 // 记录下来，以便下次回车时候跳出 code editor . _willBreakCode = true } // 阻止默认行为 e . preventDefault ( ) }
<pre><code></code></pre> 回车时 特殊处理
<pre > <code > < / code > < / pre > 回车时 特殊处理
Code handle