如果您在内容可编辑<li>
标记内一直退回到<ul>
标记的开头,则会删除所有剩余的<li>
标记。
<ul contenteditable="true">
<li>Hello</li>
<li>World</li>
</ul>
jsfiddle:http://jsfiddle.net/8Q53V/
将光标放在世界中的'd'后面,然后退回到行首。再次点击退格键时,它也会删除“Hello”列表项。你怎么能防止这种行为?
更新:看来此行为仅存在于Chrome
中答案 0 :(得分:5)
这是我发现的:
只有在父{1}}元素后面没有任何其他元素且最小渲染空间为1px x 1px的情况下,才会出现Opera和Chrome中可疑列表的错误行为。元素的
ul
值无关紧要,只要它是非空的或具有CSS的设置高度维度。
因此,添加一个简单的display
将回答您最直接的问题。
但是,在询问时,您无法在HTML中可靠地使用<div style="height: 1px;">
列表。
这个问题引起了我的兴趣,我在 Moz FF 29-30,Opera 21,Google Chrome 35&amp; IE 11,在Win 8.1 上。我测试了简单的键,如 Enter , Backspace 和 Delete 。
TL; DR :IE 11完全搞砸了,Opera&amp;如果
contenteditable
后跟一个具有渲染大小的元素,并且Moz FF会插入一个奇怪的ul
标记,则Chrome会做得很好。您需要<br type="_moz"></br>
,e.preventDefault()
和e.keyCode/charCode
&amp;Selection
JS API用于创建自定义的可信任列表,该列表在所有浏览器中均可使用。但是,这些先决条件在所有浏览器上都不能始终如一。最佳解决方案:使用现有的编辑器或一些不可见的文本输入进行输入。
这些是详细的问题:
点击输入添加新的Range
将添加以下标记:
li
<li><br><li>
<li><br type="_moz"></br>
非空:li
,如果它为空,则IE完全混乱&amp;插入<li><br></li>
,然后在其后面复制一个空的p
,里面只有一个<ul contenteditable="">
标记。此空<br>
将在原始元素后面的元素之后添加(如果有)。 点击 Backspace 删除ul
将执行以下操作:
li:not(:first-child)
后面没有带有渲染大小的元素,则所有ul
都将被删除。如果是,则发生预期的行为。 (删除了一个li
)。li
)。但是,删除li
后,Moz FF会将光标移出可信区域。应该不惜一切代价阻止 Backspace 删除第一个li
。
对于每个测试的浏览器,这都会破坏列表布局。所有新的 Enter 匹配都会生成li
作为列表的直接子项。
点击删除以删除后续div
在所有经过测试的浏览器中保持一致。随后的li
将被删除,其中的所有内容都将转移到当前li
在空li
中键入第一个字母将执行以下操作:
li
标记已删除。 <br>
代码不已删除。删除空<br type="_moz">
中的唯一字母将执行以下操作:
li
标记。 <br>
仍然存在。小提琴:http://jsfiddle.net/8Q53V/8/(第一个ul是自定义编码行为,不完美,第二个ul是标准的)
答案 1 :(得分:4)
您需要在每个contenteditable
代码
li
如果您不想自己分配属性,可以使用Javascript setAttribute()
来处理 - (您在问题中标记了Javascript,因此我假设您已打开到Javascript解决方案)
var elm = document.querySelectorAll('ul li');
for (var i=0; i < elm.length; i++) {
elm[i].setAttribute("contenteditable", "true");
}
Demo (使用Javascript分配属性)
请注意这里,我在querySelectorAll()
中使用的选择器过于笼统,会匹配文档中的所有ul
元素,因此如果您想要创建一个特定的li
组{} 1}}元素可编辑,而不是将class
或id
分配给ul
元素,并适当地定义唯一的选择器。
如果您想要多个ul
li
可编辑,最好定义class
而不是id
,因为id
必须是唯一的。 ..因此,每当您想要一组li
可编辑时,定义唯一性将非常麻烦。