将HTML转换为contentEditable中的纯文本

Ale*_*lex 17 html javascript jquery text contenteditable

我有一个contentEditable,我on('paste')通过捕捉事件剥离粘贴内容的格式.然后我关注textarea,将内容粘贴到那里,然后复制值.几乎是这里的答案.问题是我不能这样做:

$("#paste-output").text($("#area").val());
Run Code Online (Sandbox Code Playgroud)

因为这会用粘贴的文本替换我的整个内容.所以我需要将内容粘贴到插入位置.我整理了一个脚本来做到这一点:

pasteHtmlAtCaret($("#area").val());

// pastes CTRL+V content at caret position
function pasteHtmlAtCaret(html) {
  var sel, range;
  if (window.getSelection) {
    sel = window.getSelection();
    if (sel.getRangeAt && sel.rangeCount) {
      range = sel.getRangeAt(0);
      range.deleteContents();
      var el = document.createElement("div");
      el.innerHTML = html;
      var frag = document.createDocumentFragment(), node, lastNode;
      while ((node = el.firstChild)) {
        lastNode = frag.appendChild(node);
      }
      range.insertNode(frag);

      if (lastNode) {
        range = range.cloneRange();
        range.setStartAfter(lastNode);
        range.collapse(true);
        sel.removeAllRanges();
        sel.addRange(range);
      }
    }
  } else if (document.selection && document.selection.type != "Control") {
    document.selection.createRange().pasteHTML(html);
  }
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是它使用html变量在插入位置粘贴HTML内容.我怎样才能将其转换为纯文本?我试着将jQuery添加.text(html)到变量而没有运气.这样的事情可能会有所帮助:

el.textContent||el.innerText;
Run Code Online (Sandbox Code Playgroud)

任何想法或更好的解决方案?谢谢!


编辑: 感谢下面的答案我修改了我的代码并解决了问题.我基本上把价值复制textarea成了一个div只抓住它的.text():

// on paste, strip clipboard from HTML tags if any
$('#post_title, #post_content').on("paste", function() {
    var text = $('<div>').html($("#area").val()).text();
    pasteHtmlAtCaret(text);
  }, 20);
});
Run Code Online (Sandbox Code Playgroud)

She*_*bic 10

  1. 创建一个外部div,
  2. 把你的HTML放在那个div中,
  3. 复制该div中的文本
  4. 将其插入光标位置.

  • 那是对的.使用jquery:`$('<div>').html(htmlSnippet).text()` (2认同)
  • 这很奇怪。当您可以使用相同的 contenteditable div 执行相同操作并使用清理后的内容重新填充它时,为什么要这样做呢?**并且**在任何情况下,未经清理的内容都会短暂闪烁。 (2认同)

Ale*_*lex 3

应乔纳森·霍布斯的要求,我将其作为答案发布。感谢上面的答案,我修改了代码并解决了问题。我基本上将 textarea 的值复制到 div 中并仅获取其 .text():

// on paste, strip clipboard from HTML tags if any
$('#post_title, #post_content').on("paste", function() {
  setTimeout(function(){
    var text = $('<div>').html($("#area").val()).text();
    pasteHtmlAtCaret(text);
  }, 20);
});
Run Code Online (Sandbox Code Playgroud)

  • 您的示例代码似乎被错误地复制粘贴了。需要一个 `setTimeout` 来让内容实际位于该 div 中(这很愚蠢,但确实如此),在您的代码中,我们可以看到有一个 `20` 但不包括超时,因此代码会导致错误,直到修复为止。 (4认同)