How to protect an HTML element within designmode=on

2.7k Views Asked by At

I have an iFrame with designmode turned on. In the document I have several 'special' elements which can be pasted by the user through menu selections (custom characters/identifiers/descriptions used within the wider application that are fixed). I need to protect these html elements from modification and treat them as a single entity if the user chooses to select or delete them. An example iframe would look like this:

<iframe>
    <html dir="ltr">
        <head></head>
        <body class="editableDoc">
            <p>Here is a <span class="special readonly">SPECIAL</span> character</p>
        </body>
    </html>
</iframe>

Design mode enables editing of the whole body contents which is exactly as I need it.

What would be the best way to protect the 'readonly' span? The best description I can give is that I want the span and its contents to be treated as if it were a single character for all user text operations (i.e. moving the cursor, selecting, deleting). I have tried setting contenteditable="false" on the span element and this does have many of the desired effects, but it works badly in IE8/9 and has other, smaller issues in other browsers. Plus I'm not sure mixing designmode and contenteditable in the same solution is a good idea.

2

There are 2 best solutions below

0
On

Use the read-only value of the user-modify CSS property to protect a span in Firefox and Chrome:

<iframe src="about:blank" srcdoc="<body contenteditable><span style='-webkit-user-modify: read-only; -moz-user-modify: read-only;'>Hi</span></body>">
</iframe>
0
On

You can use contentEditable=false like so:

<body contenteditable>
    <p>Here is a <span contenteditable='false'>SPECIAL</span> character</p>
</body>

This works whether it's in an iframe or not. It works in Chrome and Firefox — likely works in recent IEs too, considering that it's not prefixed.

Demo at: http://codepen.io/bfred-it/pen/bGhaC

A similar question here: contenteditable=false inside contenteditable=true block is still editable in IE8