这是一个非常具体的问题,但我已经有一个解决方案可以将纯文本粘贴到<span contentEditable="true">
中,方法是使用一个隐藏的textarea
,看起来效果非常好,但它会破坏浏览器的撤销功能。一开始我不担心跨浏览器的解决方案;我只关心Chrome。我采用的方法大致如下:
$('.editable').live('paste', function()
{
var $this = $(this);
//more code here to remember caret position, etc
$('#clipboard').val('').focus(); //put the focus in the hidden textarea so that, when the paste actually occurs, it's auto-sanitized by the textarea
setTimeout(function() //then this will be executed immediately after the paste actually occurs
{
$this.focus();
document.execCommand('insertHTML', true, $('#clipboard').val());
});
});
这个方法可以正常工作——无论我复制什么内容,它都会在进入我的contentEditable
区域之前被转换为纯文本。但是当我尝试撤销操作时:
- 第一次撤销只能撤销刚才的粘贴操作。
- 第二次撤销就会尝试撤销对
#clipboard
的更改,并将焦点从我的contentEditable
中移开。
我已经尝试了各种方法,希望能阻止浏览器尝试撤销对#clipboard
的更改,例如在没有使用它时切换display:none
,切换readonly
和disabled
状态,在上面的事件结束时销毁它并在开始时重新创建它,以及其他各种方法,但是似乎都没有起作用。
这是一种糟糕的清理数据的方式吗?这是我真正设法让其正常运行的第一件事情。尝试在粘贴后清理标记没有起作用,因为有些东西(整个HTML文档)在粘贴时会崩溃浏览器,我想避免这种情况。
是否有任何方法可以使#clipboard
不可撤销,或者有其他建议如何让它正常工作吗?
编辑
我通过添加以下一行代码,成功改善了某些情况:
$('#clipboard').val('');
在execCommand
代码行后面。这似乎完全中和了撤销功能:插入符不再离开contentEditable
字段,但是没有任何撤销操作。有点进步,但我仍在寻找一个合适的解决方案。
contentEditable
--而TinyMCE允许粘贴各种标记。我不想制作富文本编辑器--事实上恰恰相反。我想制作一个纯文本的contentEditable
元素。只需使用一个“文本区域”,对吧?虽然很想这样做,但我需要内容围绕页面中的其他元素换行。 - Ian Henry<textareas>
和contenteditable
元素中处理选择和更新内容的机制是如此不同,以至于在两者之间切换需要进行完全重写。 - Tim Down