背景
尝试使用 content editable 编辑有序列表<div>
。希望粘贴任何内容、键入任何内容或删除任何内容,并始终显示至少一个有序列表项,但绝不显示任何其他类型的文本(例如,无空行、无引用文本、无缩进、无 Microsoft 字体词等)。
使用 jQuery 1.9.1 支持尽可能多的浏览器。Fiddle的源代码如下。
代码
JavaScript(jQuery):
$(document).ready(function() {
$('.directions > ol').prop('contentEditable','true');
$('.directions > ol').keydown( function( e ) {
// Prevent shift-enter from creating blank lines.
if( e.keyCode === 13 && e.shiftKey ) {
e.preventDefault();
}
});
$('body').on( 'focus', '[contenteditable]', function() {
var $this = $(this);
$this.data( 'before', $this.html() );
return $this;
}).on( 'paste blur input keyup', '[contenteditable]', function( e ) {
var $this = $(this);
if( $this.data('before') !== $this.html() ) {
$this.data( 'before', $this.html() );
$this.trigger( 'change' );
}
});
$('.directions > ol').on( 'change', function( e ) {
var fragment = $(this).clone();
fragment.find( 'br' ).replaceWith( "\n" );
var div = document.createElement( 'div' );
var text = fragment.text().replace( /[\r\n]+/g, '\n' );
text = '<ol><li>' + text.replace( /\n/g, '</li><li>' ) + '</li></ol>';
$(this).replaceWith( text );
});
});
的HTML:
<html>
<body>
<div class="directions">
<ol>
<li>Turn left onto 5th Street after 500m.</li>
</ol>
</div>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="js/list.js" charset="utf-8"></script>
</body>
</html>
问题
当 contenteditable<ol>
被替换时:
$(this).replaceWith( text );
删除以下事件绑定:
$('.directions > ol').prop('contentEditable','true');
.on( 'paste blur input keyup', '[contenteditable]', function( e ) {
问题
我的主要问题是:如何在<ol>
不破坏contenteditable
绑定的情况下替换内部内容 - 以便用户可以继续编辑内容,即使他们选择整个文本来替换它?
我的第二个问题是:这甚至是一种可行的方法吗?我研究了各种所见即所得的实现。对于这样一个看似简单的任务,它们看起来都非常复杂并且拥有巨大的足迹(除了Whizzywing )。