在线代码编辑器/IDE是如何实现的?

在线代码编辑器/IDE是如何实现的?

textarea不能作为富文本编辑器使用,高亮加粗等在textarea中都是无法实现的,除非你手写代码。

其实一开始我以为这些代码编辑器和传统的富文本编辑器是一样的,后来发现不是的。

下面先说说富文本编辑器,为了方便区分就用引用格式了:

我观察了五个不同的能高亮的在线IDE(不能高亮的就算了,那肯定是textarea)。

比如这个

还有

然后我发现:这五个web IDE中,只有一个使用了将div设置为可编辑模式的方式,其余四个都没有这么做。

为什么这些在线IDE没有和传统富文本编辑器一样?

我的看法是:

下面说说粘贴是怎么实现的。

按常理说,只有textarea,input这些,以及处于可编辑模式下的dom元素才会右键出现「粘贴」项。

然后我观察了下,发现这些IDE使用了textarea,下面的三个步骤可以证明这一点:

1) 以上面

为例,打开Chrome控制台,输入

控制台中会log出两个<textarea>,鼠标放在上面,你会发现,有一个textarea正好在你的光标位置。

2) 然后切换到Elements栏,定位到这个textarea。在编辑器中右键按下不放,你会发现在你按下右键的时候,这个textarea的z-index变为100000。

这是为了保证在鼠标右键按下,菜单弹出之前,textarea能保持focus状态,否则右键菜单中不会出现「粘贴」。而左键就不必要了,因为直接添加click事件发生时执行textarea.focus()就能保证textarea处于聚焦状态。

3) 给textarea绑定focus和blur事件可以发现,输入文字以及ctrl+V时,textarea是一直处于聚焦状态的。

所以很明显了,这个在线IDE输入代码是在一个隐藏textarea中进行的。然后就是把用户输入到textarea中的内容取出,再用正则之类的分析格式,加标签等等,貌似题主的问题不在这方面。

另外,出于安全原因,现在的浏览器只能由用户主动粘贴,javascript是没法直接访问剪切板内容的。

比较啰嗦。