У меня есть базовый редактор, основанный на execCommand
представленном здесь образце. Есть три способа вставить текст в execCommand
область:
- Ctrl+V
- Щелкните правой кнопкой мыши -> Вставить
- Щелкните правой кнопкой мыши -> Вставить как обычный текст
Я хочу разрешить вставку только простого текста без разметки HTML. Как я могу заставить первые два действия вставить обычный текст?
Возможное решение: я могу придумать, как установить прослушиватель событий нажатия клавиш для ( Ctrl+ V) и удалить HTML-теги перед вставкой.
- Это лучшее решение?
- Является ли это пуленепробиваемым, чтобы избежать разметки HTML при вставке?
- Как добавить слушателя в Right Click -> Paste?
javascript
html
dom-events
execcommand
Googlebot
источник
источник
Ответы:
Он перехватит
paste
событие, отменитpaste
и вручную вставит текстовое представление буфера обмена:http://jsfiddle.net/HBEzc/ . Это должно быть самым надежным:
Однако я не уверен в поддержке кроссбраузерности.
источник
text
содержит HTML (например, если вы скопируете HTML-код как обычный текст), он фактически вставит его как HTML. Вот решение, но не очень красивое: jsfiddle.net/HBEzc/3 .var text = (event.originalEvent || event).clipboardData.getData('text/plain');
обеспечивает немного большую кроссбраузерность<div></div>
это содержимое будет добавлено как дочерний элемент contenteditable элемента. Я исправил это так:document.execCommand("insertText", false, text);
insertHTML
иinsertText
не работаю в IE11, ноdocument.execCommand('paste', false, text);
работает нормально. Хотя в других браузерах это не работает> _>.Мне не удалось получить здесь принятый ответ для работы в IE, поэтому я немного поинтересовался и пришел к этому ответу, который работает в IE11 и последних версиях Chrome и Firefox.
источник
Близкое решение как pimvdb. Но он работает с FF, Chrome и IE 9:
источник
content
назначение переменных короткого замыкания . Я обнаружил, что использованиеgetData('Text')
кроссбраузерности работает, поэтому вы можете сделать это назначение только один раз следующим образом:var content = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text');
тогда вам нужно будет использовать только логику для кроссбраузерной команды вставки / вставки.document.selection.createRange().pasteHTML(content)
... только что протестировал на IE11, и он так не работает.document.execCommand('insertText', false, content)
не работает с IE11 и Edge. Кроме того, теперь поддерживаются последние версии Chrome, что сталоdocument.execCommand('paste', false, content)
проще. Они могут устаретьinsertText
.Конечно, на вопрос уже дан ответ, и тема очень старая, но я хочу предоставить свое решение, поскольку оно простое:
Это внутри моего события paste на моем contenteditable-div.
Другая часть взята из другого SO-сообщения, которое я больше не мог найти ...
ОБНОВЛЕНИЕ 19.11.2014: Другой SO-пост
источник
Ни один из опубликованных ответов, похоже, не работает в кросс-браузере, или решение слишком сложное:
insertText
не поддерживается IEpaste
команды приводит к ошибке переполнения стека в IE11У меня сработало (IE11, Edge, Chrome и FF) следующее:
Обратите внимание, что пользовательский обработчик вставки необходим / работает только для
contenteditable
узлов. Поскольку оба поляtextarea
и простыеinput
поля вообще не поддерживают вставку HTML-содержимого, здесь ничего делать не нужно.источник
.originalEvent
обработчика событий (строка 3), чтобы это работало. Таким образом, полная линия выглядит следующим образом :const text = ev.clipboardData ? ev.clipboardData.getData('text/plain') : window.clipboardData.getData('Text');
. Работает в последних версиях Chrome, Safari, Firefox.Firefox не позволяет вам получить доступ к данным буфера обмена, поэтому вам нужно будет сделать «взлом», чтобы заставить его работать. Мне не удалось найти полное решение, однако вы можете исправить это для вставок ctrl + v, создав текстовое поле и вставив вместо этого:
источник
Я также работал над простой текстовой вставкой, и я начал ненавидеть все ошибки execCommand и getData, поэтому я решил сделать это классическим способом, и он работает как шарм:
Код с моими обозначениями можно найти здесь: http://www.albertmartin.de/blog/code.php/20/plain-text-paste-with-javascript
источник
Приведенный выше код работает для меня в IE10 и IE11, а теперь также работает в Chrome и Safari. Не тестировалось в Firefox.
источник
В IE11 execCommand не работает. Я использую приведенный ниже код для IE11
<div class="wmd-input" id="wmd-input-md" contenteditable=true>
- это мой блок div.Я читаю данные буфера обмена из window.clipboardData и изменяю текстовое содержимое div и ставлю курсор.
Я даю тайм-аут для установки каретки, потому что, если я не устанавливаю тайм-аут, каретка переходит в конец div.
и вы должны прочитать clipboardData в IE11 следующим образом. Если вы этого не сделаете, символ новой строки не будет обрабатываться должным образом, поэтому каретка идет не так.
Проверено на IE11 и Chrome. Может не работать в IE9
источник
После долгих поисков и попыток я нашел какое-то оптимальное решение
источник
Хорошо, поскольку все пытаются работать с данными буфера обмена, проверяя событие нажатия клавиши и используя execCommand.
Я думал об этом
КОД
источник