【问题标题】:Add an HTML element only once in CKEditor在 CKEditor 中只添加一次 HTML 元素
【发布时间】:2018-07-04 13:15:16
【问题描述】:

在我的 ckeditor 实例中,我想让我的用户插入一条水平线,但只能插入一次。如果存在现有行,则应将其替换为新行(与 Wordpress 上的 Read-More 功能相同)。如果我只希望保留最后一个 HR 标签,我可以让它工作,但如果用户想要将他的 HR 标签插入到文档中比现有标签更高的位置怎么办?

我在实例化时使用了一个变量(例如,savedContent)来存储默认内容(没有任何 HR)。按照Set cursor to specific position in CKEditor 中的步骤,我的想法是使用 savedContent 变量将 CKEditor 内容恢复为默认的 HR-less 内容,然后(使用范围或书签)在光标位置插入新的 HR。

这是代码:

CKEDITOR.on('instanceReady', function() {
    $(".cke_button__horizontalrule").attr("title","End Preview here");
    var savedContent = CKEDITOR.instances['pro_story'].getData();

    $(".cke_button__horizontalrule").on("click",function(){
        var ranges = editor.getSelection().getRanges();
        CKEDITOR.instances['pro_story'].setData(savedContent);
        editor.getSelection().selectRanges( ranges );
        editor.insertHtml("<hr />");
    });
});

现在这段代码的问题是,由于某种原因,它给了我以下错误:给定的范围不在文档中。

我该怎么办?

【问题讨论】:

    标签: javascript jquery ckeditor cursor-position


    【解决方案1】:

    在插入新标签之前获取现有&lt;hr /&gt; 标签的数组。然后,在插入新标签后删除所有这些标签。

    let hrArray;
    
    CKEDITOR.instances['pro_story'].on('beforeCommandExec', function(evt) {
        if (evt.data.name == 'horizontalrule') {
            hrArray = evt.editor.document.getElementsByTag('hr').toArray();
        }
    });
    
    CKEDITOR.instances['pro_story'].on('afterCommandExec', function(evt) {
        if (evt.data.name == 'horizontalrule') {
            hrArray.forEach(el => el.remove());
        }
    });
    

    【讨论】:

    • 优秀的解决方案!谢谢你。使用它而不是我自己的解决方法,其中涉及在光标位置插入自定义字符串,使用字符串替换删除所有其他 HR 标签,然后将自定义字符串转换为 HR 标签。它不仅会弄乱插入点两侧的 P 标签,还会将光标位置重置到文档的顶部。这个解决方案非常干净,不会与其他 P 标签混淆。
    猜你喜欢
    • 2014-06-06
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2017-06-14
    • 2016-02-29
    相关资源
    最近更新 更多