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

背景

由于项目的需求使用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 parentNode
                            let html = []
                            const copyNodes = [...Array.from(iframe.body.childNodes)]

                            iframe.body.innerHTML = ''
                          copyNodes.forEach(el => {
                               if (!parentNode) parentNode = el.parentNode
                               if (el.nodeType === 3) {
                                   const span = document.createElement('span')
                                   span.innerText = el.textContent
                                   span.style.display='block'
                                   span.style.marginBottom = val
                                   console.log(iframe.body, span)
                                  iframe.body.appendChild(span)
                                   // el.parentNode.replaceChild(span, node)
                               }else {
                                   el.style.display = 'block'
                                   el.style.marginBottom = val
                                  iframe.body.appendChild(el)
                               }
                           })


                        }
                        self.updateState();
                        self.addBookmark();
                        self.hideMenu();
                    }
                });
            });
        });
    });
});

效果图

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

相关推荐
zhangfeng11331 小时前
WebIDE 容器中 AtomCode 报 `ATOMCODE_SIG_STALE` 排查实录:一次由 8 小时时钟偏差引发的“悬案”
编辑器·ai编程·atomcode
山峰哥19 小时前
数据库工程与查询优化案例深度复盘‌
数据库·sql·oracle·编辑器·深度优先·宽度优先
javgo.cn1 天前
Markweave:开源 Markdown-first WYSIWYG 编辑器
开源·编辑器
YZJenny2 天前
在服务器上安装使用code-server(Web 版 VS Code)
ide·vscode·编辑器
zhangfeng11332 天前
nano vim 有没有快速编辑的 方式 比如鼠标选择 ,然后快速修改 替换
编辑器·vim
salestina2 天前
vscode迁移扩展目录
ide·vscode·编辑器
山峰哥2 天前
数据库工程:Explain执行计划对比调优实战‌
大数据·数据库·sql·编辑器·深度优先
Molesidy3 天前
【Embedded Development】基于VSCode+IAR插件的IAR工程开发环境的搭建
ide·vscode·编辑器
泛凡(Linyongui)3 天前
告别原始编辑器:VS Code 搭建 中微CMS IDE 编译环境完整指南
ide·单片机·编辑器
也曾看到过繁星3 天前
Linux---vim 编辑器
linux·编辑器·vim