【问题标题】:Which elements can be safely made contenteditable?哪些元素可以安全地变为 contenteditable?
【发布时间】:2013-06-19 01:06:18
【问题描述】:

我最近一直在 HTML5 页面中使用 contenteditable,在将它与某些元素一起使用时遇到了错误,我想知道在哪里以及如何真正安全地使用它。

我发现将 span 元素设为 contenteditable 会导致 Firefox1 和 Chrome2 出现一些错误行为。但是,使 divsection contenteditable 看起来完全安全3

一些人提到的指导方针是,只有 块级元素 应该被设为 contenteditable。然而,Mozilla 开发者网络lists the heading elements h1 through to h6 as block-level elements,并且在 Firefox4 中使标题元素可编辑是错误的,并且可能会在 Chrome5崩溃页面.

我希望喜欢能够使用的不仅仅是 div 和部分,但我不清楚哪些元素实际上可以安全地使 contenteditable。 安全地,我的意思是在正常条件下使用该元素,我应该能够执行正常的编辑任务它不会做意外或错误的事情。我应该能够在其中书写、删除内容、剪切、复制、粘贴和移动我的文本光标并突出显示文本,而不会出现意外或奇怪的行为。

那么,我可以真正安全地将哪些元素设为 contenteditable?有具体的分类吗?安全内容可编辑元素是否必须符合某些标准?

错误说明:

  1. Firefox 21 w/ span:如果文本光标移动到元素的开头或结尾,元素会失去焦点,但如果它通过删除内容到达那里则不会。突出显示元素的一部分,剪切然后粘贴将在该点将元素一分为二,然后在两部分之间插入一个空白元素 - 没有实际上将您试图粘贴的文本放在任何地方。李>
  2. 带跨度的 Chrome 27:如果跨度覆盖多行,例如通过自动换行,剪切和粘贴内容通常会在粘贴的内容后插入换行符。
  3. 除非您将 div 设为 display:inline,在这种情况下,它仍会像 1 中一样失去焦点,但显然只有在您将文本光标置于末尾时。不过,我不认为元素的这种“正常”用法。
  4. Firefox 21 带标题:选择部分内容然后剪切和粘贴将与 1 类似,在该点将标题元素一分为二,并在两者之间插入一个 third 标题元素一半。至少,它会在其中包含您粘贴的内容,但现在您在原来有一个标题元素的地方有了三个标题元素。
  5. 带标题的 Chrome 27:选择一些内容并剪切和粘贴。页面崩溃。你会得到一个“Aw snap!”信息。就是这样。

演示代码

这是重现上述内容的演示。这很简单,但目前唯一没有重现的是失去焦点的错误。

[contenteditable=true] {
  border: 1px dotted #999;
}
<article style="width: 100px">
  <h1 contenteditable="true">Heading</h1>
  <p>
    <strong>Some adjacent content</strong>
    <span contenteditable="true">Span! This is long enough it will spread over multiple lines.</span>
  </p>

  <div style="display: inline" contenteditable="true">An inline div also with multiple lines.</div>
</article>

【问题讨论】:

  • 在 HTML5 中,任何元素都可以编辑。
  • @j08691 如果理论上是这样,但实际上并非如此。以上bug都发生在一个html5页面上。
  • 你能发布你的代码吗? @j08691 是正确的,因为任何元素都可以编辑,但是所需的结果可能会有所不同,因为 contenteditable 自然取决于用户而不是编码器。话虽如此,理论上可以将 contenteditable 元素放置在“硬编码”元素中以防止 OTT 使用 - 一个示例是允许用户增加图像的大小,但您不希望他们增加它太多了,将图像放在不可编辑的“锁定”div中,但是这种编码方式效率极低。
  • 浏览器有处理 contentEditable 的错误是否令人惊讶?没有真正的规则来说明哪些元素是安全的,您必须自己找出并在发现问题时在每个浏览器上提交错误。
  • 如果您希望在任何元素上的 contenteditable 都没有错误/古怪的浏览器行为,那么您会失望的。

标签: html google-chrome firefox contenteditable


【解决方案1】:

在我看来,div 是最安全的选择。您希望真正编辑的任何元素(无论是跨度、标题等),您都可以将其放置在 div 内并进行编辑,就好像它只是那个元素一样。此外,为了解决您提到的 display:inline 问题,您始终可以在可编辑的 div 上使用 float:left 或 float:right 以使其具有“内联感”,而无需实际内联。

希望有帮助!

【讨论】:

  • 实际上,给元素 :before 和 :after 伪元素停止了焦点错误! :)
  • 不错!很高兴你能弄清楚一些事情。请注意:之前,因为 IE 8 和更早版本不是该伪类的忠实粉丝 :)
【解决方案2】:

由于这是一个不断发展的功能,显然浏览器供应商支持的低优先级一直是粗略的,回归并不少见。当前的情况正在演变,因此请检查 Google、CanIUse 等,并确保为您的网站访问者提供支持,其他一切都没有实际意义......

Firefox 的支持似乎很稳固,至少对于某些元素而言,现在是https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Editable_content 就我的测试而言,它在 Chrome 中运行良好。 CanIUse 看起来不错:http://caniuse.com/#feat=contenteditable

虽然在不同的浏览器中存在与该功能相关的许多不同的错误,但对于简单的用例,截至 2016 年 8 月,现在应该没问题。

【讨论】:

  • 关于 contentEditable 浏览器几乎是静态的。他们修复这种错误的速度非常慢,其中大多数已经知道和报告多年,但由于它们不计入像 Acid 测试之类的东西,所以它们被忽略了。当然,随着时间的推移,事情会发生变化,但并不总是朝着正确的方向发展:code.google.com/p/chromium/issues/detail?id=226941
  • 由于目前 contenteditable 的开发并没有太大进展,它不会面临 4 周后答案过期的问题,更不用说在字节干之前。无论如何,这是网络,HTML5,而且东西确实会改变,所以答案会过时最终,但很多事情也是如此:关于如何做的答案垂直对齐 CSS 中的内容,随着 CSS 的改进而过时。
  • AlfonsoML 是对的。我每天都在 WYSIWYG 编辑器上工作 1.5 年(而且 Alfonso 关注这个功能的时间更长),我不记得有任何事情可以显着改善情况。事实上,我记得更多的新错误(比如 Alfonso 链接的整个主题),尽管通常它们对我们来说比修复的更明显。无论如何 - 五年是网络世界的一个完整时代,但不幸的是,这不包括contenteditable
  • 关于 CSS 的答案仍然适用于该版本的 CSS 规范,即使有一个更新的版本可以以不同的方式完成。 SO 的重点是建立一个规范问题和答案的数据库。在目前的形式中,这个问题并没有针对任何东西、规格、日期、浏览器版本进行固定,并且会很快过时,以至于一年后它会让访问者感到恼火。 @AlfonsoML 两年前这个问题的答案在今天仍然完全适用吗?如果你知道它写它...
  • 我没有时间也没有意愿创建这样的支持表,但你可以打赌,什么都没有真正改变,所以我不明白你为什么这么久才提到我。从问题中的错误列表中,我只能发现 Chrome 不再崩溃,但似乎其余问题都存在,并且我链接的 chromium 错误仍然存​​在并且正在运行,因此时间表明浏览器无法正常工作内容可编辑。正如 Reinmar 所说,唯一真正的答案是“没有”。无论使用何种浏览器测试,所有元素在某种程度上都有缺陷。
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2013-07-21
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多