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

Bootstrap隐藏标签页内CodeMirror初始化后首次切换不显示问题求解

问题根因

隐藏状态的Bootstrap标签页容器样式为display: none,CodeMirror在不可见元素内初始化时无法正确计算容器宽高,导致首次渲染内容缺失,点击触发页面重绘后才会正常显示。

修复方案

方案1:监听标签显示事件调用refresh重绘

页面加载时正常初始化所有标签内的CodeMirror实例,监听Bootstrap标签页的显示事件,首次切换到对应标签时调用CodeMirror内置的refresh()方法强制重绘即可。

// 1. 初始化时把所有编辑器实例按对应标签ID存储
this.editors = {}
// 示例:初始化css标签编辑器
const code_element = document.getElementById('css');
code_element.value = message.css;
this.editors['css'] = CodeMirror.fromTextArea(code_element, {lineNumbers: false, mode:"text/css"});
this.editors['css'].setSize("100%", "calc( 100vh - 350px )");
// 其余html、js等标签的编辑器按相同逻辑存入editors对象

// 2. 绑定标签页显示事件(Bootstrap 5 写法,3版本把data-bs-toggle改为data-toggle即可)
document.querySelectorAll('a[data-bs-toggle="tab"]').forEach(tabTrigger => {
  tabTrigger.addEventListener('shown.bs.tab', function (e) {
    // 获取当前激活标签的ID
    const activeTabId = e.target.getAttribute('href').replace('#', '');
    // 对应编辑器存在则调用refresh重绘
    if (this.editors[activeTabId]) {
      this.editors[activeTabId].refresh();
      // 只需要首次刷新的话可以加判断标记,避免重复调用
    }
  })
})

方案2:懒加载初始化编辑器

无需页面加载时初始化所有编辑器,仅当用户第一次切换到对应标签时才初始化当前标签的CodeMirror实例,从根源避免不可见容器内的尺寸计算问题,同时还能减少初始化阶段的性能消耗。

this.editors = {}
// 绑定标签显示事件
document.querySelectorAll('a[data-bs-toggle="tab"]').forEach(tabTrigger => {
  tabTrigger.addEventListener('shown.bs.tab', function (e) {
    const activeTabId = e.target.getAttribute('href').replace('#', '');
    // 仅未初始化过的标签才执行初始化逻辑
    if (!this.editors[activeTabId]) {
      const code_element = document.getElementById(activeTabId);
      code_element.value = message[activeTabId];
      this.editors[activeTabId] = CodeMirror.fromTextArea(code_element, {
        lineNumbers: false, 
        mode: `text/${activeTabId}`
      });
      this.editors[activeTabId].setSize("100%", "calc( 100vh - 350px )");
    }
  })
})

// 主动初始化默认激活的第一个标签的编辑器
const defaultActiveTabId = document.querySelector('.tab-pane.active').id;
const defaultCodeEl = document.getElementById(defaultActiveTabId);
defaultCodeEl.value = message[defaultActiveTabId];
this.editors[defaultActiveTabId] = CodeMirror.fromTextArea(defaultCodeEl, {
  lineNumbers: false, 
  mode: `text/${defaultActiveTabId}`
});
this.editors[defaultActiveTabId].setSize("100%", "calc( 100vh - 350px )");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:24:05