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

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

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

我的工具列表变量

复制代码
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('当前参数未配置,请联系管理员配置!')
    }
  });
} 
相关推荐
笑远7 小时前
Vim/Vi 常用命令速查手册
linux·编辑器·vim
Ven%7 小时前
vscode报错:unins000.exe 尝试在目标目录创建文件时发生一个错误
ide·vscode·编辑器
小麟有点小靈7 小时前
VSCode写java时常用的快捷键
java·vscode·编辑器
持之以恒的天秤11 小时前
yum的基本操作和vim指令
linux·编辑器·vim
良人眷13 小时前
win10win11启用组策略编辑器
windows·编辑器
serene131217 小时前
HL7消息编辑器的使用手册
物联网·编辑器·hl7·医疗消息·医疗协议·医疗通信
辞.九门回忆17 小时前
obsidian写文章的图床设置方法
vscode·编辑器
binary思维1 天前
Vim 使用全攻略:从入门到精通
编辑器·vim
风为你而吹1 天前
【玩泰山派】MISC(杂项)- 使用vscode远程连接泰山派进行开发
ide·vscode·编辑器
向宇it1 天前
【unity游戏开发入门到精通——UGUI】CanvasScaler画布缩放器组件
游戏·unity·c#·编辑器·游戏引擎