好的。第一个想法是制作
<ins contenteditable="false">new</ins>
在 contenteditable="true" 元素内。进一步阅读 (contenteditable=false inside contenteditable=true block is still editable in IE8) 表明这在 IE 中并不总是被解释得很好。在这篇文章中有一个 hack 答案 (https://stackoverflow.com/a/7522910/1125465) 但我真的不同意。这只是一个错误,可能会在下一个版本的浏览器中修复。
接下来我点击了这个链接 (HTML contenteditable with non-editable islands),但我没有得到好消息。没有办法阻止ins标签编辑这么简单。首先要注意一点:
如果这不是附加功能,您必须确保它可以正常工作。正如您所写的那样不允许用户在 -tag 内写入 ,所以所有选项:
- 在几乎所有浏览器中工作...
- 正在处理一个小错误...
- 工作但是如果有人...
必须被拒绝。因此,如果有人关闭了 javascript,它也应该可以工作。在这种情况下,我得出了第一个结论(一如既往):服务器端验证必须完成。
这将防止用户破坏您的数据库并做他不能做的事情。
在服务器端验证后(当然,如果出现问题,也会显示通知),这将是附加功能。所以我们现在应该尽我们所能,让它发挥作用(但现在没有义务)。
精彩的讲座:)
https://stackoverflow.com/a/7232871/1125465
http://jsfiddle.net/X6Ab8/
**解决方案**
我提出类似...我知道这听起来有点像过去的 milion 标签,但实际上这会奏效并且会很棒。
在 ins 元素之间创建一个额外的 span 元素(例如使用 php:
$text = '<span contenteditable="true">'.$text.'</span>';
str_replace('<ins>', '</span><ins>', $text);
str_replace('</ins>', '</ins><span contenteditable="true">', $text);
使这个 span 可编辑,并且只有这个 span 可编辑(而不是块容器)。就是这样。解决方案简单、干净、效率更高且几乎 100% 安全。而且很好......
使用 javascript hack 时的额外安全性
如果您需要完全使用 javascript 来完成它(也许有人知道怎么做?),为了完全安全,我建议另外这样做:
- 将 data-noneditable-id="id" 添加到主块可编辑容器内的每个 non editable 元素。现在每个不可编辑的元素都有自己唯一的 id(可以使用 jQuery 来完成,例如使用选择器 $("div#editable ins"))。
- 运行一个 javascript,它将遍历所有具有“data-noneditable-id”属性的对象,并将它们的 innerHTML 保存在数组中(例如:1 => 'new', 2=> 'added', 3=> '插入',...)。
- 现在,如果有人编辑其中任何一个,您可以轻松修复它们。
PS。这也应该有点帮助......(https://stackoverflow.com/a/4979828/1125465)。
希望对您有所帮助!最好的问候。