对wangeditor进行扩展---- 源代码

2023-11-20

看到有人对我做的WangEditor比较感兴趣,问了一些问题。但由于我并不常来,所以就没能及时答复,抱歉了。

未避免以后类似问题发生,我将我修改的wangeditor.js直接发在这里,有兴趣的可以下载后自己分析。希望能帮到需要的人。

扩展后的界面如下:

全部代码5525行。

(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
	typeof define === 'function' && define.amd ? define(factory) :
	(global.wangEditor = factory());
}(this, (function () { 'use strict';

/*
    poly-fill
*/

var polyfill = function () {

    // Object.assign
    if (typeof Object.assign != 'function') {
        Object.assign = function (target, varArgs) {
            // .length of function is 2
            if (target == null) {
                // TypeError if undefined or null
                throw new TypeError('Cannot convert undefined or null to object');
            }

            var to = Object(target);

            for (var index = 1; index < arguments.length; index++) {
                var nextSource = arguments[index];

                if (nextSource != null) {
                    // Skip over if undefined or null
                    for (var nextKey in nextSource) {
                        // Avoid bugs when hasOwnProperty is shadowed
                        if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
                            to[nextKey] = nextSource[nextKey];
                        }
                    }
                }
            }
            return to;
        };
    }

    // IE 中兼容 Element.prototype.matches
    if (!Element.prototype.matches) {
        Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {
            var matches = (this.document || this.ownerDocument).querySelectorAll(s),
                i = matches.length;
            while (--i >= 0 && matches.item(i) !== this) {}
            return i > -1;
        };
    }
};

/*
    DOM 操作 API
*/

// 根据 html 代码片段创建 dom 对象
function createElemByHTML(html) {
    var div = void 0;
    div = document.createElement('div');
    div.innerHTML = html;
    return div.children;
}

// 是否是 DOM List
function isDOMList(selector) {
    if (!selector) {
        return false;
    }
    if (selector instanceof HTMLCollection || selector instanceof NodeList) {
        return true;
    }
    return false;
}

// 封装 document.querySelectorAll
function querySelectorAll(selector) {
    var result = document.querySelectorAll(selector);
    if (isDOMList(result)) {
        return result;
    } else {
        return [result];
    }
}

// 记录所有的事件绑定
var eventList = [];

// 创建构造函数
function DomElement(selector) {
    if (!selector) {
        return;
    }

    // selector 本来就是 DomElement 对象,直接返回
    if (selector instanceof DomElement) {
        return selector;
    }

    this.selector = selector;
    var nodeType = selector.nodeType;

    // 根据 selector 得出的结果(如 DOM,DOM List)
    var selectorResult = [];
    if (nodeType === 9) {
        // document 节点
        selectorResult = [selector];
    } else if (nodeType === 1) {
        // 单个 DOM 节点
        selectorResult = [selector];
    } else if (isDOMList(selector) || selector instanceof Array) {
        // DOM List 或者数组
        selectorResult = selector;
    } else if (typeof selector === 'string') {
        // 字符串
        selector = selector.replace('/\n/mg', '').trim();
        if (selector.indexOf('<') === 0) {
            // 如 <div>
            selectorResult = createElemByHTML(selector);
        } else {
            // 如 #id .class
            selectorResult = querySelectorAll(selector);
        }
    }

    var length = selectorResult.length;
    if (!length) {
        // 空数组
        return this;
    }

    // 加入 DOM 节点
    var i = void 0;
    for (i = 0; i < length; i++) {
        this[i] = selectorResult[i];
    }
    this.length = length;
}

// 修改原型
DomElement.prototype = {
    constructor: DomElement,

    // 类数组,forEach
    forEach: function forEach(fn) {
        var i = void 0;
        for (i = 0; i < this.length; i++) {
            var elem = this[i];
            var result = fn.call(elem, elem, i);
            if (result === false) {
                break;
            }
        }
        return this;
    },

    // clone
    clone: function clone(deep) {
        var cloneList = [];
        this.forEach(function (elem) {
            cloneList.push(elem.cloneNode(!!deep));
        });
        return $(cloneList);
    },

    // 获取第几个元素
    get: function get(index) {
        var length = this.length;
        if (index >= length) {
            index = index % length;
        }
        return $(this[index]);
    },

    // 第一个
    first: function first() {
        return this.get(0);
    },

    // 最后一个
    last: function last() {
        var length = this.length;
        return this.get(length - 1);
    },

    // 绑定事件
    on: function on(type, selector, fn) {
        // selector 不为空,证明绑定事件要加代理
        if (!fn) {
            fn = selector;
            selector = null;
        }

        // type 是否有多个
        var types = [];
        types = type.split(/\s+/);

        return this.forEach(function (elem) {
            types.forEach(function (type) {
                if (!type) {
                    return;
                }

                // 记录下,方便后面解绑
                eventList.push({
                    elem: elem,
                    type: type,
                    fn: fn
                });

                if (!selector) {
                    // 无代理
                    elem.addEventListener(type, fn);
                    return;
                }

                // 有代理
                elem.addEventListener(type, function (e) {
                    var target = e.target;
                    if (target.matches(selector)) {
                        fn.call(target, e);
                    }
                });
            });
        });
    },

    // 取消事件绑定
    off: function off(type, fn) {
        return this.forEach(function (elem) {
            elem.removeEventListener(type, fn);
        });
    },

    // 获取/设置 属性
    attr: function attr(key, val) {
        if (val == null) {
            // 获取值
            return this[0].getAttribute(key);
        } else {
            // 设置值
            return this.forEach(function (elem) {
                elem.setAttribute(key, val);
            });
        }
    },

    // 添加 class
    addClass: function addClass(className) {
        if (!className) {
            return this;
        }
        return this.forEach(function (elem) {
            var arr = void 0;
            if (elem.className) {
                // 解析当前 className 转换为数组
                arr = elem.className.split(/\s/);
                arr = arr.filter(function (item) {
                    return !!item.trim();
                });
                // 添加 class
                if (arr.indexOf(className) < 0) {
                    arr.push(className);
                }
                // 修改 elem.class
                elem.className = arr.join(' ');
            } else {
                elem.className = className;
            }
        });
    },

    // 删除 class
    removeClass: function removeClass(className) {
        if (!className) {
            return this;
        }
        return this.forEach(function (elem) {
            var arr = void 0;
            if (elem.className) {
                // 解析当前 className 转换为数组
                arr = elem.className.split(/\s/);
                arr = arr.filter(function (item) {
                    item = item.trim();
                    // 删除 class
                    if (!item || item === className) {
                        return false;
                    }
                    return true;
                });
                // 修改 elem.class
                elem.className = arr.join(' ');
            }
        });
    },

    // 修改 css
    css: function css(key, val) {
        var currentStyle = key + ':' + val + ';';
        return this.forEach(function (elem) {
            var style = (elem.getAttribute('style') || '').trim();
            var styleArr = void 0,
                resultArr = [];
            if (style) {
                // 将 style 按照 ; 拆分为数组
                styleArr = style.split(';');
                styleArr.forEach(function (item) {
                    // 对每项样式,按照 : 拆分为 key 和 value
                    var arr = item.split(':').map(function (i) {
                        return i.trim();
                    });
                    if (arr.length === 2) {
                        resultArr.push(arr[0] + ':' + arr[1]);
                    }
                });
                // 替换或者新增
                resultArr = resultArr.map(function (item) {
                    if (item.indexOf(key) === 0) {
                        return currentStyle;
                    } else {
                        return item;
                    }
                });
                if (resultArr.indexOf(currentStyle) < 0) {
                    resultArr.push(currentStyle);
                }
                // 结果
                elem.setAttribute('style', resultArr.join('; '));
            } else {
                // style 无值
                elem.setAttribute('style', currentStyle);
            }
        });
    },

    // 显示
    show: function show() {
        return this.css('display', 'block');
    },

    // 隐藏
    hide: function hide() {
        return this.css('display', 'none');
    },

    // 获取子节点
    children: function children() {
        var elem = this[0];
        if (!elem) {
            return null;
        }

        return $(elem.children);
    },

    // 获取子节点(包括文本节点)
    childNodes: function childNodes() {
        var elem = this[0];
        if (!elem) {
            return null;
        }

        return $(elem.childNodes);
    },

    // 增加子节点
    append: function append($children) {
        return this.forEach(function (elem) {
            $children.forEach(function (child) {
                elem.appendChild(child);
            });
        });
    },

    // 移除当前节点
    remove: function remove() {
        return this.forEach(function (elem) {
            if (elem.remove) {
                elem.remove();
            } else {
                var parent = elem.parentElement;
                parent && parent.removeChild(elem);
            }
        });
    },

    // 是否包含某个子节点
    isContain: function isContain($child) {
        var elem = this[0];
        var child = $child[0];
        return elem.contains(child);
    },

    // 尺寸数据
    getSizeData: function getSizeData() {
        var elem = this[0];
        return elem.getBoundingClientRect(); // 可得到 bottom height left right top width 的数据
    },

    // 封装 nodeName
    getNodeName: function getNodeName() {
        var elem = this[0];
        return elem.nodeName;
    },

    // 从当前元素查找
    find: function find(selector) {
        var elem = this[0];
        return $(elem.querySelectorAll(selector));
    },

    // 获取当前元素的 text
    text: function text(val) {
        if (!val) {
            // 获取 text
            var elem = this[0];
            return elem.innerHTML.replace(/<.*?>/g, function () {
                return '';
            });
        } else {
            // 设置 text
            return this.forEach(function (elem) {
                elem.innerHTML = val;
            });
        }
    },

    // 获取 html
    html: function html(value) {
        var elem = this[0];
        if (value == null) {
            return elem.innerHTML;
        } else {
            elem.innerHTML = value;
            return this;
        }
    },

    // 获取 value
    val: function val() {
        var elem = this[0];
        return elem.value.trim();
    },

    // focus
    focus: function focus() {
        return this.forEach(function (elem) {
            elem.focus();
        });
    },

    // parent
    parent: function parent() {
        var elem = this[0];
        return $(elem.parentElement);
    },

    // parentUntil 找到符合 selector 的父节点
    parentUntil: function parentUntil(selector, _currentElem) {
        var results = document.querySelectorAll(selector);
        var length = results.length;
        if (!length) {
            // 传入的 selector 无效
            return null;
        }

        var elem = _currentElem || this[0];
        if (elem.nodeName === 'BODY') {
            return null;
        }

        var parent = elem.parentElement;
        var i = void 0;
        for (i = 0; i < length; i++) {
            if (parent === results[i]) {
                // 找到,并返回
                return $(parent);
            }
        }

        // 继续查找
        return this.parentUntil(selector, parent);
    },

    // 判断两个 elem 是否相等
    equal: function equal($elem) {
        if ($elem.nodeType === 1) {
            return this[0] === $elem;
        } else {
            return this[0] === $elem[0];
        }
    },

    // 将该元素插入到某个元素前面
    insertBefore: function insertBefore(selector) {
        var $referenceNode = $(selector);
        var referenceNode = $referenceNode[0];
        if (!referenceNode) {
            return this;
        }
        return this.forEach(function (elem) {
            var parent = referenceNode.parentNode;
            parent.insertBefore(elem, referenceNode);
        });
    },

    // 将该元素插入到某个元素后面
    insertAfter: function insertAfter(selector) {
        var $referenceNode = $(selector);
        var referenceNode = $referenceNode[0];
        if (!referenceNode) {
            return this;
        }
        return this.forEach(function (elem) {
            var parent = referenceNode.parentNode;
            if (parent.lastChild === referenceNode) {
                // 最后一个元素
                parent.appendChild(elem);
            } else {
                // 不是最后一个元素
                parent.insertBefore(elem, referenceNode.nextSibling);
            }
        });
    }
};

// new 一个对象
function $(selector) {
    return new DomElement(selector);
}

// 解绑所有事件,用于销毁编辑器
$.offAll = function () {
    eventList.forEach(function (item) {
        var elem = item.elem;
        var type = item.type;
        var fn = item.fn;
        // 解绑
        elem.removeEventListener(type, fn);
    });
};

/*
    配置信息
*/

var config = {

    // 默认菜单配置 (: 修改菜单顺序)
    menus: [ 'bold','italic', 'underline', 'underdot', 'strikeThrough','Sup','Sub','Middle','HRline', 'head', 'fontSize', 'fontName',  'foreColor', 'backColor', 
    'list', 'justify',  'emoticon', 'image', 'table','mathsymbol', 'Latex', 'Bracket','Fraction','Sqrt','Answer','Folder', 'link', 'video','undo', 'redo',
	 'a01', 'a02', 'a03', 'a04', 'a05', 'a06', 'a07', 'a08', 'a09', 'a10', 'a11','a12','a13','a14','a15','a16','a17','a18','a19','a20','a21','a22','a23','a24'],

    fontNames: ['宋体', '微软雅黑', 'Arial', 'Tahoma', 'Verdana'],

    colors: ['#000000', '#666666','#cccccc','#ffffff' ,  '#ff0000', '#ff7e72', '#005500', '#00ff00', '#00007f', '#0000ff', '#ffff00', '#aa007f'],

    // // 语言配置
    // lang: {
    //     '设置标题': 'title',
    //     '正文': 'p',
    //     '链接文字': 'link text',
    //     '链接': 'link',
    //     '插入': 'insert',
    //     '创建': 'init'
    // },

    // 表情
    emotions: [{
        title: '数学',
        type: 'image',
        content: [ //文件名对应的图像不能改变!!!!!!!!!!
            {"src": "/static/png/math/01.png","alt": "1/2",},
            {"src": "/static/png/math/10.png","alt": "√2",},
            {"src": "/static/png/math/11.png","alt": "√3",},
            {"src": "/static/png/math/12.png","alt": "√5",},
            {"src": "/static/png/math/13.png","alt": "√6",},
            {"src": "/static/png/math/14.png","alt": "求根公式",},
            {"src": "/static/svg/1_2.svg","alt": "1/2",},
		]
        },{
            title: 'emoji',
            type: 'emoji',
            content: '									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对wangeditor进行扩展---- 源代码 的相关文章

随机推荐

  • el-input-number默认值为空怎么设置

    el input number 没有值的情况下 默认值为0 一般没有值的情况下默认值为空 需要将默认值 undefined
  • 【PDF】PDF无法注释的一种解决方案

    PDF无法注释 需要检查 1 权限问题 2 文档规范问题 PDF A 拓展阅读 浏览器打开PDF调整亮度和颜色的小技巧 处理pdf 文档的相关功能包总结 1 pdf文档不能注释 下载的一篇pdf文档在阅读时不能注释 高亮和打字机等选项都是灰
  • java通过MultipartFile进行文件、图片上传和下载,以及文件流

    java通过MultipartFile进行文件 图片上传和下载 以及文件流 package com fh controller import com fh util UuidUtil import org apache commons io
  • 机组logisim P0课下

    首先是记录猪脚强调的注意事项 输入信号一般是通过MUX 多路选择器来实现对输出结果的控制 刚连接好电路时或者连接电路中 可能有一些电路莫名其妙是蓝色 这时关闭logisim后再次打开就好了 Comparator器件默认是有符号的 要调成un
  • git commit提交之后,push 失败

    情况 在git commit m 备注 之后 git push 出现错误 出现的错误是 我提交的代码格式不满足要求 原因是 因为在一些公司里面 有提交代码的一个格式 就比如 m后面的备注信息 是要求有一定格式的 但是我第一遍的格式是写错了
  • 灰度图像的彩色复原方法 ——以人脸着色为例

    灰度图像的彩色复原方法 以人脸着色为例 代码文件下载地址 摘要 灰度图像彩色复原在图像修复领域有广泛的应用 由于其涉及从低纬度空间向高纬度空间的映射 故而修复效果存在差异 本文以人脸为例研究灰度图像的彩色复原方法 在主流灰度图像彩色修复算法
  • 数据库如何热备份

    1 1数据库冷备份 概念 在固定的周期内 人为的将数据库中的数据进行备份 一般一式三份 缺点 1 可能会造成数据丢失 2 如果数据量很多 则可能会导致备份时间很长 并且备份不能正常完成 说明 虽然冷备份有诸多的缺点 但是最好进行冷备份 因为
  • 什么是决策表?什么是决策树?

    决策树 是在已知各种情况发生概率的基础上 通过构成决策树来求取净现值的期望值大于等于零的概率 评价项目风险 判断其可行性的决策分析方法 是直观运用概率分析的一种图解法 这种决策分支画成图形很像一棵树的树干 故称决策树 它是一种树形结构 每个
  • PyCharm,idea通过插件database连接带Kerberos的hive

    1 目的 PyCharm通过插件database连接带Kerberos的hive 2 异常 我windows已经配置好kerberos 可以kinit通 其其他工具以及可以正常访问 但是通过PyCharm 或者idea等工具报如下错误 Ca
  • Spring中的监听器与SpringMVC简述

    目录 Spring中的监听器 SpringMVC概述 web层的框架完成的相应的操作图示 SpringMVC开发使用步骤 SpringMVC流程图示 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转
  • javaScript实现-在两个文本框中输入值计算加减乘除法结果显示在另一个文本框中

    在两个文本框中输入值计算加减乘除法结果显示在另一个文本框中 方法一 用if else
  • Eclipse安转主题插件Theme出现问题解决办法

    1 2 3 直接在线安装输入Eclipse Color Theme Update Site 4 疯狂下一步 5 收功
  • 告别3D-DNA试试chromap和yahs做Hi-C辅助组装吧

    之前使用的是3D DNA流程做Hi C的辅助组装 它的最大优势就是输出结果可以对接下游的JBAT juicerbox with Assembly Tools 进行手动矫正 然而它点缺陷也很明显 处理速度不够快 且对植物的优化不行 同时目前许
  • 常微分方程(Ordinary Differential Equation III)

    常微分方程 一阶线性微分方程组 基本概念 解的存在和唯一性定理 齐次线性微分方程组 非齐次线性微分方程组 常系数线性微分方程组 常微分方程 Ordinary Differential Equation I 常微分方程 Ordinary Di
  • C结构体内char[] 数组的初始化

    一种C结构体内char 数组的初始化 include
  • 用户控件自定义 DependencyProperty

    用户控件自定义 DependencyProperty 属性使用教程 DependencyProperty 概念 依赖属性创建 自定义控件的依赖属性 DependencyProperty 概念 依赖属性就是一种可以自己没有值 并能通过使用Bi
  • 断电的方法关闭计算机,win7设置usb关机断电

    win7设置usb关机断电 win7设置usb关机拔出断电的解决方法 小伙伴们可能会经常性的遇到一个问题 就是win7电脑已经关闭了 但是插在计算机usb接口上的硬盘依然会被计算机供电 发出闪亮的光 这就让很多小伙伴们厌烦 为了帮小伙伴们解
  • 第十三篇、基于Arduino uno,获取薄膜压力传感器的值——结果导向

    0 结果 说明 先来看看串口调试助手显示的结果 第一个值是上电后检测到的平均压力值 第二个值是实时的压力值 第三个值是平均压力值和实时压力值的差值 如果是你想要的 可以接着往下看 1 外观 说明 虽然薄膜压力传感器形态各异 但是原理和代码都
  • Spring MVC下篇

    书接上回Spring MVC上篇 前面介绍了Spring MVC的服务器如何获得用户的请求 那么今天就来介绍一下服务器如何将响应返回给客户端 目录 3 服务器将结果返回给用户 前端 3 1 返回一个静态页面 3 2 返回 text html
  • 对wangeditor进行扩展---- 源代码

    看到有人对我做的WangEditor比较感兴趣 问了一些问题 但由于我并不常来 所以就没能及时答复 抱歉了 未避免以后类似问题发生 我将我修改的wangeditor js直接发在这里 有兴趣的可以下载后自己分析 希望能帮到需要的人 扩展后的
Powered by Hwhale