1 /** 2 * 多实例的管理,主要是焦点控制,主要是为了 3 * 1.firefox 焦点失去 bug,记录当前状态 4 * 2.窗口隐藏后能够恢复焦点 5 * @author yiminghe@gmail.com 6 */ 7 KISSY.add("editor/core/focusManager", function (S) { 8 var Editor = S.Editor, 9 DOM = S.DOM, 10 Event = S.Event, 11 INSTANCES = {}, 12 timer, 13 //当前焦点所在处 14 currentInstance, 15 focusManager = { 16 /** 17 * 刷新全部实例 18 */ 19 refreshAll:function () { 20 for (var i in INSTANCES) { 21 if (INSTANCES.hasOwnProperty(i)) { 22 var e = INSTANCES[i], doc = e.get("document")[0]; 23 doc.designMode = "off"; 24 doc.designMode = "on"; 25 } 26 } 27 }, 28 /** 29 * 得到当前获得焦点的实例 30 */ 31 currentInstance:function () { 32 return currentInstance; 33 }, 34 /** 35 * 36 * @param id {string} 37 */ 38 getInstance:function (id) { 39 return INSTANCES[id]; 40 }, 41 add:function (editor) { 42 var win = DOM._getWin(editor.get("document")[0]); 43 Event.on(win, "focus", focus, editor); 44 Event.on(win, "blur", blur, editor); 45 }, 46 register:function (editor) { 47 INSTANCES[editor._UUID] = editor; 48 }, 49 remove:function (editor) { 50 delete INSTANCES[editor._UUID]; 51 var win = DOM._getWin(editor.get("document")[0]); 52 Event.remove(win, "focus", focus, editor); 53 Event.remove(win, "blur", blur, editor); 54 } 55 }, 56 TRUE = true, 57 FALSE = false, 58 NULL = null; 59 60 function focus() { 61 var editor = this; 62 editor.__iframeFocus = TRUE; 63 currentInstance = editor; 64 if (timer) { 65 clearTimeout(timer); 66 } 67 timer = setTimeout(function () { 68 editor.fire("focus"); 69 }, 100); 70 } 71 72 function blur() { 73 var editor = this; 74 editor.__iframeFocus = FALSE; 75 currentInstance = NULL; 76 if (timer) { 77 clearTimeout(timer); 78 } 79 /* 80 Note that this functions acts asynchronously with a delay of 100ms to 81 avoid subsequent blur/focus effects. 82 */ 83 timer = setTimeout(function () { 84 editor.fire("blur"); 85 }, 100); 86 } 87 88 focusManager['refreshAll'] = focusManager.refreshAll; 89 Editor.focusManager = focusManager; 90 Editor.getInstances = function () { 91 return INSTANCES; 92 }; 93 94 return focusManager; 95 }, { 96 requires:['./base', './dom'] 97 }); 98