SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Downloaden Sie, um offline zu lesen
KindEditor 设计思路

    2012. 7. 7
KindEditor Project




轻量级富文本编辑器
源码:http://github.com/kindsoft/kindeditor
Who is using?
设计理念
只包含最常用的功能
只包含最常用的功能
核心不基于第三方类库



 KindEditor 4.1.1 – 28.9KB

 jQuery 1.7.2 – 32.9KB



原因:其它类库不包含Range、Command
兼容性,稳定性


  连IE6都兼容的编辑器

  稳定压倒一切



单元测试,人肉测试,自动化测试
可定制,可扩展




定制风格,自定义插件、多语言
模块化,按需加载

点击


加载



执行
富文本编辑器结构


      样式系统            UI组件




• 样式系统:Bold, foreColor, Hyperlink, …
• UI组件:Dialog, Menu, Tabs, Button, …
文件、代码结构
目录结构
themes/
      default/
      …
plugins/
      image/
      …
lang/
      zh_CN.js
      …
src/
      core.js
      …
kindeditor-min.js
JS源文件
 •   header.js    1KB
 •   core.js      7KB
 •   event.js     9KB
 •   node.js      14KB
 •   range.js     22KB
 •   cmd.js       23KB
 •   edit.js      9KB
 •   toolbar.js   4KB
 •   menu.js      3KB
 •   dialog.js    5KB
 •   …
 •   main.js      42KB
 •   footer.js    1KB

执行ant,生成kindeditor-min.js
JS模块
•   Core – 基础
•   Event – 事件
•   Node – 处理Element,类似jQuery接口
•   Range – 范围,W3C标准
•   Command – 样式命令
•   Edit – 编辑框
•   Html – HTML格式化
•   Toolbar – 工具栏
•   Menu – 下拉菜单
•   Dialog – 弹出框
•   ColorPicker – 取色器
•   …
•   Main – 组装编辑器

一个模块一个文件,可单独调用
kindeditor.js代码结构

(function (window, undefined) {
  var K = function() {};
  K.range = function() {};
  K.cmd = function(){};
  K.edit = function(){};
  K.create = function(){};
  window.KindEditor = K;
})(window);
header.js代码

(function (window, undefined) {

 if (window.KindEditor) {
     return;
 }
footer.js代码


})(window);
core.js代码结构

var _VERSION = ‘4.1.1’;
var _IE = ...;
var _GECKO = …;
var _inArray = function(){ … };
var _trim = function(){ … };
var _each = function(){ … };
var _extend = function(){ … };
…

下划线(_)开头表示跨文件的变量、函数
event.js部分代码
…
if (_IE) {
    window.attachEvent('onunload', function() {
        _each(_eventData, function(key, events) {
             if (events.el) {
                    _unbind(events.el);
             }
        });
    });
}
重点模块
Node模块
   面向编辑器的jQuery缩小版
KindEditor.ready(function(K) {
   K(‘#id div’).click(function(e) {
       K(this). addClass(‘my-class’);
   });
});


Reference: http://www.kindsoft.net/docs/node.html
Range模块
               90% W3C标准
KindEditor.ready(function(K) {
   var range = K.range(document);
   range.selectNodeContents(element);
   range.insertNode(node);
});


Reference: http://www.kindsoft.net/docs/range.html
Command模块
           对应execCommand
KindEditor.ready(function(K) {
   var cmd = K.cmd(document);
   cmd.forecolor(‘#000’);
   cmd.inserthtml(‘<div>text</div>’);
});


Reference: http://www.kindsoft.net/docs/cmd.html
如何把文字改成红色?
ForeColor

第七届前端技术论坛




选中“前端”,把文字颜色改成红色
document.execCommand?
理想:
第七届<span style=“color:#ff0000;">前端</span>技术论坛

现实:
IE:第七届<font color=“#ff0000”>前端</font>技术论坛

Chrome:第七届<font class="Apple-style-span"
  color="#ff0000">前端</font>技术论坛

Firefox:第七届<span style="color: rgb(255, 0, 0)">前端
   </span>技术论坛
最后输出HTML时统一标签?

也有问题:

在IE下execCommand(‘removeformat’)无
 法清理span。
抛弃execCommand

1.取得选中的Range
2.遍历Range,寻找文本
3.分割文本
4.文本加span
5.重新选中
取得选中的Range

var sel = document.selection ||
      window.getSelection();
if (document.selection) {
      nativeRange = sel.createRange();
} else {
      nativeRange = sel.getRangeAt(0);
}
var keRange = K.range(nativeRange);
遍历Range,寻找文本

// 遍历range的共同祖先下的所有节点
if (range.contains(node) && isTextNode(node))
   {
      // 要处理的node
}
分割文本

// textNode:第七届前端技术论坛
node = textNode.splitText(3);
// textNode:第七届
// node:前端技术论坛
centerNode.split(2);
// node:前端



一个文本节点变成三个文本节点
文本加span

// 第七届前端技术论坛
var span = document.createElement(‘span’);
span.style.color = ‘#f00’;
node.parentNode.insertBefore(span, node);
span.parentNode.appendChild(node);
//第七届<span style=“color:#f00;”>前端
   </span>技术论坛
重新选中

var nativeRange = keRange.get();
if (IE) {
       nativeRange.select();
} else {
       sel.removeAllRanges();
       sel.addRange(nativeRange);
}
测试
QUnit
 http://localhost/kindeditor/test/cmd.html




每个模块有对应的单元测试
加粗测试(1)

test('cmd.bold', function() {
   var div = K('<div/>').html(‘abc');
   var range = K.range(document);
   range.selectNodeContents(div[0]);
   K.cmd(range).bold();
   equals(range.html(),
   '<strong>abc</strong>');
});
Selenium
java -jar selenium-server-standalone-2.21.0.jar
加粗测试(2)

require_once '/KindEditorDriver.php';

$driver = new KindEditorDriver('test/total.html');
$driver->html('');
$driver->clickToolbar('bold');
$driver->input('abc');
equals($driver->html(), '<strong>abc</strong>');
$driver->close();
谢谢大家

• 罗龙浩(Roddy)
• www.weibo.com/luolonghao
• luolonghao@gmail.com

Weitere ähnliche Inhalte

Was ist angesagt?

JQuery 学习
JQuery 学习JQuery 学习
JQuery 学习cssrain
 
Web设计 3 java_script初探(程序员与设计师的双重眼光)
Web设计 3 java_script初探(程序员与设计师的双重眼光)Web设计 3 java_script初探(程序员与设计师的双重眼光)
Web设计 3 java_script初探(程序员与设计师的双重眼光)ziggear
 
Html5form
Html5formHtml5form
Html5formjay li
 
jQuery 選取器解析
jQuery 選取器解析jQuery 選取器解析
jQuery 選取器解析Kingsley Zheng
 
MongoDB Basic
MongoDB BasicMongoDB Basic
MongoDB Basicsimplels
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoloadjay li
 
Node develop expirements
Node develop expirementsNode develop expirements
Node develop expirementsaleafs
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統Hsu Ping Feng
 
希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范Hongjian Wang
 
不一樣的Web server... coServ
不一樣的Web server... coServ不一樣的Web server... coServ
不一樣的Web server... coServBen Lue
 
编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editortaobao.com
 

Was ist angesagt? (14)

JQuery 学习
JQuery 学习JQuery 学习
JQuery 学习
 
Web设计 3 java_script初探(程序员与设计师的双重眼光)
Web设计 3 java_script初探(程序员与设计师的双重眼光)Web设计 3 java_script初探(程序员与设计师的双重眼光)
Web设计 3 java_script初探(程序员与设计师的双重眼光)
 
J Query Learn
J Query LearnJ Query Learn
J Query Learn
 
Html5form
Html5formHtml5form
Html5form
 
jQuery 選取器解析
jQuery 選取器解析jQuery 選取器解析
jQuery 選取器解析
 
MongoDB Basic
MongoDB BasicMongoDB Basic
MongoDB Basic
 
Javascript autoload
Javascript autoloadJavascript autoload
Javascript autoload
 
Node分享 展烨
Node分享 展烨Node分享 展烨
Node分享 展烨
 
Node develop expirements
Node develop expirementsNode develop expirements
Node develop expirements
 
使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統使用Javascript及HTML5打造協同運作系統
使用Javascript及HTML5打造協同運作系統
 
希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范
 
不一樣的Web server... coServ
不一樣的Web server... coServ不一樣的Web server... coServ
不一樣的Web server... coServ
 
A
AA
A
 
编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editor
 

Ähnlich wie Kindeditor设计思路v2

使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例Will Huang
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成fangdeng
 
Html5培训内容
Html5培训内容Html5培训内容
Html5培训内容Jun Yu
 
Web development with zend framework
Web development with zend frameworkWeb development with zend framework
Web development with zend frameworkthinkinlamp
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejsChi-wen Sun
 
Kissy editor开发与设计
Kissy editor开发与设计Kissy editor开发与设计
Kissy editor开发与设计yiming he
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Gelis Wu
 
a glance of Javascript module
a glance of Javascript modulea glance of Javascript module
a glance of Javascript modulezipeng zhang
 
JdonFramework中文
JdonFramework中文JdonFramework中文
JdonFramework中文banq jdon
 
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯Django敏捷开发 刘天斯
Django敏捷开发 刘天斯liuts
 
恶意网页分析实战
恶意网页分析实战恶意网页分析实战
恶意网页分析实战Huang Toby
 
jsdoc-toolkit
jsdoc-toolkitjsdoc-toolkit
jsdoc-toolkitsatans17
 
Kissy design
Kissy designKissy design
Kissy designyiming he
 
107个常用javascript语句 oss 计算技术 - ossez info of tech
107个常用javascript语句   oss 计算技术 - ossez info of tech107个常用javascript语句   oss 计算技术 - ossez info of tech
107个常用javascript语句 oss 计算技术 - ossez info of techYUCHENG HU
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xBo-Yi Wu
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介GO LL
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
2023-netconf-deploy-azure-function-with-KEDA-on-aks
2023-netconf-deploy-azure-function-with-KEDA-on-aks2023-netconf-deploy-azure-function-with-KEDA-on-aks
2023-netconf-deploy-azure-function-with-KEDA-on-aksRoberson Liou
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 

Ähnlich wie Kindeditor设计思路v2 (20)

使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成
 
Html5培训内容
Html5培训内容Html5培训内容
Html5培训内容
 
Web development with zend framework
Web development with zend frameworkWeb development with zend framework
Web development with zend framework
 
Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejs
 
Kissy editor开发与设计
Kissy editor开发与设计Kissy editor开发与设计
Kissy editor开发与设计
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
 
a glance of Javascript module
a glance of Javascript modulea glance of Javascript module
a glance of Javascript module
 
Mvc
MvcMvc
Mvc
 
JdonFramework中文
JdonFramework中文JdonFramework中文
JdonFramework中文
 
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯Django敏捷开发 刘天斯
Django敏捷开发 刘天斯
 
恶意网页分析实战
恶意网页分析实战恶意网页分析实战
恶意网页分析实战
 
jsdoc-toolkit
jsdoc-toolkitjsdoc-toolkit
jsdoc-toolkit
 
Kissy design
Kissy designKissy design
Kissy design
 
107个常用javascript语句 oss 计算技术 - ossez info of tech
107个常用javascript语句   oss 计算技术 - ossez info of tech107个常用javascript语句   oss 计算技术 - ossez info of tech
107个常用javascript语句 oss 计算技术 - ossez info of tech
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.x
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
2023-netconf-deploy-azure-function-with-KEDA-on-aks
2023-netconf-deploy-azure-function-with-KEDA-on-aks2023-netconf-deploy-azure-function-with-KEDA-on-aks
2023-netconf-deploy-azure-function-with-KEDA-on-aks
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 

Kindeditor设计思路v2