Monoco Editor光标问题定位

697 阅读1分钟

场景一、Ant Design Pro 中使用ProCard包裹

表现形式:

随着输入内容不断增加,光标距离实际位置越来越远

原因:

使用的procard字体设置影响

image.png

解决思路:

覆盖到默认字体设置 或者重新计算字体的宽度

方案1:

monaco实例的options可以加上 (完美解决)

<MonacoEditor
    options={{
      fontSize: '16px',
      fontFamily: 'unset',
    }} 
 />

方案2:

monaco.editor.remeasureFonts() (理论上可行,执行时间需要在设置之后,暂未找到执行时间点 实际执行时位置依然有偏差)

场景二、作为Qiankun子应用嵌入,弹窗打开编辑器

表现形式:

点击编辑器的某个位置,光标发生偏移,不能定位到点击触发点

原因:

getPositionOfChildWindowRelativeToAncestorWindow (正常情况应该是top:0, left:0);但是在窗口滚动的情况下;scroolY非0,会赋值给top

在主应用的窗口scrollY赋给top之后,

windowChainEl.window是 (Proxy对象) !== ancestorWindow(未经过代理的, 鼠标事件里的view,即全局window对象)

windowChainEl不存在iframeElement

此时跳出遍历,返回top(scrollY值)和left值。

   /**
    * Returns the position of `childWindow` relative to `ancestorWindow`
    */
   static getPositionOfChildWindowRelativeToAncestorWindow(childWindow, ancestorWindow) {
    if (!ancestorWindow || childWindow === ancestorWindow) {
        return {
            top: 0,
            left: 0
        };
    }
    let top = 0, left = 0;
    const windowChain = this.getSameOriginWindowChain();
    for (const windowChainEl of windowChain) {
        top += windowChainEl.window.scrollY;
        left += windowChainEl.window.scrollX;
        if (windowChainEl.window === ancestorWindow) {
            break;
        }
        if (!windowChainEl.iframeElement) {
            break;
        }
        const boundingRect = windowChainEl.iframeElement.getBoundingClientRect();
        top += boundingRect.top;
        left += boundingRect.left;
    }
    return {
        top: top,
        left: left
    };
}

解决思路:

方案1:

编辑器初始化之前让窗口呆在top:0,left:0的位置

window.scroll(0,0)

方案2:

修改getPositionOfChildWindowRelativeToAncestorWindow函数源码

if (!ancestorWindow || childWindow === ancestorWindow || childWindow === ancestorWindow.proxy)