Electron: DOMから削除された入力要素は、元に戻すスタックが空になるまで^ Zを消費します

作成日 2015年12月03日  ·  3コメント  ·  ソース: electron/electron

最小限の再現: 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>

全てのコメント3件

これは、DOM入力を処理するときのChromiumのバグです。解決策は、Menuのアクセラレータに依存するのではなく、DOMイベントを使用して入力を手動で処理することだと思います。

これを修正するには、Chromiumのソースコードを掘り下げる必要がありますが、それは大変な作業です。 Chromiumへの報告も機能しない可能性があります。これを再現するには、Chromeにカスタムメニュー項目を追加する必要がありますが、これは不可能です。

おそらく誰も調べないので、これを修正しないので閉じます。DOMの主要なイベントをリッスンすることで回避できます。

私のようなこの問題に遭遇した人のために:これはChromiumバグトラッカーの問題ですが、執筆時点ではまだ修正されていません。

アクセラレータなしでメニュー項目を作成し、レンダラーでCtrl + Zキーイベントをリッスンすることで、これを回避しています。 これは機能します。 ただし、メニューの[元に戻す]の横に[Ctrl + Z]ショートカットを表示するにはどうすればよいですか?

このページは役に立ちましたか?
0 / 5 - 0 評価