【问题标题】:building a wysiwyg editor构建所见即所得的编辑器
【发布时间】:2011-05-24 12:17:26
【问题描述】:

我需要为我正在处理的项目构建一个所见即所得的编辑器,并且需要一些指导。我的一些主要困惑点如下:

iframe docs vs. contenteditable divs:我应该使用哪一个,为什么?我讨厌 iframe,使用 iframe 有明显优势吗?

跨浏览器样式:execCommand 似乎在不同的浏览器中应用不同的样式。有什么技巧可以让这个跨浏览器兼容吗?我应该根本不使用 execCommand 而是应用我自己的样式吗?

将项目添加到撤消链:如何运行我自己的脚本,例如插入图像,并允许 cntrl+z(撤消)删除它?是否有可以将项目推送到 contenteditable 的撤消/重做项目数组?

保持文本选择:如何在进行诸如选择字体样式、焦点离开和删除我的选择等操作时保持文本选择。 Rangy? Google closure?还有其他值得一看的范围/选择库吗?

任何关于这些项目的提示或与构建富文本编辑器相关的任何其他内容将不胜感激!

【问题讨论】:

  • 我假设您有充分的理由不能简单地使用 TinyMCE 之类的东西?
  • 没有什么很好的理由,除了 a) 我的老板想让我从头开始,b) 对于我的用例,编辑器本身还有很多其他的东西,所以它会进行重大修改/addition to tinymce 如果我使用它。我最终可能会查看他们的代码,以获得基本编辑的一些见解。
  • 你的老板疯了 :) 我不知道你需要什么确切的功能,但你会遭受可怕的痛苦(或者享受构建它的乐趣,并在维护它的同时遭受痛苦)。祝你好运。不过,请看一下 TinyMCE、HtmlArea 和 Google Closure 的编辑器组件。我建议您先尝试约束您的老板,同时向他清楚地解释他将如何让自己的生活(和您的)成为噩梦,然后如果他仍然想要它,然后痛苦地准确地定义需求和测试规范。有他坐在你身边,所以他才意识到自己的疯狂程度。
  • 我自己实际上一直在尝试它——尽管我并没有以任何方式瞄准 IE。即使 Chrome 和 Firefox 也不会免费为您提供东西,我在 遇到了很多问题——我认为与其使用 execcommand 不如处理 dom自己修改——目前 execcommand 的实现存在太多问题。

标签: javascript html iframe wysiwyg contenteditable


【解决方案1】:

根据个人经验,我建议不要这样做,除非您的目标是提供非常有限的功能。如果您想把它做好,浏览器差异的数量及其变通方法的复杂性使这成为一项非常棘手且耗时的任务。

如果这还没有让你失望,以下是我对你个人问题的看法:

iframe 文档与 contenteditable div

我推荐 iframe 方法,主要有两个原因:

  • 您可以完全控制 iframe 中的文档类型、CSS 和脚本。如果您想要一致的行为和外观并且想要在不同页面中使用您的编辑器,这一点至关重要。
  • 特别是 Firefox 的 contenteditable 元素有很多错误,它们是最近才引入的(版本 3.0),而 designMode 在文档中已经存在多年(从 1.0 之前;大约 0.6,如​​果有记忆的话)并且工作得很好好吧。

跨浏览器样式

如果在不同浏览器中应用样式获得统一的结果对您很重要,那么通常您需要编写自己的样式代码。但是,这样做会破坏内置的撤消堆栈,您需要实现自己的撤消/重做系统。

将项目添加到撤消链

没有与内置浏览器撤消堆栈交互的编程方式。您需要自己编写。

2012 年 11 月更新

有一个spec in the works 用于自定义撤消/重做,因此这很可能最终成为可能。以下是MozillaWebKit 的相关错误。

保留文本选择

我必须在这里声明我的兴趣,因为我写了Rangy。我认为没有更好的图书馆可以做类似的工作。 Google Closure 确实有一个范围/选择 API,但我认为它使用自己的专有接口,而不是模拟 DOM Range 和常见的浏览器选择对象。 IERange 是另一个库,在想法上与 Rangy 相似,但没有完全实现,并且在其作者发布后似乎立即被放弃。

【讨论】:

  • 感谢蒂姆的详细回复!这实际上对我有很大帮助。我一直在使用您的 Rangy 库,并且喜欢您在其中投入的工作。很高兴知道我没有疯,这确实是一项重大的重大事业。
【解决方案2】:

不要,真的不要。

您的建议是一项重大任务。你真的应该看看 TinyMCE,http://tinymce.moxiecode.com/,或 CKEditor,http://ckeditor.com/。要获得您所追求的东西,要为一个浏览器的一个版本工作,使其可移植需要大量的努力,这将需要数年的投资。

更好的解决方案是查看 TinyMCE 的插件 http://tinymce.moxiecode.com/plugins.php 之类的东西。您可以获得基础知识(以及免费的便携性)并专注于添加您需要的特定增值项目。

【讨论】:

  • 感谢您的评论。我意识到这是一项艰巨的任务,我只是想知道这些问题是否有可行的解决方案。
  • OP没有提到他应该从头开始构建吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多