fastadmin集成kindeditor编辑器解决段后距问题--全网唯一

news/2024/12/15 19:19:14/

背景

       由于项目的需求使用fastadmin推荐的编辑器kindeditor,使用过程中发现没有段后距这个bug。查询搜索了所有的网上来源,都没有解决方案。鉴宇客户非常需要该功能,奋战几天写端代码实现了该功能。

插件实现    

KindEditor.plugin('paragraph', function(K) {var self = this, name = 'paragraph', lang = self.lang(name + '.');self.clickToolbar(name, function() {const iframe = document.querySelector("iframe").contentDocument;var curVal = '', commonNode = self.cmd.commonNode({'*' : '.line-height'});if (commonNode) {curVal = commonNode.css('margin-bottom');}var menu = self.createMenu({name : name,width : 150});K.each(lang.paragaph, function(i, row) {K.each(row, function(key, val) {menu.addItem({title : val,checked : curVal === key + 'px',click : function() {// wrapTextNodes(iframe.body)self.cmd.toggle('<span style="margin-bottom:' + key + 'px;display: block"></span>', {span : '.margin-bottom=' + key});const words = iframe.getSelection().toString()if (iframe.getSelection().rangeCount > 1) {var range = iframe.getSelection().getRangeAt(0);var selectedElement = range.commonAncestorContainer;if (selectedElement.nodeType === Node.TEXT_NODE) {selectedElement = selectedElement.parentNode;}const tag = iframe.body.querySelectorAll("p");const wordsList = words.split("\n\n");let choseCount = 0;for (const el of Array.from(tag)) {let hasChose = false;for (const text of wordsList) {if (el.textContent === text) hasChose = true;}choseCount += hasChose ? 1 : 0;if (hasChose === true) {el.style.marginBottom = curVal + 'px';el.classList.add('selectedMenuItem'); // 添加选中效果} else {el.classList.remove('selectedMenuItem'); // 移除选中效果}}} else {let parentNodelet html = []const copyNodes = [...Array.from(iframe.body.childNodes)]iframe.body.innerHTML = ''copyNodes.forEach(el => {if (!parentNode) parentNode = el.parentNodeif (el.nodeType === 3) {const span = document.createElement('span')span.innerText = el.textContentspan.style.display='block'span.style.marginBottom = valconsole.log(iframe.body, span)iframe.body.appendChild(span)// el.parentNode.replaceChild(span, node)}else {el.style.display = 'block'el.style.marginBottom = valiframe.body.appendChild(el)}})}self.updateState();self.addBookmark();self.hideMenu();}});});});});
});

效果图

初步达到预期效果。后期还有优化地方,共同努力。


http://www.ppmy.cn/news/1555383.html

相关文章

机器视觉 (深度学习 - 目标查找Faster R-CNN)

深度学习目标搜索&#xff0c;在工业上常被用于目标跟踪、缺陷定位等应用。 Faster R-CNN是目标查找算法中更高精度的应用。Faster R-CNN很多都是用Python来实现&#xff0c;下面发一个TensorFlow 实现Faster R-CNN的代码。 import tensorflow as tf from tensorflow.keras i…

Mac上安装illustrator 2025/2024总是提示130/131/已损坏等解决方法

最近总有人问我&#xff0c;重装illustrator 2025/2024版本的时候&#xff0c;第一次安装特别顺利&#xff0c;第二次重装就是各种错误不断&#xff0c;怎么也安装不上&#xff1f;今天给大家汇总下常出现的错误提示解决方法&#xff1a; 1."xxx"已损坏&#xff0c;无…

C#_泛型方法的定义及使用

在C#语言中泛型方法是指通过泛型来约束方法中的参数类型&#xff0c;也可以理解为对数据类型设置了参数。 如果没有泛型&#xff0c;每次方法中的参数类型都是固定的&#xff0c;不能随意更改。 在使用泛型后&#xff0c;方法中的数据类型则有指定的泛型来约束&#xff0c;既…

深入理解网络通信和TCPIP协议

网络协议 计算机网络是什么&#xff1f; 随着计算机技术发展&#xff0c;计算机的体积和价格都在下降&#xff0c;之前计算机多用于研究机构&#xff0c;现阶段逐步进入一般的公司用于办公。原来计算机之间传输数据需要通过软盘等第三方存储介质进行转存&#xff0c;人们需要…

@JsonSerialize失效解决

当在实体类中加入这个注解时&#xff0c;本意是想如果是空值则返回0给页面&#xff0c;但是发现使用 JsonSerialize(using BigSerializer.class)无效&#xff0c;因为如果是null值会不走序列化的接口实现类&#xff0c;需要使用nullUsing 需要这样使用

scroll-view 实现滑动显示,确保超出正常显示,小程序app,h5兼容

在uniapp 开开发的项目中&#xff0c;滑动操作是很多的 1.在插件市场使用了几款插件&#xff0c;但是都不太好用&#xff0c;要么是 显示的tab 过多&#xff0c;滑动到最后一个&#xff0c;当前显示那个跑左边显示不全&#xff0c;要么是滑动到最后一个后面的无法自动滑动&…

基于Vue3的组件封装技巧分享

1、需求说明 需求背景&#xff1a;日常开发中&#xff0c;我们经常会使用一些UI组件库诸如and design vue、element plus等辅助开发&#xff0c;提升效率。有时我们需要进行个性化封装&#xff0c;以满足在项目中大量使用的需求。 错误示范&#xff1a;基于a-modal封装一个自定…

集合(全)

1.集合体系结构&#xff08;分为单列和双列&#xff09; 单列集合是指添加数据时只能添加一个&#xff0c;双列集合是每次添加一对集合。 2.单列集合&#xff08;collections) &#xff08;1&#xff09;List系列&#xff1a;添加的元素是有序&#xff0c;可重复&#xff0c;…