У меня есть браузерный WYSIWYG-редактор, в котором пользователи могут редактировать документы-шаблоны.
Шаблон документа представляет собой обычный html с некоторыми специальными «заполнителями кода слияния». Такой шаблон «создается» путем замены этих заполнителей данными, поступающими из БД. Это дает окончательный документ - экземпляр шаблона.
Мой текущий подход выглядит следующим образом:
<div contenteditable>
Sample template with <input type=button class="mergecode" value="MergeCode1">.
</div>
(Онлайн-пример для игры: http://jsfiddle.net/tFBKN/)
В таком случае ввод не редактируется и ведет себя как сплошной блок - именно то, что мне нужно. Пользователи могут удалять такие коды слияния, нажимая DEL или BACKSPACE в качестве любых других символов и т. д. Имея надлежащий CSS для такого input.mergecode, я могу добиться желаемого внешнего вида.
Но с таким подходом у меня есть три разные проблемы в трех разных UA:
- IE - CSS
{ font:inherit }
там просто не работает, поэтому если ввод находится внутри<b>
как здесь<b><input value="test"></b>
он не наследует никакие стили шрифтов. - FF — копия фрагмента, содержащего элемент
<input>
, удаляет этот ввод из содержимого буфера обмена, поэтому дальнейшая операция вставки вставляет все, кроме вводов. - GC — Нажмите {BACKSPACE} сразу после того, как
<input>
выдаст странные результаты (ошибка)
Поэтому я ищу другие идеи о том, как представить нередактируемый встроенный блок, похожий на «острова» в HTML.
Другой подход, который я пробовал до сих пор:
<span contenteditable="false">MergeCode1</span>
- не работает, так как большинство ПА убирают такой узел из выбора. Таким образом, невозможно, скажем, применить<b>
или<i>
поверх выделения, содержащего такой диапазон.
Любые другие идеи?
contenteditable
влияет на все дочерние элементы. Вы можете использовать JS для замены в случае удаления. - person Mooseman   schedule 31.01.2013contenteditable
можно переопределить для дочерних элементов, как в примере<span contenteditable="false">MergeCode1</span>
. Как объясняется в вопросе, этот естественный подход, однако, плохо работает с выборками (например, тройной щелчок не выделяет весь блок). - person Jukka K. Korpela   schedule 31.01.2013<div style="background:#000; color:#FFF" contenteditable=true> Hello, world! <span contenteditable="false" style="font-weight:bold">Unedtiable</span> Hello, world! </div>
Как видите, span все еще можно удалить. Текст «Нередактируемый» нельзя редактировать, но пользователь может удалить<span>
целиком целиком. Инструменты разработчика Chrome показывают, что весь блок был удален из DOM. - person Mooseman   schedule 31.01.2013<b>
поверх такого острова. Попробуйте следующее: jsfiddle.net/RYsvZ/1, выделите текст с MergeCode1 внутри и нажмите CTRL- Я например. Вы увидите текст, выделенный курсивом, но не MergeCode1. Используйте инспектор DOM, чтобы увидеть проблему. - person c-smile   schedule 31.01.2013<b>
. Я не нашел никакой спецификации, относящейся к поведению дочерних элементов, за исключением того, что значение по умолчанию —inherit
. Описанное вами поведение, которое я вижу в Chrome, где<span>
не выделено курсивом или жирным шрифтом, кажется мне правильным.contenteditable
относится к изменению текста, а также к форматированию. JS мог бы помочь здесь, но я предполагаю, что вы не хотите идти туда сейчас. - person Mooseman   schedule 31.01.2013<b>
. Chrome предотвращает это по неизвестным причинам. - person c-smile   schedule 31.01.2013