У меня есть редактор WYSIWYG на основе браузера, где пользователи могут редактировать документы-шаблоны.
Документ-шаблон - это обычный html с некоторыми специальными "заполнителями кода слияния". Такой шаблон получает "экземпляр", заменяя эти заполнители данными, поступающими из БД. Это дает окончательный документ - экземпляр шаблона.
Мой текущий подход выглядит следующим образом:
<div contenteditable>
Sample template with <input type=button class="mergecode" value="MergeCode1">.
</div>
(Онлайн-образец для игры: http://jsfiddle.net/tFBKN/)
В этом случае вход не редактируется и ведет себя как сплошной блок - именно то, что мне нужно. Пользователи могут удалять такие коды слияния, нажав DEL или BACKSPACE, как любые другие символы и т.д. Имея надлежащий CSS для такого ввода .mergecode, я могу добиться желаемого внешнего вида.
Но при таком подходе у меня три разные проблемы в трех разных UA:
- IE - CSS
{ font:inherit }
просто не работает, поэтому, если вход внутри<b>
, как здесь,<b><input value="test"></b>
, он не наследует стилей шрифта. - FF - Копия фрагмента, содержащего элемент
<input>
, удаляет этот вход из содержимого буфера обмена, поэтому дополнительная операция вставки вставляет все, кроме входных данных. - GC - нажмите {BACKSPACE} сразу после того, как
<input>
произведет странные результаты (bug)
Итак, я ищу другие идеи о том, как представлять не редактируемые встроенные блоки как "острова" в HTML.
Другой подход, который я пробовал до сих пор:
-
<span contenteditable="false">MergeCode1</span>
- он не работает, так как большинство UA удаляют из node. Поэтому нельзя, скажем, применить<b>
или<i>
к вершине выделения, содержащего такой диапазон.
Любые другие идеи?