Я кодирую монитор MELT (бесплатное программное обеспечение, альфа-этап, связанный с GCC MELT для определения GCC). Он использует libonion, чтобы вести себя как специализированный веб-сервер, и я хочу, чтобы он стал синтаксическим ориентированным редактором некоторых DSL, которые я разрабатываю, Я говорю о фиксации 97d60053, если это имеет значение. Вы можете запустить его как ./monimelt -Dweb,run -W localhost.localdomain:8086
, затем откройте http://localhost.localdomain:8086/microedit.html в своем браузере.
Я испускаю (через файл webroot/microedit.html
)
<h1>Micro Editing Monimelt</h1>
<div id='microedit_id' contenteditable='true'>*</div>
<hr/>
то некоторые обманщики AJAX заполняют этот элемент #micredit_id
чем-то содержимым, похожим на:
<dd class='statval_cl' data-forattr='notice'> ▵
<span class='momnode_cl'>*<span class='momconn_cl'>
<span class='momitemref_cl'>comment</span></span>
(“<span class='momstring_cl'>some simple notice</span>”
<span class='momnode_cl'>*<span class='momconn_cl'>
<span class='momitemref_cl'>web_state</span></span>
(<span class='momnumber_cl'>2</span>)</span>
<span class='momitemval_cl'>hashset</span>
<span class='momset_cl'>{<span class='momitemref_cl'>microedit</span>
<span class='momitemref_cl'>the_agenda</span>}</span>
<span class='momtuple_cl'>[<span class='momitemref_cl'>web_session</span>
<span class='momitemref_cl empty_cl'>~</span>
<span class='momitemref_cl'>the_system</span>]</span>)</span> ;</dd>
Теперь я хочу, чтобы каждый <span>
класса momitemref_cl
был чувствителен к некоторым событиям клавиатуры (и, возможно, мыши). Тем не менее, элементы contenteditable
могут редактироваться многими действиями пользователя (я даже не понимаю, что такое весь список таких действий пользователя...) и Я хочу, чтобы эти элементы span реагировали на ограниченный набор нажатий клавиш (буквенно-цифровой и пространственный) и не может быть изменен пользователем в противном случае (например, никакие знаки пунктуации, нет "вырезать", "вставить", нет backspace, no tab и т.д.).
Есть ли полный список событий (или действий пользователя), которые элемент contenteditable='true'
может получить и реагирует на?
Как отключить большинство этих событий или действий пользователя (на клавиатуре и мыши) и реагировать только на некоторые (четко определенные) события клавиатуры?
По-видимому, элемент <span>
в элементе non contenteditable
не может получить никакого действия пользователя клавиатуры (потому что он не может получить фокус)...
Я занимаюсь только недавними браузерами HTML5, такими как Firefox 38 или 42, или Chrome 47 и т.д. на Debian/Linux/x86-64, если это имеет значение (поэтому мне действительно не важно IE9)
PS. this является связанным вопросом, но не тем же.
PS2: Найден почему contenteditable
является ужасной страницей блога. Заставляет меня почти плакать... Также читал о подделке редактируемого элемента управления в браузере Javascript (для CodeMirror). См. Также проект внутреннего документа W3C на Редактирование объяснения и редактировать события черновик. Обе вещи W3C работают в процессе. W3C TR на События пользовательского интерфейса по-прежнему (ноябрь 2015) рабочий проект. См. Также http://jsfiddle.net/8j6jea6p/ (который ведет себя по-разному в Chrome 46 и в Firefox 42 или 43 beta)
PS3: возможно, a contenteditable
- это, в конце концов, плохая идея. Я (к сожалению) рассматриваю использование canvas
(à la carota) и делает все редактирование и рисование рукописным javascript...
Приложения:
(26 ноября th 2015)
Обсуждая конфиденциально с некоторыми пользователями Mozilla, я понял, что:
-
contenteditable
является беспорядочным (поэтому я скорее избегаю его) и больше не работает в Firefox (например, даже недавняя бета-версия Firefox не знает оcontenteditable='events'
, см.nsGenericHTMLElement.h
файл) -
событие пузыря и захват событий имеет большое значение
-
нормальный
<div>
(или<span>
) можно сделать фокусируемым, предоставив ему свойствоtabindex
-
выбор текста API может быть полезен (но имеет несколько последних ошибки)
Поэтому мне, вероятно, не нужно contenteditable