Ueditor富文本编辑器客制化功能添加

2023-11-09


ueditor简介

ueditor是百度开发的开源的富文本编辑器, 支持类似域Excel的表格操作

主要配置文件

文件名称 文件内容分
ueditor.all.js 源码主文件
ueditor.config.js 配置文件, 配置属性白名单
zh-cn.js,en.js 多语言文件
ueditor.css 样式信息

要实现的功能展示

可以设置单元格的属性, 比如有数字,字符, 百分比等等.
右键,添加单元格属性

右键单元格属性

可以选择对应的属性,

选择属性

确认后可以查看属性

查看属性

实现过程

首先添加上菜单

修改 ueditor.all.js

在 dialogBtns里面维护好对应的操作

修改dialogBtn

添加到右键菜单, 找到右键菜单代码

在这里插入图片描述

一个菜单选项如下

在这里插入图片描述

菜单组如下, 里面包含了子菜单

找到自己想要放的位置, 加上设置单元格属性的菜单
这里点击我们会打开一个窗口, 没有这个需求就可以直接调用 command, command维护后面会讲到

菜单

                //单元格类型
                {
                    label:lang.setcellattribute,
                    cmdName:'setcellattribute',
                    exec:function () {
                        if ( UE.ui['setcellattribute'] ) {
                            new UE.ui['setcellattribute']( this );
                        }
                        this.getDialog('setcellattribute').open();
                    }
                },

组件添加上要事件, 在其他组件添加事件代码的区域

在这里插入图片描述

    /**设置数据类型**/
    UE.plugins['setcellattribute'] = function () {
        UE.commands['template'] = {
            execCommand:function (cmd, obj) {
                obj.html && this.execCommand("inserthtml", obj.html);
            }
        };
        this.addListener("click", function (type, evt) {
            var el = evt.target || evt.srcElement,
                range = this.selection.getRange();
            var tnode = domUtils.findParent(el, function (node) {
                if (node.className && domUtils.hasClass(node, "ue_t")) {
                    return node;
                }
            }, true);
            tnode && range.selectNode(tnode).shrinkBoundary().select();
        });
        this.addListener("keydown", function (type, evt) {
            var range = this.selection.getRange();
            if (!range.collapsed) {
                if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) {
                    var tnode = domUtils.findParent(range.startContainer, function (node) {
                        if (node.className && domUtils.hasClass(node, "ue_t")) {
                            return node;
                        }
                    }, true);
                    if (tnode) {
                        domUtils.removeClasses(tnode, ["ue_t"]);
                    }
                }
            }
        });
    };

设置打开的窗口的页面,在iframeUrlMap添加信息

在这里插入图片描述

添加信息如下

添加信息

            'setcellattribute':'~/plugin/ueditor/dialogs/table/setcellattribute.html',

这个时候打开窗口就会显示 setcellattribute.html 页面, 在页面点击确定调用了一个命令

查看属性

command区域维护一下这个command

在这里插入图片描述

        //数据类型
        UE.commands['setcellattribute'] = {
            queryCommandState: function () {
                return getTableItemsByRange(this).table ? 0 : -1
            },
            execCommand: function (cmd,dataTypeCode) {
                var me = this,
                    ut = getUETableBySelected(me);
                if (!ut) {
                    var start = me.selection.getStart(),
                        cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true);
                    if (cell) {
                        var row = cell.parentElement;
                        //单元格是表头特殊处理
                        if (domUtils.hasClass(row, "firstRow")) {
                            HandTableHeadCellAttribute(cell,dataTypeCode);

                        } else {
                            SetCellAttribute(cell,dataTypeCode);
                        }
                    }
                } else {
                    utils.each(ut.selectedTds, function (cell) {
                        var row = cell.parentElement;
                        //单元格是表头特殊处理
                        if (domUtils.hasClass(row, "firstRow")) {
                            HandTableHeadCellAttribute(cell,dataTypeCode);
                        } else {
                            SetCellAttribute(cell,dataTypeCode);
                        }
                    });
                }
            }
        };

上面调用function的如下, 这里面处理的cell的 cellattribute属性, 之后要在 ueditor.config.js 配置属性白名单

        function HandTableHeadCellAttribute (node, cellattribute) {
            var nodeId = $(node).attr("id");

            //全局表搜索列
            var row = node.parentElement;
            var table = row.parentElement;

            //遍历行
            $.each(table.rows, function (k, v) {
                //拼接ID
                var cellId = "";
                if (k === 0) {
                    cellId = nodeId;
                } else {
                    cellId = nodeId + k;
                }
                //取出所需的值

                var cell = UE.dom.domUtils.filterNodeList(v.cells, function (node) {
                    if ($(node).attr("id") &&
                        $(node).attr("id") === cellId) {
                        return true;
                    }
                    return false;
                });

                if (cell &&
                    $(cell).attr("dimtype") !== "CD" &&
                    $(cell).attr("dimtype") !== "RD") {
                    SetCellAttribute(cell,cellattribute);
                }
            });
        }

        function SetCellAttribute(cell,cellattribute) {
            //设置数据类
            cell.setAttribute("cellattribute", cellattribute);

            if(cellattribute === 'date') {
                //日期类型设置日历控件
                cell.setAttribute("datepicker", "Y");
            } else {
                domUtils.removeAttributes(cell,'datepicker');
            }

            //百分比类型,设置百分比显示
            if(cellattribute === 'percentage') {
                cell.setAttribute("isshowpercent",'Y');
            } else {
                domUtils.removeAttributes(cell,'isshowpercent');
            }


        }

配置页面的内容-setcellattribute.html

包含了页面初始化渲染的处理逻辑, 还有点击确定处理逻辑

<#include "../../../../include/header.html">
<body>
<script>
    var viewModel = kendo.observable({
        data: {},
        confirm : function () {
        },
        clearAll : function () {
            viewModel.data.set("cellAttribute", null);
        }
    });
    var dateTypeSource = [
        {
            meaning: "数字",
            value: "number"
        }, {
            meaning: "字符",
            value: "string"
        }, {
            meaning: "日期",
            value: "date"
        },{
            meaning:'百分比',
            value : 'percentage'
        }
    ];
</script>
<div id="page_content">
    <span id="echo_info" class="pull-left" style="color:#F00"></span>
    <div id="queryPanel" style="margin-right:5px;padding-bottom:10px; padding-top: 20px; text-align: center;">
        <div id="form">
            <input type="text" id="cellAttribute" data-bind="value: data.cellAttribute"/>
            <script>
                $("#cellAttribute").kendoComboBox({
                    dataTextField: "meaning",
                    dataValueField: "value",
                    dataSource: dateTypeSource
                }).data("kendoComboBox");
            </script>
        </div>
        <script>kendo.bind($('#form'),viewModel);</script>
    </div>
</div>
<script type="text/javascript" src="${base.contextPath}/lib/ueditor/dialogs/internal.js"></script>
<script type="text/javascript">
    window.isArea;
    var isArea = createArea(editor);

    echoCellAttribute(isArea);

    /**
     * echoCellAttribute : 显示数据类型
     *
     * @author yanqiang.jiang@hand-china.com
     * @date   2019/02/20 15:39
     * @param isArea
     * @return
     * @since JDK 1.8
     */
    function echoCellAttribute(isArea) {
        var id;
        var cellattribute = '';
        if ($.isEmpty(isArea)) {
            var start = editor.selection.getStart();
            var node = UE.dom.domUtils.findParentByTagName(start, ["td", "th"], true);
            id = $(node).attr("id");
            cellattribute = $(node).attr("cellattribute");
        } else {
            id = isArea.split(":")[0];
            var cellattribute =$(editor.getContent()).find("#"+id).attr("cellattribute");
        }
        viewModel.data.set("cellAttribute", cellattribute);
    }

    dialog.onok = function () {
        var groupCode = parent.ue.groupCode;
        var formCode = parent.ue.form_code;

        var cellAttribute = $("#cellAttribute").val();

        if ($.isEmpty(isArea)) {
            //若用户没选择区域,则用户有可能要选择表项
            var start = editor.selection.getStart();
            try {
                var node = UE.dom.domUtils.findParentByTagName(start, ["td", "th"], true);
                setCellAttributeListToMap(node, groupCode, formCode, cellAttribute);
            } catch (e) {
                console.log('warn:' + '此表单未选择表项或表项区域!');
            }
        } else {
            //用户选择的是区域,先虚拟出该区域的所有位置标识
            var selectedArea = getSelectArea(isArea);
            $.each(selectedArea, function (k, v) {
                var node = $(editor.getContent()).find("#"+v)[0];
                setCellAttributeListToMap(node, groupCode, formCode, cellAttribute);
            });
        }

        editor.execCommand('setcellattribute',cellAttribute);
    };


    /**
     *
     *处理用于所选区域, 如果是表头则是整个区域
     *
     **/
    function setCellAttributeListToMap(node, groupCode, formCode, cellAttribute) {

        //判断n是不是第一行
        var row = node.parentElement;
        if (domUtils.hasClass(row, "firstRow")) {

            var nodeId = $(node).attr("id");

            //全局表搜索列
            var table = row.parentElement;

            //遍历行
            $.each(table.rows, function (k, v) {
                //拼接ID
                var cellId= "";
                if(k === 0){
                    cellId = nodeId;
                } else {
                    cellId =  nodeId + k;
                }
                //取出所需的值

                var cell =  $(editor.getContent()).find("#"+cellId)[0];
                if(cell&&
                $(cell).attr("dimtype") !== "CD" &&
                $(cell).attr("dimtype") !== "RD"){
                    setCellAttributeToMap(cell, groupCode, formCode, cellAttribute);
                }
            });
        } else {
            setCellAttributeToMap(node, groupCode, formCode, cellAttribute);
        }

    }

    function setCellAttributeToMap(cell, groupCode, formCode, cellAttribute) {
        var tabCode = $(cell).attr("tablecode");
        var locCode = $(cell).attr("id");
        var key = groupCode + "_" + formCode + "_" + tabCode + "_" + locCode;
        var value = cellAttribute;
        if(parent.ue.cellAttributeMap) {
            parent.ue.cellAttributeMap.set(key, value);
        }
    }

    /**
     * 获取用户所选区域 例如 A1:B3
     * @param ue ueditor对象
     * @returns {string}
     */
    function createArea(ue) {
        var area = '';
        var html = ue.getContent();
        //将html字符串转化成jquery对象
        var htmlObj = $(html);
        //获取所有的td对象
        var tds = htmlObj.find("td.selectTdClass");
        if(!$.isEmpty(tds) && tds.length > 0){
            var minid = tds[0].id;
            var maxid = tds[tds.length-1].id;
            area = minid + ':' + maxid;
        }
        return area;
    }

</script>
</body>
</html>

添加多语言配置

zh-cn.js 和en.js维护上中文和英文
在labelMap添加

在这里插入图片描述

内容

在这里插入图片描述

在contextMenu添加

在这里插入图片描述

内容

在这里插入图片描述

最后添加菜单对象, 这李是一个简单的菜单, static为空即可, 添加到页面上 UE.I18N[‘zh-cn’] 的后面

在这里插入图片描述

    'setcellattribute':{
        'static' :{

        }
    },

修改英文类似操作

添加CSS样式–ueditor.css

打开 ueditor.css
在配置 .edui-icon 的CSS的地方添加

在这里插入图片描述

.edui-default  .edui-for-setcellattribute .edui-icon {
    background-position: -700px -40px;
}

在配置 .edui-dialog-content 的CSS的地方添加如下

在这里插入图片描述

/*数据类型*/
.edui-default .edui-for-setcellattribute .edui-dialog-content {
    width: 240px;
    height: 150px;
}

开放属性白名单–ueditor.config.js

之前在 ueditor.all.js 配置 command的时候使用了cell的 cellattribute 属性现在添加上白名单
修改 ueditor.config.js
在withList找到 td

在这里插入图片描述
在这里插入图片描述

在td里面添加 cellattribute即可

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ueditor富文本编辑器客制化功能添加 的相关文章

  • u8客户端怎么修改服务器ip,u8服务器ip地址在哪修改

    u8服务器ip地址在哪修改 内容精选 换一换 在Mind Studio所在服务器上配置路由规则 允许转发开发者板的IP报文 开发者板上则需要配置一下路由地址 即Mind Studio所在服务器的IP地址 Mind Studio所在服务器侧配
  • STM32F4_nRF24L01无线通讯

    目录 前言 1 nRF24L01无线模块简介 2 nRF24L01状态机 3 nRF24L01模式 4 nRF24L01的SPI配置 4 1 nRF24L01 Rx 和 Tx 的初始化配置 4 2 nRF24L01相关寄存器 5 硬件连接
  • Spark基础学习笔记:SparkSQL词频统计

    目录 一 使用Spark SQL实现词频统计 一 数据源 words txt 四 修改源目录名称 六 创建词频统计单例对象 七 启动程序 查看结果 一 使用Spark SQL实现词频统计
  • 哥斯拉jsp马分析

    前言 这篇文章分析了哥斯拉jsp马的特征原理 写这篇文章的初衷在提高对哥斯拉马的识别 改造能力 笔者接触安全的时间较短 难免会有疏漏 恳请发现问题的大佬给予指正 哥斯拉PHP马解析可以看这篇文章 https blog csdn net ze
  • python3 题解(28 级数法求圆周率)

    级数法求圆周率 问题 圆周率是十分重要的常数 它是个无理数 无法表示为有限小数的形式 但 我们可以表示它的近似值 可以用无穷级数去逼近它 pi 的级数公式十分多 下面给出3个较简单的 2 6 1 1 2 1 2 2 1 3 2 frac p
  • 经纬高(LLA)坐标系地心地固(ECEF)坐标系与东北天(ENU)坐标系转换

    前段时间在做水下机器人项目 添加了RTK 读取到的数据为经纬高坐标系中度分形式的经纬度信息 无法直接用于定位 还需要进行坐标系的转换 后来在学习Cartographer时处理GPS数据也有提到这方面的知识 于是决定汇总到一起进行学习 下文将
  • HTML文本格式化

    目录 HTML 文本格式化实例 如何查看 HTML 源码 文本格式化标签 计算机输出 标签 引用 引用和术语定义 延伸阅读 一个完整的实例 HTML 可定义很多供格式化输出的元素 比如粗体和斜体字 下面有很多例子 可以亲自试试 HTML 文

随机推荐

  • SpringMVC中Controller层注解扫描

    SpringMVC中Controller层扫描 方式一 方式二
  • mysql基于Java web的电动车销售平台毕业设计源码201524

    电动车销售平台的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径 但是途径的扩展基本上为人们所努力的方向 由于站在的角度存在偏差 人们经常能够获得不同类型信息 这也是技术最为难以攻克的课题 针对电动车销售平台等问题 对电动车销售
  • 论文研读:SuperGlue vs. LoFTR

    简介 SupeGlue与LoFTR都是对图片间进行特征点匹配的方法 其目的是 找到图像A 图像B中同时存在的相同物体实例 并输出其位置信息 匹配关系 在提取出特征点后 我们通过图神经网络生成匹配代价矩阵 并求解最优匹配矩阵 以获得全局最优的
  • 1.3 起步 - Git 基础

    1 3 起步 Git 基础 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 18 初稿 目录 文章目录 1 3 起步 Git 基础 版本说明 目录 Git 基础 1 直接记录快照 而非差异比较 Figure 4 存储每个文
  • python报错:ValueError: not enough values to unpack

    报错 ValueError not enough values to unpack 分析具体原因 这个错误的信息是 期望有7个返回值 但其实函数只有4个返回值 解决方法 检查函数和接收函数返回值的参数个数是否一致 改成一致即可
  • MySQL - 一文了解MySQL的基础架构及各个组件的作用

    1 概述 不管是开运 运维 测试 都或多或少的要接触MySQL 了解MySQL的基础架构及各个组件之间的关系 有助于我们更加深入的理解MySQL 下面由一张MySQL基础架构图来一起走进MySQL MySQL可以基本划分为Server层和存
  • helm的安装、使用以及自定义Chart

    Helm概述 Helm 是一个 Kubernetes 的包管理工具 类似 Linux 的包管理器 如RedHat系的yum Debian的apt 可以很方便的将之前打包好的 yaml 文件部署到 Kubernetes 上 Helm主要解决以
  • Open3D 基于法线的双边滤波

    目录 一 算法原理 1 算法概述 2 计算步骤 3 参考文献 二 代码实现 三 结果展示 1 原始点云 2 滤波结果 四 相关链接 一 算法原理 1 算法概述 Fleishman 等人提出一种网格双边滤波器 双边滤波器最早应用于灰度图像 该
  • Linux下挂在SATA硬盘时的诡异现象

    ata1 SATA link down SStatus 1 SControl 300 ata1 EH complete ata1 exception Emask 0x10 SAct 0x0 SErr 0x4000000 action 0xa
  • Windows下配置Mask-RCNN环境(各种踩过的坑)

    Windows下配置Mask RCNN pytorch环境 各种踩过的坑 安装Anaconda 1 1 下载和安装Anaconda 安装maskrcnn benchmark项目 2 1 官方建议的安装需求 2 2 逐步安装过程 1 创建虚拟
  • TCP通讯客户端怎样判断与服务器端断开,该如何处理

    TCP通讯客户端怎样判断与服务器端断开 大虾们 神们 C winform里面 采用多线程监听端口 接收方式为阻塞式 创建单一线程进行监听函数 这样阻塞时只阻塞单一线程 对主线程没有影响 并使用异步通信模式 来一个连接后回调函数进行解析入库
  • 动态修改模板字符串中图片--简单解决

    document addEventListener error function e var elem e target if elem id toLowerCase imgurl infowindow 在这内部可以发请求拿到动态的地址 i
  • IP地址,子网掩码、默认网关,DNS的设置和工作原理(总结)

    概念 1 概述 IP地址 人们在Internet上为了区分数以亿计的主机而给每台主机分配的一个专门的地址 通过IP地址就可以访问到每台主机 子网掩码 不能单独存在 它必须结合IP地址一起使用 子网掩码只有一个作用 就是将某个IP地址划分成网
  • Blender教程之魔方全自动特效教学

    魔方玩家在我看来分为三种 一是不懂原理的佛系玩家 三阶魔方可能都要拧很久才能还原 第二种是明白怎么玩的玩家 其实还原一个被打乱的魔方就是做一道层先法的数学题 而第三种就是像我这样虽然不懂解密 但会用Blender做一个魔方来让它 自动还原
  • Android Bluetooth

    Android Bluetooth 使用Android蓝牙API来进行蓝牙通信的四个任务 设置蓝牙 检索周围匹配的或者可用的设备 连接设备 设备间传输数据 所有蓝牙APIs在android bluetooth 包中 创建蓝牙连接所要用到的类
  • 一、人脸识别starter-需求分析

    一 需求来源 对于一些需要本人刷脸认证的场景 比如注册时需要刷脸认证 要求上传身份证必须是本人的 等此场景 二 需求分析 考虑到这是个单独并且可复用的模块 所以决定写一个springboot starter来实现 starter可以上传到自
  • 定位、浮动

    Position 定位 一 position 1 属性描述 设置或获取元素的定位方式 2 版本变更 有 3 语法模板 position static relative absolute fixed 4 默认值 static 尽量避开影响其他
  • C++编译知识笔记(一)——基本知识

    文章目录 一 编译的基本步骤 1 1 预处理阶段 1 2 编译阶段 1 3 汇编阶段 1 4 链接阶段 二 核心常用基本概念 2 1 o目标文件 2 2 符号 2 3 静态链接库 2 4 动态链接库 三 链接和加载 3 1 o文件和静态库的
  • python 内置函数——enumerate( )函数

    发音 nu m re t 枚举 列举 enumerate 是python的内置函数 适用于python2 x和python3 x 用来将一个可迭代对象转化为枚举对象 利用它可以同时获得每个元素的索引下标和值 即需要 index 和 valu
  • Ueditor富文本编辑器客制化功能添加

    文章目录 ueditor简介 主要配置文件 要实现的功能展示 实现过程 修改 ueditor all js 配置页面的内容 setcellattribute html 添加多语言配置 添加CSS样式 ueditor css 开放属性白名单