You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何取消Grav内置CodeMirror编辑器的focus()聚焦

解决Grav内置CodeMirror编辑器抢占自定义WYSIWYG编辑器焦点问题

方案1:阻止点击事件冒泡,主动聚焦自定义编辑器

CodeMirror内部会监听容器的点击事件来自动聚焦,你可以给自定义编辑器添加点击事件,阻止事件冒泡到CodeMirror的父元素,同时主动让自定义编辑器获取焦点:

const customEditor = document.querySelector('.custom-wysiwyg');
customEditor.addEventListener('click', function(e) {
  // 阻止事件向上冒泡,避免CodeMirror捕获到点击事件
  e.stopPropagation();
  // 强制让自定义编辑器获得焦点
  this.focus();
});

方案2:临时禁用CodeMirror的输入能力

如果方案1无效,你可以直接操控CodeMirror实例,在点击自定义编辑器时让CodeMirror失去焦点并临时设为只读,离开时恢复:

// 获取Grav中CodeMirror的实例
const codeMirrorEl = document.querySelector('.CodeMirror');
const cmInstance = codeMirrorEl.CodeMirror;

const customEditor = document.querySelector('.custom-wysiwyg');

// 鼠标按下时就阻止CodeMirror抢焦点
customEditor.addEventListener('mousedown', function(e) {
  e.stopPropagation();
  // 让CodeMirror失去焦点
  cmInstance.blur();
  // 临时设置为只读,禁止CodeMirror获取焦点
  cmInstance.setOption('readOnly', 'nocursor');
  // 聚焦自定义编辑器
  this.focus();
});

// 自定义编辑器失去焦点后,恢复CodeMirror的可编辑状态
customEditor.addEventListener('blur', function() {
  cmInstance.setOption('readOnly', false);
});

方案3:调整DOM结构,隔离两个编辑器

如果前两个方案都没效果,可能是因为你把自定义编辑器放在了CodeMirror的内部容器里,CodeMirror的事件捕获机制会优先处理。可以把自定义编辑器移到CodeMirror容器外面,通过CSS定位覆盖在上方:

<!-- 调整后的DOM结构 -->
<div class="editor-wrapper">
  <!-- 原有的CodeMirror容器 -->
  <div class="CodeMirror">...</div>
  <!-- 自定义WYSIWYG编辑器 -->
  <div class="custom-wysiwyg" contenteditable="true"></div>
</div>

对应的CSS:

.editor-wrapper {
  position: relative;
}
.custom-wysiwyg {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 10;
  /* 保留你原来的其他样式 */
}

建议先尝试方案1,它是最轻量化的解决方式;如果CodeMirror的事件监听优先级太高,再用方案2;如果DOM结构导致的问题无法通过事件阻止解决,最后用方案3重构布局。

内容的提问来源于stack exchange,提问作者stckvrw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:27:18