Monaco Editor使用AddAction/AddCommand时如何阻止事件冒泡?
我之前在折腾Monaco Editor的时候也碰到过这个头疼的问题——用addAction注册的快捷键,run函数里居然只有editor对象,拿不到键盘事件,根本没法阻止冒泡!不过后来找到个靠谱的解决办法,就是把快捷键绑定和action的逻辑分开处理:
步骤1:抽离核心逻辑函数
先把你原来run里的代码抽成一个独立函数,这样不管是快捷键触发还是右键菜单触发,都能复用:
function handleRun(editor) { // 这里写你原本要执行的逻辑 /*do something*/ }
步骤2:用addCommand绑定快捷键(重点!)
Monaco的editor.addCommand方法和addAction不同,它的回调函数能直接拿到键盘事件对象。我们用这个方法来绑定Ctrl/Cmd+Enter,顺便处理事件阻止:
editor.addCommand( monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, function(event) { // 阻止事件冒泡和默认行为 event.stopPropagation(); event.preventDefault(); // 调用核心逻辑 handleRun(editor); }, "" // 可选:这里可以填上下文条件,比如只有编辑器有焦点时触发 );
步骤3:保留右键菜单的Action入口
把原来的addAction配置里的keybindings去掉,直接复用刚才的核心函数,这样右键菜单里的"run"选项依然能用:
editor.addAction({ id: 'runStep', label: 'run', // 移除keybindings配置,因为已经用addCommand绑定了 contextMenuGroupId: 'navigation', contextMenuOrder: 1.5, run: handleRun // 直接复用核心逻辑 });
这样一来,不管是通过快捷键还是右键菜单触发,逻辑都是一致的,而且快捷键触发时能完美阻止事件冒泡和默认行为。要是你用的Monaco版本比较新,也可以试试在addAction的run函数里查看第二个参数context——有些版本里会包含触发来源的信息,但用addCommand的方式是最稳妥的,毕竟它直接把事件对象递到你手里了。
内容的提问来源于stack exchange,提问作者Qiao Liu
相关产品推荐
相关产品推荐

