【发布时间】:2013-06-19 01:06:18
【问题描述】:
我最近一直在 HTML5 页面中使用 contenteditable,在将它与某些元素一起使用时遇到了错误,我想知道在哪里以及如何真正安全地使用它。
我发现将 span 元素设为 contenteditable 会导致 Firefox1 和 Chrome2 出现一些错误行为。但是,使 div 或 section contenteditable 看起来完全安全3。
一些人提到的指导方针是,只有 块级元素 应该被设为 contenteditable。然而,Mozilla 开发者网络lists the heading elements h1 through to h6 as block-level elements,并且在 Firefox4 中使标题元素可编辑是错误的,并且可能会在 Chrome5 中崩溃页面.
我希望喜欢能够使用的不仅仅是 div 和部分,但我不清楚哪些元素实际上可以安全地使 contenteditable。 安全地,我的意思是在正常条件下使用该元素,我应该能够执行正常的编辑任务它不会做意外或错误的事情。我应该能够在其中书写、删除内容、剪切、复制、粘贴和移动我的文本光标并突出显示文本,而不会出现意外或奇怪的行为。
那么,我可以真正安全地将哪些元素设为 contenteditable?有具体的分类吗?安全内容可编辑元素是否必须符合某些标准?
错误说明:
- Firefox 21 w/ span:如果文本光标移动到元素的开头或结尾,元素会失去焦点,但如果它通过删除内容到达那里则不会。突出显示元素的一部分,剪切然后粘贴将在该点将元素一分为二,然后在两部分之间插入一个空白元素 - 没有实际上将您试图粘贴的文本放在任何地方。李>
- 带跨度的 Chrome 27:如果跨度覆盖多行,例如通过自动换行,剪切和粘贴内容通常会在粘贴的内容后插入换行符。
- 除非您将 div 设为 display:inline,在这种情况下,它仍会像 1 中一样失去焦点,但显然只有在您将文本光标置于末尾时。不过,我不认为元素的这种“正常”用法。
- Firefox 21 带标题:选择部分内容然后剪切和粘贴将与 1 类似,在该点将标题元素一分为二,并在两者之间插入一个 third 标题元素一半。至少,它会在其中包含您粘贴的内容,但现在您在原来有一个标题元素的地方有了三个标题元素。
- 带标题的 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