热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【原创】【1】richeditor系列教程。前期准备,兼容

【1】前期准备,兼容索引目录:http:www.cnblogs.comhenrylip3439642.htmlricheditor的原理无非是启用iframe的编辑

【1】前期准备,兼容

  

  索引目录:http://www.cnblogs.com/henryli/p/3439642.html

  

  rich editor的原理无非是启用iframe的编辑模式或者div的cOntenteditable=true。然后使用document.execcommand来编辑选取文本。但会使用到selection操作和range。

查看api: msdn地址,mozilla富文本编辑指引。w3school range。

  使用iframe作为编辑器的优势:独立的编辑document、不会与页面其他选择冲突,独立的redo undo操作。缺点,如果页面设置了document.domain,而编辑模式中的js无法执行,会造成权限错误,有加载失败的可能。

  使用div作为编辑器,轻量、加载不会失败、效率提升。但不适用于重量级、多功能文本处理,同时selection、range、undo的与页面元素共有。

  ie使用了跟w3c不一样的api,返回的结果类似,不兼容。

  创建range对象:

      

1 var selection = ifrDoc.createRange ? ifrDoc.createRange() : ifrWin.getSelection();
2 var range = selection.createRange ? selection.createRange() : selection.getRangeAt(0)

   

  编辑器的基本原理不做叙述,这方面的博文很多,google一下即可

  

  同样,不同的浏览器对于回车按键的处理也不一致,ie浏览器会产生一个成对儿的

标签,chrome为
,firefox根据版本为p或者br。

  如何解决这个问题?将所有的换行设置为段落,或者设置为br

    firefox,使用命令insertBrOnReturn命令,最后参数为true,会产生br,为false则产生p标签

document.execCommand("insertBrOnReturn",false,'true');

    ie,默认的,产生成对的段落p标签(chrome为div标签,but,如果chrome中编辑器默认的元素为

,那么我大chrome则智能的把换行段落tag设置成了

) , 搜噶。。。统一为段落的p标签,就是这么easy。(firefix设置:document.execCommand("insertBrOnReturn",false,'false');ie是默认,chrome设置初始p tag)

    ps: 编辑器默认必须有html,ie可以为空,其他浏览器至少要有br元素,否则会出现focus无光标的问题。同样,如果用户设置了初始html,同时换行为段落P的tag,那么此时就需要给html内容套上一个p容器。同样,保证p标签内部不允许有p元素,如果有,则要产生新的段落,这部分,可以封装在一个 empty() 的方法。

1 //当换行为br
2 editor.innerHTML = Util.msie ? '' : '
';
3 //当换行为段落
4 editor.innerHTML = '

' + (Util.msie ? '' : '
') + '

';

  

多数情况,设置为p标签,是最符合文章的编辑,毕竟,enter换行产生新的段落是那么的“语义”,哈哈。   但总有需要,换行需要设置为br。那么问题来了。firefox可以使用编辑器命令设置为br,其他浏览器,需要绑定事件,在按下回车的时候,删除当前选区的内容,插入一个
 的代码,同时设置光标选中空格,删除它,因为插入空格再文档末尾不可用。

代码:

if (e.keyCode == 13 && self._bindEnter == true) {
e.preventDefault
? e.preventDefault() : e.returnValue = false;
//如果insertHTML命令失败,手动添加br
var range = self.getRange().range;
self.insertHTML(range.pasteHTML
? '
' : '
 ');//不添加空格,在末尾无法有时候无法执行br
if (!range.pasteHTML) {
//chrome\ie9\ie19
var rangeData = self.getRange();
var range = rangeData.range;
range.setStart(range.startContainer, range.startOffset
- 1);
var _selection = self.getRange().selection;
_selection.removeAllRanges();
_selection.addRange(range);
document.execCommand(
"Delete", false, null);

}
}

 

 

   

  为了方便,会添加个insertHTML的方法,插入br、tab占位等,低版本的ie浏览器,直接使用range.pasteHTML即可,反之使用execCommand的insertHTML,如果命令失败,调用range.createContextualFragment,创建文档片段,range.insertNode,插入字符串html,最终再设置位置、添加到selection中,

发现bug,ie9移除了低版本的pasteHTML,但又未支持w3c的createContextualFragment方法,只好使用createDocumentFragment方法来创建文档碎片。

代码:

 1 execCommand: function(type, value) {
2 var result;
3 try {
4 //当ie调用无法执行的命令会报错
5 result = this.ifrDoc.execCommand(type, false, value);
6 } catch (e) {
7 }
8 this._console('execCommand', type, value, 'result:' + (result ? 'ok' : 'false'));
9 return result;
10 },
11 insertHTML: function(html, fn) {
12 var self = this;
13 if (!self.execCommand("insertHTML", html)) {
14 //ie不支持insertHTML
15 var rangeData = self.getRange();
16 var range = rangeData.range;
17 if (document.selection && range.pasteHTML) {
18 range.pasteHTML(html);//早期ie的方法
19 range.collapse(false);
20 } else {
21 range.deleteContents();//删除选择的内容.
22 //#bug ie9去除了pasteHTML,却没有createContextualFragment方法,ie10已添加
23 var rangeNode;
24 if (range.createContextualFragment) {
25 rangeNode = range.createContextualFragment(html)
26 } else {
27 rangeNode = document.createDocumentFragment();
28 var div = document.createElement("div");
29 rangeNode.appendChild(div);
30 div.outerHTML = html;
31 div = null;
32 }
33 range.insertNode(rangeNode);
34 range.collapse(false);
35 }
36
37 }
38 }
View Code

 

最后奉上demo,虽然是rich editor教程,但第一篇是不包含任何针对文字的格式设置的编辑器,我们是在做准备工作,哼哼。阅读api是少不了滴. 同样添加了n多工具方法。

点我下载demo

update @2013-11-27 12:55:14

BY henry

mail : liyaohui.henry@gmail.com

 

 

  


推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 如何压缩网站页面以减少页面加载时间
    本文介绍了影响网站打开时间的两个因素,即网页加载速度和网站页面大小。重点讲解了如何通过压缩网站页面来减少页面加载时间。具体包括图片压缩、Javascript压缩、CSS压缩和HTML压缩等方法,并推荐了相应的压缩工具。此外,还提到了一款Google Chrome插件——网页加载速度分析工具Speed Tracer。 ... [详细]
  • python+selenium十:基于原生selenium的二次封装fromseleniumimportwebdriverfromselenium.webdriv ... [详细]
author-avatar
f永远喜爱捉迷藏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有