使用"span"创建一个自定义的基于web的文本编辑器;元素——一个坏主意
Creating a custom web-based text editor using "span" elements - a bad idea?
我有一个web应用程序的想法,我需要完全控制嵌入式文本编辑器的功能,文本编辑器必须在所有浏览器中完全相同。在这种情况下,标准的contenteditable
功能不足以满足我的需求。
所以我一直在尝试各种方法来实现自定义文本编辑器。我的第一种方法是检测插入符号的鼠标点击(虽然没有可见的插入符号,因为似乎没有办法实现这一点)。这工作得相当好,但不幸的是没有办法显示插入符号(又名闪烁工字)。
这意味着我的闪烁插入符号也必须是定制的。我只能想到两种很好的方法来实现这一点,同时又能在所有浏览器上兼容。
-
第一个(可能更好)的选择是在JavaScript中实现自定义布局引擎,就像谷歌在谷歌文档中所做的那样。
-
第二个解决方案(可能容易得多)是将每个字符封装在自己的
<span>
元素中,从而允许在特定字符之间放置伪插入符号。这确实意味着会有很多跨度元素,但这肯定会实现我需要的,同时利用浏览器布局引擎。这种方法的另一个好处是,我不需要依赖于浏览器特定的文本选择技巧。
所以我的问题是,选项2真的是个坏主意吗?如果是,为什么?
首先,你真的需要自己开发编辑器吗?有Firepad和Etherpad,它们非常酷的协作编辑,也许更多的开源编辑器不是基于contenteditable
。创建这样的编辑器真的很难,所以浪费时间在上面是没有意义的。
contenteditable
,也肯定有其他事情会出错。
总之,答案是:
第一个选项在开始时非常困难和耗时,但它比第二个选项提供了更多的功能。例如,拥有完全自定义的布局引擎,你将能够实现分页符而无需等待CSS3的实现(你永远无法依赖,因为你希望完全在所有浏览器中都具有相同的行为)。事实上,您将能够绕过大多数浏览器的呈现差异。但是,除非你有一个优秀的JS开发团队,并且至少需要几个月的时间,否则我甚至不会开始考虑这个问题。
第二个解决方案——重用DOM更为现实。我将首先执行一些性能测试,但每个字符的span将很容易找到插入符号应该在鼠标单击后放置的位置。如果没有,它需要一些技巧……我不知道。您可以尝试检查Etherpad和Firepad(使用Ace代码编辑器)如何处理,但仍然-包装将是最简单的选择,至少在体面的浏览器上,它应该不会导致性能问题,除非您想要编辑非常长的文档(但随后您可以开始一些优化)。
- 尝试使用Javascript正则表达式来获取“&"分隔文本,无论它是否's是最后一个值
- jQuery"焦点”;在一个实例中有效,但在其他实例中无效
- 我如何选择/点击一个带有for=“”的元素"属性[量角器]
- 我收到一个类型错误,其中包含-"$不是函数“;使用noConflict时
- 我正在使用php includes来构建一个多页面网站.使用jquery,我将如何添加一个类"活动的”;添加到
- 获取"下一个“;对象中的数值
- 我怎样才能使一个类型=“;提交”;在css中看起来像一个type="按钮”;
- 为什么下面抛出一个“;对象没有't支持属性或方法'importNode'"在IE11中
- JQuery:如何强制选择一个选项为"选择“;,使用FancySelect插件
- 我想制作一个代码;a“;变成“;b”"b”;变成“;c”;,等等
- 你如何做一个sql"像“;在javascript中使用azuremobilesdk进行查询
- 说明Node.js项目:是否只有一个"服务器文件“;在node.js中
- 主路由器在路由“”的末尾附加一个#"导致dom中引用锚点在Backbone/Require应用程序中不起作用
- ReactJS-将溢出的元素放入一个“"下拉按钮
- 如何添加另一个"条目“;转换为此JSON
- 错误:未捕获的异常:[exception.."字符串包含一个..quot;
- 如何隐藏所有下一个"字段集“;元素使用jQuery
- 为什么smooth scrolling.js抛出了一个"$target.offset(..)未定义”;错误
- 匹配一个“"在特定图案之后,同时排除该图案.(JavaScript中的lookbacking)
- 我如何将这个javascript/jQuery转换为一个"不内联”;作用