1 /** 2 * contextmenu for kissy editor 3 * @author yiminghe@gmail.com 4 */ 5 KISSY.add("editor/plugin/contextmenu/index", function (S, Editor, Menu, focusFix) { 6 7 Editor.prototype.addContextMenu = function (id, filter, cfg) { 8 9 var self = this; 10 11 cfg = cfg || {}; 12 13 cfg.prefixCls = self.get("prefixCls") + "editor-"; 14 cfg.editor = self; 15 cfg.focusable = 1; 16 cfg.zIndex = Editor.baseZIndex(Editor.zIndexManager.POPUP_MENU); 17 cfg.elAttrs = { 18 hideFocus:'hideFocus' 19 }; 20 21 if (cfg.children) { 22 S.each(cfg.children, function (c) { 23 c.xclass = 'menuitem'; 24 }); 25 } 26 27 var menu = new Menu.PopupMenu(cfg); 28 29 focusFix.init(menu); 30 31 self.docReady(function () { 32 var doc = self.get("document"); 33 // 编辑器获得焦点,不会触发 menu el blur? 34 doc.on("mousedown", function (e) { 35 if (e.which == 1) { 36 menu.hide(); 37 } 38 }); 39 doc.delegate("contextmenu", filter, function (ev) { 40 var t = S.all(ev.target); 41 ev.halt(); 42 // ie 右键作用中,不会发生焦点转移,光标移动 43 // 只能右键作用完后才能,才会发生光标移动,range变化 44 // 异步右键操作 45 // qc #3764,#3767 46 var x = ev.pageX, 47 y = ev.pageY; 48 if (!x) { 49 var xy = t.offset(document); 50 x = xy.left; 51 y = xy.top; 52 } else { 53 var translate = Editor.Utils.getXY(x, y, doc[0], document); 54 x = translate.left; 55 y = translate.top; 56 } 57 setTimeout(function () { 58 menu.set("editorSelectedEl", t, { 59 silent:1 60 }); 61 menu.set("xy", [x, y]); 62 menu.show(); 63 self.fire("contextmenu", { 64 contextmenu:menu 65 }); 66 window.focus(); 67 document.body.focus(); 68 // 防止焦点一直在 el,focus 无效 69 menu.get("el")[0].focus(); 70 }, 30); 71 }); 72 }); 73 74 self.addControl(id + "/contextmenu", menu); 75 76 return menu; 77 }; 78 }, { 79 requires:['editor', 'menu', '../focusFix/'] 80 }); 81