Удалить форматирование из 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());
});
Ответ 6
Вы не можете получить доступ к системному буферу, так что вам понадобится взломать. См. Этот вопрос: JavaScript получает данные буфера обмена при вставке (кросс-браузер)
Ответ 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>