我构建了以下 keyup/down 处理程序,以使我的 contenteditable <UL>s 白痴证明。*
它做了两件事:
- 当 <UL> 为空时,将 <LI> 添加到 <UL>。我使用在 SO(来自 Tim Down)上找到的一些代码将插入符号放在预期的位置
- 清除所有非 LI/非 BR 标记。这基本上是一种快速又脏的膏状清洁剂。
这提高了我对 jquery 和 DOM 操作的舒适度,所以可能有几件事我可以做得更好,但它按原样工作得很好。
//keyup prevented the user from deleting the bullet (by adding one back right after delete), but didn't add in li's on empty ul's, thus keydown added to check
$('ul').on('keyup keydown', function() {
var $this = $(this);
if (! $this.html()) {
var $li = $('<li></li>');
var sel = window.getSelection();
var range = sel.getRangeAt(0);
range.collapse(false);
range.insertNode($li.get(0));
range = range.cloneRange();
range.selectNodeContents($li.get(0));
range.collapse(false);
sel.removeAllRanges();
sel.addRange(range);
} else {
//are there any tags that AREN'T LIs?
//this should only occur on a paste
var $nonLI = $this.find(':not(li, br)');
if ($nonLI.length) {
$this.contents().replaceWith(function() {
//we create a fake div, add the text, then get the html in order to strip out html code. we then clean up a bit by replacing nbsp's with real spaces
return '<li>' + $('<div />').text($(this).text()).html().replace(/ /g, ' ') + '</li>';
});
//we could make this better by putting the caret at the end of the last LI, or something similar
}
}
});
jsfiddle 在http://jsfiddle.net/aVuEk/5/
*我非常不同意 Diodeus 的观点,即培训是所有情况下最好/最简单的解决方案。在我的情况下,我在一个页面上有几个可内容编辑的 <UL>,它们非常内嵌 WYSIWYG(即,tinymce 风格的 chrome 没有太多空间),并且被临时的、初次使用的非高级用户使用。