Имам нещо като WYSIWYG редактор, базиран на браузър, където потребителите могат да редактират документи-шаблони.
Document-template е обикновен html с някои специални "заместители на код за сливане". Такъв шаблон се „инстанцира“ чрез заместване на тези контейнери с данни, идващи от DB. Това дава окончателен документ - екземпляр на шаблона.
Сегашният ми подход изглежда така:
<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>
- не работи, тъй като повечето UA премахват такъв възел от селекцията. Така че не е възможно, да речем, да приложите<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>
може да бъде премахнат цяло от потребителя. Инструментите за разработка на 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>
s. Не намерих никаква спецификация, свързана с поведението на дъщерните елементи, освен че по подразбиране еinherit
. Поведението, което описахте, което виждам в Chrome, където<span>
не е в курсив или удебелено, ми се струва правилно.contenteditable
се прилага за промяна на текст, но също и за форматиране. JS може да помогне тук, но предполагам, че не искате да отидете там сега. - person Mooseman   schedule 31.01.2013<b>
span. Chrome предотвратява това по неизвестни причини. - person c-smile   schedule 31.01.2013