我正在寻找一种让CKEDITOR所见即所得内容互动的方法。这意味着例如向特定元素添加一些onclick事件。我可以这样做:
CKEDITOR.instances['editor1'].document.getById('someid').setAttribute('onclick','alert("blabla")');
处理完这个动作后,效果很好。但是,如果我将模式更改为源模式然后返回到wysiwyg模式,则javascript将无法运行。 onclick操作在源模式下仍然可见,但不会在textarea元素内呈现。
然而,有趣的是,每次都可以正常工作:
CKEDITOR.instances['editor1'].document.getById('id1').setAttribute('style','cursor: pointer;');
它也没有在textarea元素中呈现!这怎么可能?使用CKEDITOR内容元素的onclick和onmouse事件的最佳方法是什么?
我尝试通过source-mode手动写这个:
<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);
}
});
}
}
});
答案 0 :(得分:11)
此属性已删除,因为CKEditor不允许此属性。此过滤系统称为高级内容过滤器,您可以在此处阅读:
简而言之 - 您需要配置编辑器以允许某些元素上的onclick
属性。例如:
CKEDITOR.replace( 'editor1', {
extraAllowedContent: 'strong[onclick]'
} );
在此处阅读更多内容:config.extraAllowedContent
。
on*
个属性
CKEditor在加载内容时对on*
属性进行编码,因此它们不会破坏编辑功能。例如,onmouseout
在编辑器中变为data-cke-pa-onmouseout
,然后,当从编辑器获取数据时,此属性将被解码。
没有配置选项,因为它没有意义。
注意:当你在编辑器的可编辑元素中设置元素的属性时,你应该将它设置为受保护的格式:
element.setAttribute( 'data-cke-pa-onclick', 'alert("blabla")' );
如果您想在编辑器中观察点击事件,那么这是正确的解决方案:
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
event的文档,这些在这种情况下非常重要。