我有两个带有格式化内容的contenteditable div(例如带有粗体/斜体文本等的段落),我想将所选文本从一个移动到另一个。它本身工作得很好,但我想在移动文本时“清理”移动的文本,例如删除任何格式(“< b> hello< / b>”将成为“hello”)。 所以我决定使用这样的HTML5 drop事件:
dropHandler = function(e) {
text = e.dataTransfer.getData('text');
if (document.caretRangeFromPoint)
{
range = document.caretRangeFromPoint(e.clientX, e.clientY);
}
else if (document.createRange && oe.rangeParent)
{
range = document.createRange();
range.setStart(oe.rangeParent, oe.rangeOffset);
}
range.insertNode(document.createTextNode(text));
return false;
};
它工作并将“已清理”(普通)文本放到正确的位置,但不删除源contenteditable div中最初选择的文本 - 因为使用“return false”阻止了默认行为 - 所以需要文本移动变为文本副本。如何在预处理删除的文本的同时实现默认文本移动行为?
答案 0 :(得分:0)
使用Selection API(IE< = 8除外,它不支持它):
dropHandler = function(e) {
text = e.dataTransfer.getData('text');
if (document.caretRangeFromPoint)
{
range = document.caretRangeFromPoint(e.clientX, e.clientY);
}
else if (document.createRange && oe.rangeParent)
{
range = document.createRange();
range.setStart(oe.rangeParent, oe.rangeOffset);
}
// Keep a reference to the text node so we can select it later
var textNode = document.createTextNode(text);
range.insertNode(textNode);
var sel = window.getSelection();
sel.deleteFromDocument();
range.selectNodeContents(textNode);
sel.removeAllRanges();
sel.addRange(range);
return false;
};