场景一、Ant Design Pro 中使用ProCard包裹
表现形式:
随着输入内容不断增加,光标距离实际位置越来越远
原因:
使用的procard字体设置影响
解决思路:
覆盖到默认字体设置 或者重新计算字体的宽度
方案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)