Удалить форматирование из contentEditable div

У меня есть contentEditable Div, и я хочу удалить любое форматирование, особенно для копирования и вставки текста.

Ответы

Ответ 1

Вы пытались использовать innerText?

ДОБАВЛЕНО:

Если вы хотите удалить разметку из содержимого, вставленного в редактируемый div, попробуйте старый способ создания временного div - см. Пример ниже.

<!DOCTYPE html>
<html>

<head> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  <title>Strip editable div markup</title>

  <script type="text/javascript">
    function strip(html) {
      var tempDiv = document.createElement("DIV");
      tempDiv.innerHTML = html;
      return tempDiv.innerText;
    }
  </script>
</head>

<body>
  <div id="editableDiv" contentEditable="true"></div>
  <input type="button" value="press" onclick="alert(strip(document.getElementById('editableDiv').innerText));" />
</body>

</html>

Ответ 2

document.querySelector('div[contenteditable="true"]').addEventListener("paste", function(e) {
        e.preventDefault();
        var text = e.clipboardData.getData("text/plain");
        document.execCommand("insertHTML", false, text);
    });

Это просто: добавьте слушателя к событию "вставить" и переформатируйте содержимое буфера обмена.

Вот еще один пример для всех контейнеров в теле:

[].forEach.call(document.querySelectorAll('div[contenteditable="true"]'), function (el) {
    el.addEventListener('paste', function(e) {
        e.preventDefault();
        var text = e.clipboardData.getData("text/plain");
        document.execCommand("insertHTML", false, text);
    }, false);
});

Saludos.

Ответ 3

Искал ответ на это целую вечность и заканчивал тем, что написал мой собственный.

Я надеюсь, что это помогает другим. На момент написания этого он работает в ie9, последней версии Chrome и Firefox.

<div contenteditable="true" onpaste="OnPaste_StripFormatting(this, event);" />

<script type="text/javascript">

    var _onPaste_StripFormatting_IEPaste = false;

    function OnPaste_StripFormatting(elem, e) {

        if (e.originalEvent && e.originalEvent.clipboardData && e.originalEvent.clipboardData.getData) {
            e.preventDefault();
            var text = e.originalEvent.clipboardData.getData('text/plain');
            window.document.execCommand('insertText', false, text);
        }
        else if (e.clipboardData && e.clipboardData.getData) {
            e.preventDefault();
            var text = e.clipboardData.getData('text/plain');
            window.document.execCommand('insertText', false, text);
        }
        else if (window.clipboardData && window.clipboardData.getData) {
            // Stop stack overflow
            if (!_onPaste_StripFormatting_IEPaste) {
                _onPaste_StripFormatting_IEPaste = true;
                e.preventDefault();
                window.document.execCommand('ms-pasteTextOnly', false);
            }
            _onPaste_StripFormatting_IEPaste = false;
        }

    }

</script>

Ответ 4

Я знаю, что это было некоторое время, но у меня была та же проблема. На мой случай, это приложение GWT, чтобы сделать его еще хуже. Так или иначе, решена проблема с:

var clearText = event.clipboardData.getData('text/plain');
document.execCommand('inserttext', false, clearText);

Смотрите: https://jsfiddle.net/erikwoods/Ee3yC/

Я предпочел команду "inserttext" вместо "insertHTML", потому что в документации сказано, что именно для вставки простого текста, поэтому кажется более подходящим. См. Https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand.

Ответ 5

С помощью JQuery вы можете использовать метод . text(), поэтому при размытии, например, вы можете заменить контент текстовым контентом

$("#element").blur(function(e) {
    $(this).html($(this).text());
});

Ответ 7

Я хочу добавить решение этой проблемы:

ContentEditableElement.addEventListener('input', function(ev) {
  if(ev.target.innerHTML != ev.target.textContent) {

    // determine position of the text caret
    var caretPos = 0,
      sel, range;
    sel = window.getSelection();
    if (sel.rangeCount) {
      range = sel.getRangeAt(0);
      var children = ev.target.childNodes;
      var keepLooping = true;
      for(let i = 0; keepLooping; i++) {
        if(children[i] == range.commonAncestorContainer || children[i] == range.commonAncestorContainer.parentNode) {
          caretPos += range.endOffset;
          keepLooping = false;
        } else {
          caretPos += children[i].textContent.length;
        }
      }

      // set the element innerHTML to its textContent
      ev.target.innerHTML = ev.target.textContent;

      // put the caret where it was before
      range = document.createRange();
      range.setStart(ev.target.childNodes[0], caretPos);
      range.collapse(true);
      sel.removeAllRanges();
      sel.addRange(range);
    }
  }
});

(это несовместимо со старыми версиями IE)

Ответ 8

<p spellcheck="false" contentEditable onkeydown="return false">text</p>