在TinyMCE编辑器中限制键盘快捷键

试图在jQuery版本的TinyMCE编辑器中找到禁用单个键盘快捷键的位置。 目前允许的快捷方式列表是:

  • ctrl + z撤消
  • ctrl + y重做
  • ctrl + b Bold
  • ctrl + i Italic
  • ctrl + u下划线
  • ctrl + 1-6 h1-h6
  • ctrl + 7 p
  • ctrl + 8 div
  • ctrl + 9地址

目前正在寻找禁用所有快捷方式,但撤消,重做和加粗。 其余的在我们的实现中是不合理的,因为它是不需要的格式。

我似乎无法找到启用这些快捷方式的代码。 你能指出在哪里找到这个代码。

禁用在Firefox中测试

这应该有助于您入门。 您可能需要为ctrl+uctrl+i添加空快捷方式以在其他浏览器中禁用它,但此代码已经过测试以禁用Firefox中的操作。 刚刚运行tinyMCE初始化后运行(我在Firebug中测试了我的):

 for(var i in tinyMCE.editors){ var editor = tinyMCE.editors[i]; for(var s in editor.shortcuts){ var shortcut = editor.shortcuts[s]; // Remove all shortcuts except Bold (66), Redo (89), Undo (90) if(!(s == "ctrl,,,66" || s == "ctrl,,,89" || s == "ctrl,,,90")){ // This completely removes the shortcuts delete editor.shortcuts[s]; // You could use this instead, which just disables it, but still keeps // browser functionality (like CMD+U = show source in FF Mac) from interrupting the flow // shortcut.func = function(){ }; } } } 

背景

它似乎是在jscripts/tiny_mce/classes/Editor.js 2294行左右定义的(来自完整的开发下载)。

此外,它们存储在Editor.shortcuts变量的数组中。 它们的键设置有特殊的字符,然后是键码,如下所示: ctrl,,,90

但据我所知,似乎很多浏览器都实现了自己的ctrl+bctrl+ictrl+u ,而且只有Gecko浏览器不会:

 // Add default shortcuts for gecko if (isGecko) { t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold'); t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic'); t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline'); } 

但是,如果你环顾四周,你可以看到他们如何启用它。

另外,查看Editor.addShortcut方法。 您可以覆盖默认行为。

虽然这有一个公认的答案,但我会与tinymce4分享我的用法。 您只需将editor.addShortcut('ctrl+u', "", "")setup方法中的init事件方法,该方法将覆盖添加的快捷方式

例:

 tinyMCE.init({ // Your options here setup: function(editor) { editor.on("init", function(){ editor.addShortcut("ctrl+u", "", ""); }); } }) 

您可以使用上述代码中的ctrl+u替换您要禁用的任何快捷方式。

在IE和FF中允许IB和U来回切换的示例代码。

 var ctrlKey = false; function removeShortcuts(){ var e = tinyMCE.activeEditor; for (var s in e.shortcuts){ if(s=="ctrl,,,73" || s=="ctrl,,,85" || s="ctrl,,,66"){ e.shortcuts[s].func = function(){}; } } e.onKeyUp.add(onKeyUp); e.onKeyDown.add(onKeyDown); } function resetShortcuts(){ var e = tinyMCE.activeEditor; if (isGecko) { e.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold'); e.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic'); e.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline'); } e.onKeyUp.remove(onKeyUp); e.onKeyDown.remove(onKeyDown); } function onKeyUp(editor, event){ if(event.keyCode == 17){ ctrlKey = false; } } function onKeyDown(editor, event){ if(event.keyCode == 17){ ctrlKey = true; } if(ctrlKey && (event.keyCode == 73 || event.keyCode == 85 || event.keyCode == 66){ tinymce.dom.Event.cancel(event); } } 

好的,所以我能够让这个工作。 我能够使用上面的Doug代码来阻止firefox以使IE禁用密钥我希望在Doug的代码块之后我必须添加这个代码。

 var $iframe = $('iframe').contents().get(0); $($iframe).keydown(function(oEvent) { //italics (ctrl+i & Cmd+i [Safari doesn't allow you to test for Cmd]) if (oEvent.keyCode == '73' && (oEvent.metaKey || oEvent.ctrlKey)){ oEvent.preventDefault(); return false; } //underline (ctrl+u & cmd+u [Safari doesn't allow you to test for cmd]) if (oEvent.keyCode == '85' && (oEvent.metaKey || oEvent.ctrlKey)){ oEvent.preventDefault(); return false; } }); 

所以基本上TinyMCE会动态地将编辑器加载为iFrame,因此我从iFrame中禁用了Ctrl + uCtrl + i 。 我是什么,直到iFrame完成加载,然后附加一个keydown事件和嗅探Ctrl + iCtrl + i (我也嗅到Cmd + iCmd + u为mac [虽然Safari不会让你测试cmd根据到这个链接 。其他一切都被禁用,我需要禁用。

对于TinyMCE v4: 编辑器主体中可用的键盘快捷键列表

 tinyMCE.init({ setup: function(editor) { editor.on("init", function(){ editor.shortcuts.remove('meta+u', '', ''); // "meta" maps to Command on Mac and Ctrl on PC }); } })