2015-10-05 30 views
1

我正在帮助一家公司在所见即所得编辑器中使用撤销/重做功能调试一些问题。不幸的是,Safari似乎吞噬了CMD + Z击键,并且它永远不会到达keydown回调。在Safari中拦截CMD + Z,CMD + SHIFT + Z和CMD + Y

有没有办法在Javascript中检测这些击键并阻止默认操作? (编辑器有自己的撤销/重做堆栈)。

更新

对不起,我应该说,我可以拦截CMD + Z当浏览器本地撤消堆栈为空,或者当输入或CONTENTEDITABLE不在焦点。否则,它似乎不会被触发或冒泡。

+0

检测,是(http://stackoverflow.com/questions/7251956/detecting-command-keystroke-in-safari/7252716#7252716)。预防,可能不会。 – Touffy

+0

我发现这个项目可以捕获cmd + z并且可以阻止它冒泡:https://github.com/ccampbell/mousetrap不幸的是,我一直无法破译它如何成功到目前为止,所以我可以拉入只是我需要的一点。 –

回答

0

我有一个奇怪的情况。原代码我没有阻止事件的冒泡:

evt.preventDefault(); 
evt.stopPropagation(); 

当我加入这个并刷新页面,浏览器仍然拦截按键。只是偶然发现,如果我关闭了浏览器选项卡并在测试页面打开了一个新浏览器,那么浏览器必须重置某些内容,现在我可以拦截并停止默认的撤销/重做功能:使用keydown事件:

if (evt.metaKey || evt.ctrlKey) { 
    switch (evt.which) { 
     case 89: // redo, CMD+Y 
      evt.preventDefault(); 
      evt.stopPropagation(); 
      // Do your Redo stuff 
      break; 
     case 90: 
      if (evt.shiftKey) { // redo, CMD+SHIFT+Z 
       evt.preventDefault(); 
       evt.stopPropagation(); 
       // Do your Redo stuff 
      } else { // undo, CMD+Z 
       evt.preventDefault(); 
       evt.stopPropagation(); 
       // Do your Undo stuff 
      } 
      break; 
    } 
} 

工程请客:)