一、载体
1.document.designMode
document对象有个designMode属性,默认值为’off’,如果把它设置成’on’,HTML文档区域就会进入设计模式,我们可以编辑任意元素
例一:本页编辑
Javascript Code:
document.designMode = 'on';
内嵌Iframe:
按上面的按钮,再点其他区域你会发现我们可以在光标处随意增删文字了(IE除外)。
各浏览器的差异
- IE:出于安全考虑,不允许在主页面开启document的designMode
- Chrome,Safari(webkit):内嵌frame同样进入编辑模式
- FF,Opera:页面进入编辑模式,内嵌frame不开启编辑模式
一般来说我们也不会在主页面开启编辑模式,鉴于以上原因,富文本编辑器绝大多数用内嵌的Iframe作为载体。
例二:内嵌Iframe作为载体
Javascript Code:
frames['editorArea2'].document.designMode = 'on';
Demo:
2.contentEditable
W3C还提供了一个contentEditable属性,用于开启某一个标签的编辑模式,其值为true或false
例三:局部范围编辑
HTML Code:
<div contenteditable="true">可编辑区域</div>
Demo:
也可以用脚本动态加载
Javascript Code:
document.body.contentEditable = 'true';
此属性比document.designMode灵活,可以用于绝大多数标签,以下是支持这个属性的标签:
IE5.5+及Firefox等浏览器都支持这个标签属性,且不像document.designMode,IE允许本页面的body开启contentEditable
综上两种方法,还是建议采用动态生成的iframe作为编辑器的载体,这样可以保证主页面的完整性,局部区域的编辑可以用contentEditable属性控制
二、编辑器内部操作
1.execCommand
bSuccess = object.execCommand(sCommand [, bUserInterface] [, vValue])
更多请参阅: MSDN execCommand Method
更多命令符(Command Identifiers)请参阅: MSDN Command Identifiers
例四:灰常灰常简单的编辑器
HTML Code:
<iframe name="sampleEditor" frameborder="0" ><iframe>
Javascript Code:
frames["sampleEditor"].document.execCommand('Bold',false,null);frames["sampleEditor"].document.execCommand('BackColor',false,'#ff000');
Demo:
各浏览器差异
-
Bold
-
- IE、Opera:
Hello <STRONG>world</STRONG>
- Safari、Chrome:
Hello <b>world</b>
- FF:
Hello <span style="font-weight:bold;">world</span>
- IE、Opera:
默认情况下Firefox采用的方式和其他浏览器区别比较大,我们可以使用document.execCommand("styleWithCSS",false,false)方法强制Firefox使用标签结构代替样式。遗憾的是我们还是无法单纯使用execCommand让各浏览器达到同样的代码。这就是为什么主流富文本编辑器不采用execCommand的原因
2.range
更多请参阅PPK的 Introduction to Range 和 W3C DOM Compatibility – Range




写的很好,希望多写点关于range的介绍。
这篇文章对我的帮助很大。
PPK的关于Range的文章看过了。Mozila上的介绍很多:https://developer.mozilla.org/en/DOM/range
感觉很神奇,一直想自己写富文本编辑器,有点小明白了。
好东西,找了很久了
问一下document.designMode是不是w3c的标准
document的designMode属性早已成为w3c的标准,不过在兼容性和便利性方面contentEditable要更好些,html5中所有标签都要支持contentEditable属性
谢谢!
不过我在w3school没有找到designMode这个属性