最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 一步一步解析wangEditor4源码

    正文概述 掘金(xiaokyo)   2021-01-24   1319

    wangEditor版本4

    Typescript 开发的 Web 富文本编辑器, 轻量、简洁、易用、开源免费github传送门

    1. 找到入口文件src/wangEditor.ts

    一步一步解析wangEditor4源码

    解析:可以看出来入口文件很精简,可以明确的了解到wangEidtor所需要的一些文件

    • 1.样式文件less
    • 2.wangeditor的类文件import Editor from './editor/index'
    • 3.polyfill一些功能兼容的文件import './utils/polyfill'
    • 4.初始化的一些可以扩展及配置的菜单基础类export * from './menus/menu-constructors/index'

    2. 打开src/utils/polyfill

    一步一步解析wangEditor4源码

    解析:就针对一下两个功能点做了兼容,注释也写的很清楚:

      1. 针对matches方法的兼容实现
      1. 针对IE11的Promise兼容

    3. 重头戏src/editor/index.ts

    这个文件才是编辑器的核心入口

    首先是构造函数

    一步一步解析wangEditor4源码

    这个构造函数有两个参数

    • toolbarSelector -- 必须 -- 编辑器工具栏的选择器
    • textSelector -- 可选 -- 编辑器内容的选择器

    解析:此函数针对编辑器需要的功能及属性配置进行初始化,功能见图

    其他的都是暴露给用户使用的api
    API备注
    create()创建编辑器实例beforeDestroy()销毁前钩子destroy()销毁编辑器fullScreen()进入全屏unFullScreen()关闭全屏scrollToHead()跳到指定锚点registerMenu()注册扩展菜单

    4. 选区api封装src/editor/selection.ts

    API备注
    getRange()获取当前 rangesaveRange()保存选区范围saveRange()折叠选区范围getSelectionText()获取选区范围内的文字getSelectionContainerElem()获取选区范围的 DOM 元素getSelectionStartElem()选区范围开始的 DOM 元素getSelectionEndElem()选区范围结束的 DOM 元素isSelectionEmpty()选区是否为空(没有选择文字)restoreSelection()恢复选区范围createEmptyRange()创建一个空白(即 &#8203 字符)选区createRangeByElems()重新设置选区createRangeByElem()根据 DOM 元素设置选区getSelectionRangeTopNodes()获取 当前 选取范围的 顶级(段落) 元素moveCursor()移动光标位置,默认情况下在尾部getCursorPos()获取光标在当前选区的位置clearWindowSelectionRange()清除当前选区的Range,notice:不影响已保存的RangerecordSelectionNodes()记录节点 - 从选区开始节点开始 一直到匹配到选区结束节点为止

    5. execCommand命令封装src/editor/command.ts

    API备注
    do()执行富文本操作的命令insertHTML()插入 htmlinsertElem()插入 DOM 元素

    6. 初始化编辑区域src/text/index.ts

    API备注
    togglePlaceholder()切换placeholderclear()清空内容html()获取内容/设置内容text()获取文本/设置文本setJson()设置jsongetJson()获取jsonappend()追加 html 内容

    另外还有些api是私有的,就不介绍了, 有兴趣可以自行查阅其功能

    还有这里有个功能值得一提,就是事件委托的全局管理,拿了一部分代码:

    // 键盘 down 时的 hooks
    $textElem.on('keydown', (e: KeyboardEvent) => {
        const keydownEvents = eventHooks.keydownEvents
        keydownEvents.forEach(fn => fn(e))
    })
    

    这里将编辑区域的keydown事件都放在了keydownEvents的数组里,然后循环执行,已到达全局管理,非常的优雅。

    7. 菜单初始化src/menus/index.ts

    API备注
    extend自定义添加菜单init初始化菜单menuFind获取指定菜单对象changeActive修改菜单激活状态

    8. 全局zIndex管理src/editor/z-index/index.ts

    这个文件就是针对编辑器所有用到的样式zIndex的统一管理

    9. 监听编辑器内容改变的实现src/editor/change/index.ts

    它继承了Mutation, 我们跟随着打开封装Mutation的文件src/utils/observer/mutation.ts

    soga, 原来是用了原生的MutationObserver API

    Web API官方使用的example

    // 选择需要观察变动的节点
    const targetNode = document.getElementById('some-id');
    
    // 观察器的配置(需要观察什么变动)
    const config = { attributes: true, childList: true, subtree: true };
    
    // 当观察到变动时执行的回调函数
    const callback = function(mutationsList, observer) {
        // Use traditional 'for loops' for IE 11
        for(let mutation of mutationsList) {
            if (mutation.type === 'childList') {
                console.log('A child node has been added or removed.');
            }
            else if (mutation.type === 'attributes') {
                console.log('The ' + mutation.attributeName + ' attribute was modified.');
            }
        }
    };
    
    // 创建一个观察器实例并传入回调函数
    const observer = new MutationObserver(callback);
    
    // 以上述配置开始观察目标节点
    observer.observe(targetNode, config);
    
    // 之后,可停止观察
    observer.disconnect();
    

    总体来说就是一个监听dom树结构发生变化的事件API,看到这里就豁然开朗了,用法就按照例子来,不介绍了。

    10. 撤销和恢复功能src/editor/history/index.ts

    看看具体实现,构造代码: 一步一步解析wangEditor4源码

    一上来就是三个缓存

      1. 内容缓存
      1. 滚动scrollTop缓存
      1. 选区缓存

    起源地下载网 » 一步一步解析wangEditor4源码

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元