Remove formatting from a contentEditable div

前端 未结 8 724
醉话见心
醉话见心 2020-12-25 11:40

I have a contentEditable Div and I want remove any formatting especially for copy and paste text.

相关标签:
8条回答
  • 2020-12-25 11:54

    You can't access the system clipboard so you'll need a hack. See this question: JavaScript get clipboard data on paste event (Cross browser)

    0 讨论(0)
  • 2020-12-25 12:00

    I know it's been a while, but I had the same problem. On my case, it's a GWT application to make it even worse. Anyway, resolved the problem with:

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

    See: https://jsfiddle.net/erikwoods/Ee3yC/

    I preferred "inserttext" command instead of "insertHTML", because the documentation says it's exactly to insert plain text, so seems more suitable. See https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand

    0 讨论(0)
  • 2020-12-25 12:00

    With Jquery you can use .text() method, so, when blur for example you can replace the content with the text content

    $("#element").blur(function(e) {
        $(this).html($(this).text());
    });
    
    0 讨论(0)
  • 2020-12-25 12:02

    Try <div id="editableDiv" contentEditable="plaintext-only"></div>

    0 讨论(0)
  • 2020-12-25 12:02

    I'd like to add my solution to this issue:

    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's 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);
        }
      }
    });
    

    (this isn't compatible with older versions of IE)

    0 讨论(0)
  • 2020-12-25 12:04

    Was looking for answer to this for ages and ended up writing my own.

    I hope this helps others. At the time of writing this it appears to work in ie9, latest chrome and 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>
    
    0 讨论(0)
提交回复
热议问题