7

我正在寻找一种使 CKEDITOR 所见即所得内容具有交互性的方法。这意味着例如将一些 onclick 事件添加到特定元素。我可以做这样的事情:

CKEDITOR.instances['editor1'].document.getById('someid').setAttribute('onclick','alert("blabla")');

处理此操作后,效果很好。但因此,如果我将模式更改为源模式,然后返回到所见即所得模式,则 javascript 将无法运行。onclick 动作在源模式中仍然可见,但不会在 textarea 元素内呈现。

然而,有趣的是,这每次都能正常工作:

CKEDITOR.instances['editor1'].document.getById('id1').setAttribute('style','cursor: pointer;');

而且它也不会在 textarea 元素中呈现!这怎么可能?使用 CKEDITOR 内容元素的 onclick 和 onmouse 事件的最佳方式是什么?

我尝试通过源模式手动编写:

    <html>
    <head>
        <title></title>
    </head>
    <body>
        <p>
            This is some <strong id="id1" onclick="alert('blabla');" style="cursor: pointer;">sample text</strong>. You are using <a href="http://ckeditor.com/">CKEditor</a>.</p>
    </body>
</html>

并且 Javascript(onclick 操作)不起作用。有任何想法吗?

非常感谢!

我的最终解决方案:

               editor.on('contentDom', function() {
                var elements = editor.document.getElementsByTag('span');
                for (var i = 0, c = elements.count(); i < c; i++) {
                    var e = new CKEDITOR.dom.element(elements.$.item(i));
                    if (hasSemanticAttribute(e)) {
                        // leve tlacitko mysi - obsluha
                        e.on('click', function() {
                            if (this.getAttribute('class') === marked) {
                                if (editor.document.$.getElementsByClassName(marked_unique).length > 0) {
                                    this.removeAttribute('class');
                                } else {
                                    this.setAttribute('class', marked_unique);
                                }
                            } else if (this.getAttribute('class') === marked_unique) {
                                this.removeAttribute('class');
                            } else {
                                this.setAttribute('class', marked);
                            }
                        });
                    }
                }
            });
4

1 回答 1

13

过滤(仅 CKEditor >=4.1)

此属性已被删除,因为 CKEditor 不允许它。此过滤系统称为高级内容过滤器,您可以在此处阅读:

简而言之 - 您需要配置编辑器以允许onclick某些元素的属性。例如:

CKEDITOR.replace( 'editor1', {
    extraAllowedContent: 'strong[onclick]'
} );

在这里阅读更多:config.extraAllowedContent

on*CKEditor 中的属性

CKEditoron*在加载内容时对属性进行编码,因此它们不会破坏编辑功能。例如,onmouseout成为data-cke-pa-onmouseout编辑器内部,然后,当从编辑器获取数据时,此属性被解码。

对此没有配置选项,因为它没有意义。

注意:当您为编辑器的可编辑元素内的元素设置属性时,您应该将其设置为受保护的格式:

element.setAttribute( 'data-cke-pa-onclick', 'alert("blabla")' );

CKEditor 中的可点击元素

如果您想在编辑器中观察点击事件,那么这是正确的解决方案:

editor.on( 'contentDom', function() {
    var element = editor.document.getById( 'foo' );
    editor.editable().attachListener( element, 'click', function( evt ) {
        // ...

        // Get the event target (needed for events delegation).
        evt.data.getTarget();
    } );
} );

检查文档以了解在这种情况下非常重要的editor#contentDom事件。

于 2013-06-11T18:47:26.340 回答