我认为 electron 是对的,ckeditor 直接改变了 DOM 元素,并且没有复制 onBlur 发生。也没有“本机”ckeditor onBlur 事件。
也就是说,我找到了一种生成 onFocus 和 onBlur 事件的方法:
ckeditor 提供了一个currentInstance 事件,该事件在任何时候触发
有一个焦点变化。
http://docs.ckeditor.com/#!/api/CKEDITOR-event-currentInstance
有一个 css 类 .cke_focus 添加到当前
焦点元素。
使用这两个事实(以及 jQuery 进行简单演示),我们可以编写自己的 onBlur 和 onFocus 事件:
var onCurrentInstance = function(){
var focused = $();
var onBlur = function(obj){
console.log("Blur:", obj);
};
var onFocus = function(obj){
console.log("Focus:", obj);
};
return function(e){
var cke_focus = $(".cke_focus");
if(cke_focus.size() > 0) onFocus(cke_focus);
if(focused.size() > 0) onBlur(focused);
focused = cke_focus;
};
};
CKEDITOR.on( "currentInstance", onCurrentInstance());
这是一个非常基本的示例,可以复制并粘贴到 ckeditor 附带的samples/inlineall.html 示例中。
不要忘记在示例中添加 jQuery:
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
更新:这里是相同的功能,以更通用的方式允许绑定多个 onFocus 和 onBlur 事件:
var bindFocusBlur = function(onFocus, onBlur){
var focused = $();
return function(e){
var cke_focus = $(".cke_focus");
if(cke_focus.size() > 0 && typeof onFocus === "function"){
onFocus(cke_focus);
}
if(focused.size() > 0 && typeof onBlur === "function"){
onBlur(focused);
}
focused = cke_focus;
};
};
这样使用:
var onFocus = function(){};
var onBlur = function(){};
var onFocus2 = function(){};
CKEDITOR.on( "currentInstance", bindFocusBlur( onFocus, onBlur ));
CKEDITOR.on( "currentInstance", bindFocusBlur( onFocus2 ));