Netscape DevEdge

Skip to: [content] [navigation]

Rich-Text Editing in Mozilla 1.3

Introduction

Mozilla 1.3 introduces an implementation of Microsoft ® Internet Explorer's designMode feature. The rich-text editing support in Mozilla 1.3 supports the designMode feature which turns HTML documents into rich-text editors.

Setting Up Rich-Text Editing

Rich-text editing is initialized by setting the designMode property of a document to "On", such as the document inside an iframe. Once designMode has been set to "On", the document becomes a rich-text editing area and the user can type into it as if it were a textarea. The most basic keyboard commands such as copy and paste are available, all others need to be implemented by the website.

Executing Commands

When an HTML document has been switched to designMode, the document object exposes the execCommand method which allows one to run commands to manipulate the contents of the editable region. Most commands affect the document's selection (bold, italics, etc), while others insert new elements (adding a link) or affect an entire line (indenting).

execCommand(String aCommandName, Boolean aShowDefaultUI, String aOptionalCommandArgument)
Arguments:
String aCommandName - the name of the command

Boolean aShowDefaultUI - whether the default user interface should be shown. This is not implemented in Mozilla.

String aOptionalCommandArgument - some commands (such as insertimage) require an extra argument (the image's url

Commands
bold

toggles the bold attribute of the selected text.

createlink

generates a link from the selected text. Requires the URI to be passed in as the optional argument.

delete

deletes the current selection.

fontname

changes the fontname of the selected text. Requires the name of font ("Arial" for example) to be passed in as the optional argument.

fontsize

changes the fontsize of the selected text. Requires the size to be passed in as the optional argument.

fontcolor

changes the fontcolor of the selected text. Requires the color to be passed in as the optional argument.

indent

indents the text block where the caret is located.

inserthorizontalrule

inserts an horizontal rule at the cursor's location.

insertimage

inserts an image at the cursor's location. Requires the url of the image to be passed in as the optional argument.

insertorderedlist

inserts an ordered list.

insertunorderedlist

inserts an unordered list.

italic

toggles italicize attribute of the selected text.

justifycenter

centers the current line.

justifyleft

justifies the current line to the left.

justifyright

justifies the current line to the right.

outdent

outdents the current line if it was indented before.

redo

redoes the previously undo command.

removeformat

removes all formatting from the current selection.

selectall

selects all of the content of the editable region.

strikethrough

toggles strikethrough attribute of the selected text.

subscript

converts the current selection to subscript.

superscript

converts the current selection to superscript.

underline

toggles underlining of the selected text.

undo

undoes the last executed command.

unlink

removes the link information from the current selection.

useCSS

toggles the use of css for the generated markup. Requires a boolean indicating if to turn CSS generation on or off as the optional argument.

Internet Explorer Differences

Mozilla does not support Internet Explorer's contentEditable attribute which allows any element to become editable. One major difference between Mozilla and Internet Explorer that affects designMode is the generated code in the editable document: while Internet Explorer uses HTML tags (em, i, etc), Mozilla 1.3 will generate by default spans with inline style rules. The useCSS command can be used to toggle between CSSand HTML markup creation.

Figure 1 : Generated HTML differences

Mozilla:
<span style="font-weight: bold;">I love geckos.</span>
<span style="font-weight: bold; font-style: italic; text-decoration: underline;">Dinosaurs are big.</span>

Internet Explorer:
<STRONG>I love geckos.</STRONG>
<STRONG><EM><U>Dinosaurs are big.</U></EM></STRONG>

Another difference between Mozilla and IE is how to access the document object of an iframe, which is usually used in conjunction with designMode. Mozilla uses the W3C standard way, namely IFrameElement.contentDocument, while IE requires IFrameElement.document.

DevEdge provides a JavaScript helper class, xbDesignMode, which is a wrapper for the designMode feature which hides the differences between IE and Mozilla.

Examples

Example 1

The first example is an HTML document setting its own designMode to "On". This makes the entire document editable in Mozilla 1.3. Internet Explorer, however, does not allow javascript to change the current document's designMode. For it to work in Internet Explorer, the contentEditable attribute of the body tag needs to be set to "true". The example can be found here.

Figure 2 : First example - View Example

HTML:
<body contentEditable="true" onload="load()">

JavaScript:
function load(){
  window.document.designMode = "On";
}

Example 2

The second example is a simple rich text editing page, where text can be bolded/italicized/underlined, new links can be added and the color of text changed. The example page consists of an iframe, which will be the rich editing area, as well as elements for basic editing commands such as bold/italics/text color. Also provided is a "view source" button that will display the generated code in the iframe's document. The example can be found here.

Once the HTML page has finished loading, the example switches the iframe's document to designMode.

Figure 3 : Setting up rich-text editing

HTML:
<body onload="load()">

JavaScript:
function load(){
  getIFrameDocument("editorWindow").designMode = "On";
}

function getIFrameDocument(aID){
  // if contentDocument exists, W3C compliant (Mozilla)
  if (document.getElementById(aID).contentDocument){
    return document.getElementById(aID).contentDocument;
  } else {
    // IE
    return document.frames[aID].document;
  }
}

The example contains a doRichEditCommand function that makes it easier to execute commands on the iframe's document and keeps the HTML code clean. The function executed the requested command using execCommand() and then sets focus back to the editable document, as clicking on a button will set focus on the button itself, which breaks the editing flow.

Figure 4 : Executing Rich Editing Commands

HTML:
<button onclick="doRichEditCommand('bold')" style="font-weight:bold;">B</button>

JavaScript:
function doRichEditCommand(aName, aArg){
  getIFrameDocument('editorWindow').execCommand(aName,false, aArg);
  document.getElementById('editorWindow').contentWindow.focus()
}

Resources

Bugs

Bug 209836 - designMode still active after clicking Back.

Problem

Once document.designMode has been set for the document object in a window, all documents in that window for that domain will remain editable.

Solution

Edit the document in a separate window or contained in an IFRAME.

A+R