HTML5拖动;删除文本:preventdefault vs move

时间:2013-04-05 07:49:44

标签: html5 drag-and-drop contenteditable

我有两个带有格式化内容的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”阻止了默认行为 - 所以需要文本移动变为文本副本。如何在预处理删除的文本的同时实现默认文本移动行为?

1 个答案:

答案 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;
};