问题背景:
前端框架:react
编辑框div是在某些事件触发下才显示或隐藏,富文本编辑器ckeditor采用inline的方式加载,有焦点才显示。编辑框里的初始内容是通过jquery的load远程服务器内容方式显示。ckeditor加载和load内容均在componentDidUpdate生命周期中完成:
问题:
第一次打开div时,文本内容会闪现一下,最后消失。后面再打开div,则内容可以正常显示
image.png
原因分析:
jquery load加载显示的前提,div节点没有子节点,如果div里面有内容,则load不会将数据显示在div节点上。由于ckeditor没有源代码具体原因不好分析,猜测是第一次打开时存在时序问题,ckeditor一些初始化动作,在jq load填空数据之前完成,此时div下没有任何内容,ckeditor默认写入一个空行<br />,等到jq load取到数据,发现div下面已经有子节点,则不在往div下填充数据,导致div下显示一个空行。
后面再打开该div时,估计是浏览器缓存的原因,jq load从缓存而不是服务器拿数据,或者加上ckeditor的加载动作比第一次步骤少,速度更快,最终导致load的速度很快,在ckeditor初始化动作之前就完成了,因此ckeditor不会往div填入默认的空行<br />。
解决方法
控制load和ckeditor的加载时序,在load的回调函数中,加载ckeditor,这样可以确保在ckeditor加载时,div上已经有内容,避免ckeditor默认填充内容的动作
$('#myDiv').load(url, () => {
window.CKEDITOR.inline('myDiv')
})