【发布时间】:2013-01-14 22:48:38
【问题描述】:
我有一种基于浏览器的所见即所得编辑器,用户可以在其中编辑文档模板。
Document-template 是一个普通的 html,带有一些特殊的“合并代码占位符”。通过将这些占位符替换为来自 DB 的数据,此类模板得到“实例化”。这给出了最终文档 - 模板的一个实例。
我目前的做法是这样的:
<div contenteditable>
Sample template with <input type=button class="mergecode" value="MergeCode1">.
</div>
(在线示例:http://jsfiddle.net/tFBKN/)
在这种情况下,输入是不可编辑的,并且表现为一个实心块——这正是我所需要的。 用户可以通过单击 DEL 或 BACKSPACE 作为任何其他字符等来删除此类合并代码。通过为此类 input.mergecode 设置适当的 CSS,我可以实现我想要的外观。
但是通过这种方法,我在三个不同的 UA 中遇到了三个不同的问题:
- IE - CSS
{ font:inherit }在那里根本不起作用,所以如果输入在<b>中,就像这里的<b><input value="test"></b>一样,它不会继承任何字体样式。 - FF - 包含
<input>元素的片段副本会从剪贴板内容中删除该输入,因此进一步的粘贴操作会插入所有内容,但不会插入输入。 - GC - 在
<input>产生奇怪的结果后立即点击 {BACKSPACE} (bug)
所以我正在寻找关于如何在 HTML 中表示不可编辑的内联块类似“岛”的其他想法。
到目前为止我尝试过的其他方法:
-
<span contenteditable="false">MergeCode1</span>- 它不起作用,因为大多数 UA 从选择中删除了此类节点。因此,不可能在包含此类跨度的选择之上应用<b>或<i>。
还有其他想法吗?
【问题讨论】:
-
不可能。
contenteditable影响所有子元素。删除后可以用JS替换。 -
@Mooseman 抱歉,究竟是什么不可能?
-
@Mooseman 的评论有误;
contenteditable可以被子元素覆盖,如示例<span contenteditable="false">MergeCode1</span>。正如问题所解释的那样,这种自然方法不适用于选择(例如,三次单击不会选择整个块)。 -
试试这个代码:
<div style="background:#000; color:#FFF" contenteditable=true> Hello, world! <span contenteditable="false" style="font-weight:bold">Unedtiable</span> Hello, world! </div>如你所见,span 仍然可以被移除。无法编辑文本“不可编辑”,但用户可以将<span>作为一个整体删除。 Chrome 开发工具显示整个块已从 DOM 中删除。 -
@Mooseman,正如我所说,我已经尝试过 contenteditable="false"。如果您需要在此类岛的顶部应用像
<b>这样的跨度,则它不起作用。试试这个:jsfiddle.net/RYsvZ/1,例如选择带有 MergeCode1 的文本,然后单击 CTRL-I。您将看到斜体文本,但不是 MergeCode1。使用 DOM 检查器查看问题。
标签: html contenteditable