惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
C
Cyber Attacks, Cyber Crime and Cyber Security
G
GRAHAM CLULEY
T
Tenable Blog
T
Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
Intezer
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
Security Latest
Security Latest
P
Privacy & Cybersecurity Law Blog
Google Online Security Blog
Google Online Security Blog
SecWiki News
SecWiki News
P
Palo Alto Networks Blog
TaoSecurity Blog
TaoSecurity Blog
Webroot Blog
Webroot Blog
Spread Privacy
Spread Privacy
O
OpenAI News
The Last Watchdog
The Last Watchdog
P
Proofpoint News Feed
C
Check Point Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
人人都是产品经理
人人都是产品经理
S
Security @ Cisco Blogs
Scott Helme
Scott Helme
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
月光博客
月光博客
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
T
Troy Hunt's Blog
W
WeLiveSecurity
GbyAI
GbyAI
N
News | PayPal Newsroom
Y
Y Combinator Blog
C
Cisco Blogs
H
Help Net Security
The GitHub Blog
The GitHub Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 【当耐特】
Jina AI
Jina AI
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
云风的 BLOG
云风的 BLOG
小众软件
小众软件
N
News and Events Feed by Topic

博客园 - 良村

元数据驱动开发 - 面向对象编程思想的补充 用ANTLR实现表达式词法和语法分析器 我的开源项目分享-基于SharpBrowser二次开发的定制浏览器,过程中填坑无数 AI是什么 现阶段AI编程无法取代程序员 用zrender实现工作流图形化设计(附范例代码) 特殊字符
导致的Javascript脚本异常 不同寻常的浏览器请求无响应错误 进销存管理中对红冲处理的误区 进销存管理中负库存产生的原因以及对应措施 探讨对Web控件的异常处理 看了一篇不错的文章 - 使用 UTF-8 对 XML 文档进行编码 Ajax学习笔记(2) - 一定要用XML吗? Ajax 学习笔记(1) ASP.NET控件编写日记-当心“用过的控件”! ASP.NET控件编写心得总结- 以后会写详细一点 CodeDom.CodeArrayCreateExpression不能生成多维数组的创建表达式 用NAnt编译带有资源文件(*.resx,*.bmp,*.gif等)的C#项目 网址收藏 C#实现Singleton的两种方法的比较 发现Maxthon(myIE2)浏览器处理javascript脚本时的奇怪现象 - 良村 - 博客园 页面缓冲与Asp.Net的性能优化(设置Page.Buffer属性) 如何使用AdminScripts脚本创建虚拟目录 采用HttpModules来重写URLs(实践篇)
打造自己的Html文本编辑控件
良村 · 2008-12-14 · via 博客园 - 良村

为什么要重复发明轮子?

目前有很多开源的Html编辑器可以直接用,这些编辑器功能丰富,开发使用也很方便。但实际使用过程中只需要其中一小部分功能,或者需要扩展一些特殊功能,所以就下决心研究这些开源编辑器代码以便进行扩展。研究过程并不顺利,主要是本人的Javascript水平有限,虽说是开源但注释并不详细,介绍这方面原理的中文资料也很少,好不容易看懂之后觉得有必要自己写一个来加深理解,另外自己写一个的话在版权方面也可以减少一些不必要的麻烦。

本文结束时会给出源代码下载,代码都是本人亲自写的,没有版权上的麻烦,大家可以用于随意使用(包括商业用途)。经过测试,在FF、IE6、IE7中运行正常,不过事先声明可能存在bug,请谨慎使用且后果自负 :-)

HTML编辑器的构造

  1. 工具栏区
  2. Html编辑区
    内嵌的一个iframe,通过工具栏控制iframe中页面内容来实现编辑;
  3. 源码编辑区
    一般使用textarea来实现源码的查看和编辑,在切换时将Html编辑区的内容写入textarea或将textarea的内容写入到Html编辑区;

即见即所得编辑功能的关键

Html编辑器的关键就是要让Html编辑区的iframe中显示的页面具有编辑功能,这个代码比较简单:

var fdoc = this._getEditAreaFrame().document; // 获取iframe帧页面的document对象
document.designMode = "on"// 设置页面具有编辑功能
//
 为了兼容非IE浏览器,增加一句
if(!Prototype.Browser.IE) document.execCommand("useCSS"falsetrue);

引自richeditor.js文件第35行。

实现格式类命令

格式类命令,如:字体、字号、对齐、斜体、加粗、编号、缩进、背景前景色等。其实都是获取到Html编辑区iframe的document对象,调用document.execCommand()方法,传递不同的参数即可实现,具体调用参数请参考源代码,更多的用法请查阅各浏览器的开发文档。

richeditor.js文件第71行的format函数就是执行格式类命名的函数。

实现插入类命令

插入类命令,如:插入超链接、插入图片、插入表格等,主要分两种方式来实现。一种方式还是调用document.execCommand()方法,如插入超链接和插入图片。另一种方式是直接向当前光标位置插入一段Html代码,比如插入表格就是采用这种方式,通常对于比较复杂的插入都是采用这种方式。

直接插入Html代码到当前光标处的难点主要是当前光标位置的获取,在这个问题上IE比较容易解决,而非IE浏览器解决起来就麻烦一些,具体方法请查看richeditor.js文件第346行的_insertHTML()方法。

最后的几点补充

需要配合prototype.js框架库1.6.0.2使用。

源代码中使用的工具栏图标大都是在网上找的,如发现类似也不要奇怪,只有一个是自己画,样子较丑,估计大家很容易就能认出来。

源码下载 https://files.cnblogs.com/rrooyy/HtmlEditor.zip