最小限の再現: https ://gist.github.com/DanielDignam/b49084941a2f731501d5
Windows 10では、ノード4.1.1、Chrome 45.0.2454.85、およびElectron0.35.2を使用しています。
添付アプリを実行します。 ^ Zがコンソールに正しく報告することに注意してください。 入力ボックスに何かを入力し、ボタンを押してDOMから要素を削除します。 ^ Zを押すと、レポートされないことに注意してください。 もう一度^ Zを押すと、そうなることに注意してください。
再実行してテキストボックスにN回貼り付けると、報告されるまでにかかる^ Zの数がN + 1であることがわかります。
つまり、入力ボックスはDOMに存在しなくなってもイベントを処理しており、Undoスタックを空にするまで^ Zを渡しません。
これは、入力フィールドが使用されてからDOMから削除された場合に、アプリケーションの取り消しアクションが^ Zで復元されないアプリケーションで取り消しを中断します。
フォーム/入力がない場合、アプリケーションの他の状態を元に戻したいと思います。
<!DOCTYPE html>
<html>
<head>
<title>Hello World!</title>
</head>
<body id='body'>
<h1>Hello World!</h1>
We are using node <script>document.write(process.versions.node)</script>,
Chrome <script>document.write(process.versions.chrome)</script>,
and Electron <script>document.write(process.versions.electron)</script>.
<script>
function removeInput(event) {
var i = document.getElementById("foo");
var b = document.getElementById("body");
b.removeChild(i);
}
const remote = require('electron').remote;
const Menu = remote.Menu;
const MenuItem = remote.MenuItem;
var template = [
{
label: 'Edit',
submenu: [
{
label: 'Undo',
accelerator: 'CmdOrCtrl+Z',
click: function () {
console.log('Undo called');
},
enabled: true
}
]
}];
menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);
</script>
<input id='foo' type='text'/>
<input type='button' onclick='removeInput()'/>
</body>
</html>
これは、DOM入力を処理するときのChromiumのバグです。解決策は、Menuのアクセラレータに依存するのではなく、DOMイベントを使用して入力を手動で処理することだと思います。
これを修正するには、Chromiumのソースコードを掘り下げる必要がありますが、それは大変な作業です。 Chromiumへの報告も機能しない可能性があります。これを再現するには、Chromeにカスタムメニュー項目を追加する必要がありますが、これは不可能です。
おそらく誰も調べないので、これを修正しないので閉じます。DOMの主要なイベントをリッスンすることで回避できます。
私のようなこの問題に遭遇した人のために:これはChromiumバグトラッカーの問題ですが、執筆時点ではまだ修正されていません。
アクセラレータなしでメニュー項目を作成し、レンダラーでCtrl + Zキーイベントをリッスンすることで、これを回避しています。 これは機能します。 ただし、メニューの[元に戻す]の横に[Ctrl + Z]ショートカットを表示するにはどうすればよいですか?