Можно ли отключить или контролировать "команды" в contentEditable элементах?

Как я понимаю, элемент с contentEditable="true" является своего рода редактором HTML WYSIWYG. Он генерирует соответствующие теги HTML, соответствующие выданной команде.

Например, если вы выбираете текст и затем нажимаете Ctrl + B, выделенный текст помещается между тегами <b></b>.

Мне нужно, чтобы в полученном тексте не было тегов стиля. Как можно подавить, захватить или контролировать поведение этих команд?

Другие вещи, которые я мог сделать:

  • Отфильтровать теги после факта; но тогда пользователь подумает, что они поместили вещи жирным, если у них действительно нет
  • Повторите стиль тегов, чтобы они не отображались, а затем отфильтровывали их; но есть шанс, что я могу его забыть, или что-то, что таблица стилей отключена.
  • Вместо contentEditable использовать contentEditable вместо textarea. Но между прочим, contentEditable позволяет легко выделить абзац, который редактируется. Это гораздо труднее сделать с textarea.

Ответы

Ответ 1

Вероятно, лучший ресурс целевой страницы для contentEditable находится здесь:

http://blog.whatwg.org/the-road-to-html-5-contenteditable

В основном, это сводится к следующему: вы не можете переконфигурировать сами коды ключей - они всегда существуют, и они различаются в зависимости от локализации браузеров.

Однако вы можете перехватывать команды клавиатуры с помощью JavaScript, пример которой можно увидеть здесь:

http://www.openjs.com/scripts/events/keyboard_shortcuts/shortcut.js

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

Ответ 2

Я знаю, что уже слишком поздно, но если это может помочь кому-то, стоит попробовать.

Вот как я обработал его в javascript, чтобы отключить ctrl + Command (ctrl + B, ctrl + Any Key), я использовал:

HTML:

<div id="xyz" onKeyDown="return disable(this,event);" contentEditable="true">
This is my Rich Text Editor
</div>

JavaScript:

function disable(x,e){
    if(e.ctrlKey){ // .ctrlKey tells that ctrl key was pressed.
    return false;
    }
return true;
}

DEMO


Но это также повлияет на способ копирования по-умолчанию по умолчанию ctrl + C и ctrl + V. Если вы хотите сохранить все функциональные возможности по умолчанию, за исключением особых случаев, таких как: ctrl + B (Полужирный), ctrl + i (курсив) и ctrl + u (Подчеркивание), то лучше использовать switch case statements на keyCode значениях, например:
function disable(x,e){
   var ret=true;
    if(e.ctrlKey){
        switch(e.keyCode){
            case 66: //ctrl+B or ctrl+b
            case 98: ret=false;
                     break;
            case 73: //ctrl+I or ctrl+i
            case 105: ret=false;
                      break;
            case 85: //ctrl+U or ctrl+u
            case 117: ret=false;
                      break;
        }
    }
    return ret;
} // This will work fine for ctrl+c and ctrl+v.

DEMO


Теперь это будет отлично работать для стандартных функций копирования и вставки, но ограничит других, например, полужирным, курсивом и подчеркиванием.


ИЗМЕНИТЬ

Как Betty_St Рекомендуемые, Чтобы выполнить эту работу на Mac Вам необходимо заменить:

if(e.ctrlKey){

с

if(e.ctrlKey || e.metaKey){ // Coz You'll be using CMD key on mac

Тогда это может работать на Mac OS.

Примечание. Я ранее не занимался Mac, поэтому я не знаю, правильно ли это делается или нет.


Надеюсь, поможет:). Приветствия.

Ответ 3

Вместо того, чтобы пытаться подавить нежелательные теги с помощью JavaScript, я просто отменяю их и сохраняю/восстанавливаю текст без текста в области контента:

[contenteditable] {
  background: #eee;
  width: 15rem;
  height: 4rem;
  padding: 1em;
}

[contenteditable] b {
  font-weight: normal;
}
    
[contenteditable] i {
  font-style: normal;
}
<div contenteditable></div>

Ответ 4

В React мы используем следующий код, чтобы отключить все, кроме команд копирования/вставки и перемещения:

const onKeyDown = (e) =>
  e.ctrlKey || e.metaKey
  && !['c', 'v', 'ArrowLeft', 'ArrowRight'].includes(e.key)
  && e.preventDefault()

const App = props => (
  <div
    contentEditable
    suppressContentEditableWarning
    
    onKeyDown={onKeyDown}    
  >
    12345
  </div>
)

ReactDOM.render(
  <App />,
  document.getElementById('react')
)
<div id="react"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>