基于ueditor编辑器的功能开发之增加自定义一键排版功能

news2025/4/18 9:51:23

用户有自己的文章格式,要求复制或者粘贴进来的文章能够一键排版,不需要手动调试

这个需求的话咱们就需要自己去注册一个事件啦,这里我没有修改源码,而是在编辑器初始化之后给他注册了一个事件

我的工具列表变量

vue组件中data中定义的变量
data(){
    return {
      aiList: [
        {name:'AIwrite',className:'edui-for-ai_writing',title:'一键排版',httpType:'AI_WRITING_ADDRESS'},
        // {name:'AIvoice',className:'edui-for-ai_voice',title:'AI语音',httpType:'AI_VOICE_ADDRESS'},
        // {name:'AIdraw',className:'edui-for-ai_AIdraw',title:'AI绘图',httpType:'AI_DRAWING_ADDRESS'},
        // {name:'AIvideo',className:'edui-for-AIvideo',title:'AI视频',httpType:'AI_VIDEO_ADDRESS'},
        // {name:'AIzhineng',className:'edui-for-AIzhineng',title:'AI智能',httpType:'AI_BRAINPOWER_ADDRESS'},
        // {name:'AIroom',className:'edui-for-AIroom',title:'AI实验室',httpType:'AI_LABORATORY_ADDRESS'},
        // {name:'AImore',className:'edui-for-AImore',title:'更多',httpType:'AI_MORE_ADDRESS'},
      ]
    }
}

    registerUIYiJian(){  //当window对象已经挂在的ueditor的实例时调用此方法,在iframe.css中去调整自定义按钮的样式
      let _this = this
      window.UE.registerUI( _this.aiList[0].name ,function(editor,uiName){
        var btn = new UE.ui.Button({
            name:'btn-dialog-' + uiName,
            className:_this.aiList[0].className,
            title:_this.aiList[0].title,
            onclick:function () {
                // AIwrite = window.open('https://www.baidu.com')
                _this.httpRequest(_this.aiList[0].httpType)
            }
        });
        return btn;
      },undefined);
    },

httpRequest中的逻辑主要是对稿件样式进行处理,添加自己的自定义类名之后,然后去iframe.css加上自己的样式即可

   // 一键排版功能
    oneClickLayout(){
      console.log(this.editor,'当前的编辑器内容')
      if(this.editor.body.childNodes.length > 0){
        // 说明当前文章有内容
        for (let i = 0; i < this.editor.body.childNodes.length; i++) {
          console.log(this.editor.body.childNodes[i],'当前的p标签有哪些元素')
          // 获取标签内容重新组装html结构填充到编辑器中
          this.editor.body.childNodes[i].classList.remove()
          this.editor.body.childNodes[i].removeAttribute('style')
          // 给最外层的标签加上我的目标样式
          this.editor.body.childNodes[i].classList.add('mystyle')
          this.clearCssStyle(this.editor.body.childNodes[i])
        }
      }  
    },
    // 递归去除所有标签的行内样式和类名
    clearCssStyle(node){
      if(node.childNodes.length == 0) return 
      for (let i = 0; i < node.childNodes.length; i++) {
        if('classList' in node.childNodes[i]){
          node.childNodes[i].classList.remove()
        }
        if('style' in node.childNodes[i]){
          node.childNodes[i].removeAttribute('style')
        }
      }
    },

我移除了编辑器所有的类名和行内样式,增加了mystyle类名

一键排版就完成了 。

此外我还注册过其他功能,业务代码的话其实没啥好说的,主要是注册的方法的使用,比如之前还注册过一些ai的功能以及和135编辑器的一些交互

/*
 * @description  : write something
 * @Author       : snoop-dog
 * @Date         : 2021-12-06 11:39:53
 * @LastEditors  : snoop-dog
 * @LastEditTime : 2021-12-06 14:15:39
 * @FilePath     : 135editor.js
 */

UE.registerUI('135editor',function(editor,uiName){
  // var dialog = new UE.ui.Dialog({
  //     iframeUrl: editor.options.UEDITOR_HOME_URL+'dialogs/135editor/135EditorDialogPage.html',
  //     cssRules:"width:"+ parseInt(document.body.clientWidth*0.9) +"px;height:"+(window.innerHeight -50)+"px;",
  //     editor:editor,
  //     name:uiName,
  //     title:"135缂栬緫鍣�"
  // });
  // dialog.fullscreen = false;
  // dialog.draggable = false;

  var editor135;
  function onContentFrom135(event) {
      if (typeof event.data !== 'string') {
          if(event.data.ready) {
              editor135.postMessage(editor.getContent(),'*');
          }
          return;
      };

      if(event.data.indexOf('<') !== 0) return;

      editor.setContent(event.data);
      editor.fireEvent("catchRemoteImage");
      window.removeEventListener('message', onContentFrom135);
  }

  var btn = new UE.ui.Button({
      name:'btn-dialog-' + uiName,
      className:'edui-for-135editor',
      title:'135编辑器',
      onclick:function () {
          // dialog.render();
          // dialog.open();
          // 鐢变簬鐧诲綍瀛樺湪璺ㄥ煙闂锛岃浣跨敤濡備笅鏂瑰紡璋冪敤135缂栬緫鍣�
          editor135 = window.open('https://www.135editor.com/simple_editor.html?callback=true&appkey=')

          window.removeEventListener('message', onContentFrom135);
          window.addEventListener('message', onContentFrom135, false);
      }
  });
  return btn;
},undefined);
// ai写作
var aiList = [
  {name:'AIwrite',className:'edui-for-ai_writing',title:'AI写作',httpType:'AI_WRITING_ADDRESS'},
  {name:'AIvoice',className:'edui-for-ai_voice',title:'AI语音',httpType:'AI_VOICE_ADDRESS'},
  {name:'AIdraw',className:'edui-for-ai_AIdraw',title:'AI绘图',httpType:'AI_DRAWING_ADDRESS'},
  {name:'AIvideo',className:'edui-for-AIvideo',title:'AI视频',httpType:'AI_VIDEO_ADDRESS'},
  {name:'AIzhineng',className:'edui-for-AIzhineng',title:'AI智能',httpType:'AI_BRAINPOWER_ADDRESS'},
  {name:'AIroom',className:'edui-for-AIroom',title:'AI实验室',httpType:'AI_LABORATORY_ADDRESS'},
  {name:'AImore',className:'edui-for-AImore',title:'更多',httpType:'AI_MORE_ADDRESS'},
]
for (let i = 0; i < aiList.length; i++) {
  UE.registerUI( aiList[i].name ,function(editor,uiName){
    var btn = new UE.ui.Button({
        name:'btn-dialog-' + uiName,
        className:aiList[i].className,
        title:aiList[i].title,
        onclick:function () {
            // AIwrite = window.open('https://www.baidu.com')
            httpRequest(aiList[i].httpType)
        }
    });
    return btn;
  },undefined);
}
// 原生js发送请求
function httpRequest(code){
  var currentUser = JSON.parse(localStorage.getItem("login_casData"))
  var url = window.location.origin +'/' +window.location.pathname.split('/')[1]+'/dyportalserver/ParameterController/getParameter'
  var formdata = new FormData()
  formdata.append('parameterCode',code)
  $.ajax({
    type: 'POST',
    url: url,
    data: formdata,
    contentType: false,
    processData: false,
    headers:{
      'tenantId': currentUser.tenantId,
      'token': currentUser.token,
      'userId': encodeURIComponent(currentUser.userId),
      'userName': encodeURIComponent(currentUser.userName),
      'X-Requested-With': 'XMLHttpRequest',
      'newseditingsuite-header': true
    },
    success: function(data) {
      console.log(data,'当前接口是否成功')
      if(data.status){
        var targetUrl = data.data[0].parameterValue
        // 通知vue打开弹框,利用广播进行通信
        localStorage.setItem('openVueDialog',targetUrl)
        console.log('asdfasf',window.vm)
        const channel = new BroadcastChannel('updataCatalogTask') 
        let obj = {
          url:targetUrl,
        }
        if(code === 'AI_WRITING_ADDRESS'){
          obj.type = true
        } else {
          obj.type = false
        }
        channel.postMessage(obj)
      } else {
        alert('当前参数未配置,请联系管理员配置!')
      }
    },
    error: function(jqXHR, textStatus, errorThrown) {
      alert('当前参数未配置,请联系管理员配置!')
    }
  });
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS Code Markdown渲染配置

VS code markdown preview enhanced插件渲染配置 mac: commandshiftP命令输入Markdown Preview Enhanced: Customize CSS&#xff0c;并点击在打开的style.less配置文件添加一下配置 /* Please visit the URL below for more information: */ /* https://shd101wyy.github.…

数据结构篇:线性表的另一表达—链表之单链表(上篇)

目录 1.链表的引入 1.1 链表的概念 1.2 next的意义 2.链表的分类 3.单链表的实现 3.1 单链表实现接口 3.1.1 插入节点函数封装 3.1.2 尾插 3.1.3 头插 3.1.4 报错的根本问题 3.1.5 头删 3.1.6 尾删 4.小结 1.链表的引入 根据顺序表的一些缺陷…

SpringBoot企业级开发之【用户模块-获取用户详细信息】

接口文档的要求&#xff1a; 了解一下token令牌头是怎么用的 我们直接放到前端交互的controller类下&#xff0c;在声明的方法中加入参数为String token且加入注解RequestHeader(name"Authorization【你自己设定的token】") 设计思路: 实战开发&#xff1a; control…

Mockito如何对静态方法进行测试

在 Mockito 中,直接对静态方法进行模拟是困难的,因为 Mockito 的设计理念是优先通过依赖注入(DI)管理对象,而静态方法破坏了这种设计(难以解耦)。不过,从 Mockito 3.4.0 版本开始,通过 mockStatic 方法支持了对静态方法的模拟(需配合 mockito-inline 依赖)。 从 Mo…

Navicat 17 for Mac 数据库管理

Navicat 17 for Mac 数据库管理 一、介绍 Navicat Premium 17 for Mac是一款专业的数据库管理工具&#xff0c;适用于开发人员、数据库管理员和分析师等用户。它提供了强大的数据管理功能和丰富的工具&#xff0c;使用户能够轻松地管理和维护数据库&#xff0c;提高数据处理效…

grok 驱动级键盘按键记录器分析

grok是一个驱动模块&#xff0c;其主要功能就行进行键盘按键及剪切板数据的记录&#xff0c;也就是一个键盘记录器。实现原理是通过对shadow-ssdt的相关函数进行hook,和r3对GetUserMessage进行hook的原理差不多。 关键部分如下&#xff1a; 查找csrss.exe进程是否已经启动&…

MyBatis中特殊符号处理总结

前言 MyBatis 是一款流行的Java持久层框架&#xff0c;广泛应用于各种类型的项目中。因为我们在日常代码 MyBatis 动态拼接语句时&#xff0c;会经常使用到 大于(>,>)、小于(<,<)、不等于(<>、!)操作符号。由于此符号包含了尖括号&#xff0c;而 MyBatis 使用…

MYSQL——SQL语句到底怎么执行

查询语句执行流程 MySQL 查询语句执行流程 查询缓存&#xff08;Query Cache&#xff09; MySQL内部自带了一个缓存模块&#xff0c;默认是关闭的。主要是因为MySQL自带的缓存应用场景有限。 它要求SQL语句必须一摸一样表里面的任何一条数据发生变化时&#xff0c;该表所有缓…

智能血压计WT2801芯片方案-BLE 5.0无线传输、高保真语音交互、LED显示驱动、低功耗待机四大技术赋能

在智能健康设备飞速发展的今天&#xff0c;血压计早已不再是简单的“测量工具”&#xff0c;而是家庭健康的“智能管家”。然而&#xff0c;一台真正可靠、易用、功能全面的血压计&#xff0c;离不开一颗强大的“核心芯片”。 今天&#xff0c;我们揭秘医疗级芯片WT2801的硬核实…

基于51单片机的智能火灾报警系统—温度烟雾检测、数码管显示、手动报警

基于51单片机的火灾报警系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 由51单片机MQ-2烟雾传感ADC0832模数转换芯片DS18B20温度传感器数码管显示按键模块声光报警模块构成 具体功能&#xff1a;…

指定运行级别

linux系统下有7种运行级别,我们需要来了解一下常用的运行级别,方便我们熟悉以后的部署环境,话不多说,来看. 开机流程&#xff1a; 指定数级别 基本介绍 运行级别说明: 0:关机 相当于shutdown -h now ⭐️默认参数不能设置为0,否则系统无法正常启动 1:单用户(用于找回丢…

Python标准库:sys模块深入解析

sys模块是Python标准库中一个非常重要的内置模块&#xff0c;它提供了与Python解释器及其环境交互的多种功能。本文将深入探讨sys模块的各个方面&#xff0c;帮助开发者更好地理解和利用这个强大的工具。 1. sys模块概述 sys模块提供了对由解释器使用或维护的变量的访问&…

加油站小程序实战教程10开通会员

目录 1 修改用户登录逻辑2 创建变量3 调用API总结 我们上一篇搭建了开通会员的界面&#xff0c;有了界面的时候就需要加入一些逻辑来控制界面显示。我们的逻辑是当用户打开我的页面的时候&#xff0c;在页面加载完毕后调用API看用户是否已经开通会员了&#xff0c;如果未开通就…

没有他的“变换”,就没有今天的人工智能

从ChatGPT发布以来&#xff0c;大语言模型&#xff08;LLM&#xff09;是所有人追逐的方向&#xff0c;无论是将其看作“万能神”或是人工智能应用的基础构件&#xff0c;其重要性毋庸置疑。而随着大语言模型扩展到多模态领域&#xff0c;就需要更多的工具来帮助其进行处理。 例…

MCP 实战:实现server端,并在cline调用

本文动手实现一个简单的MCP服务端的编写&#xff0c;并通过MCP Server 实现成绩查询的调用。 一、配置环境 安装mcp和uv, mcp要求python版本 Python >3.10; pip install mcppip install uv 二、编写并启用服务端 # get_score.py from mcp.server.fastmcp import…

关于C++日志库spdlog

关于C日志库spdlog spdlog是一个高性能、易于使用的C日志库&#xff0c;广泛应用于现代C项目中。它支持多线程、异步日志记录、多种日志格式、以及灵活的输出方式&#xff08;如控制台、文件、甚至自定义输出&#xff09;。下面将就常用功能方面介绍spdlog的安装、配置和使用方…

回归预测 | Matlab实现RIME-CNN-GRU-Attention霜冰优化卷积门控循环单元注意力机制多变量回归预测

回归预测 | Matlab实现RIME-CNN-GRU-Attention霜冰优化卷积门控循环单元注意力机制多变量回归预测 目录 回归预测 | Matlab实现RIME-CNN-GRU-Attention霜冰优化卷积门控循环单元注意力机制多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME…

液氮恒温器是做什么的

‌液氮恒温器‌是一种利用液氮作为冷源的恒温装置&#xff0c;主要用于提供低温、恒温或变温环境&#xff0c;广泛应用于科研、工业和医疗等领域。液氮恒温器通过液氮的低温特性来实现降温效果&#xff0c;具有效率高、降温速度快、振动小、成本低等优点。 液氮恒温器应用场景和…

`mpi4py` 是什么; ModuleNotFoundError: No module named ‘mpi4py

mpi4py 是什么 目录 `mpi4py` 是什么ModuleNotFoundError: No module named mpi4pyModuleNotFoundError: No module named mpi4py mpi4py 是一个 Python 模块,它提供了对 MPI(Message Passing Interface)标准的接口,使得 Python 程序能够利用 MPI 进行并行计算。其作用主要…

大数据 - 1. 概述

早期的计算机&#xff08;上世纪70年代前&#xff09; 是相互独立的&#xff0c;各自处理各自的数据上世纪70年代后&#xff0c;出现了基于TCP/IP协议的小规模的计算机互联互通。上世纪90年代后&#xff0c;全球互联的互联网出现。当全球互联网逐步建成&#xff08;2000年左右&…