Electron: Das aus dem DOM entfernte Eingabeelement verbraucht ^Z, bis sein Undo-Stack leer ist

Erstellt am 3. Dez. 2015  ·  3Kommentare  ·  Quelle: electron/electron

Minimale Repro: https://gist.github.com/DanielDignam/b49084941a2f731501d5

Wir verwenden Node 4.1.1, Chrome 45.0.2454.85 und Electron 0.35.2 unter Windows 10

Führen Sie die angehängte App aus. Beachten Sie, dass ^Z korrekt an die Konsole berichtet. Geben Sie etwas in das Eingabefeld ein und klicken Sie auf die Schaltfläche, um das Element aus dem DOM zu entfernen. Drücken Sie ^Z. Beachten Sie, dass es nicht gemeldet wird. Drücken Sie erneut ^Z und stellen Sie fest, dass dies der Fall ist.

Wenn Sie etwas N-mal erneut ausführen und in das Textfeld einfügen, werden Sie feststellen, dass die Anzahl der ^Z, die erforderlich sind, bevor es gemeldet wird, N+1 beträgt.

Die Implikation ist, dass das Eingabefeld immer noch Ereignisse verarbeitet, obwohl es sich nicht mehr im DOM befindet, und das ^Z nicht weitergibt, bis es seinen Undo-Stack geleert hat.

Dies unterbricht das Rückgängigmachen in unserer Anwendung, in der Anwendungsaktionen zum Rückgängigmachen auf ^Z nicht wiederhergestellt werden, wenn ein Eingabefeld verwendet und dann aus dem DOM entfernt wurde.

Wir möchten einen anderen Status in unserer Anwendung rückgängig machen, wenn kein Formular / keine Eingabe vorhanden ist.

<!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>

Alle 3 Kommentare

Dies ist ein Fehler von Chromium beim Umgang mit DOM-Eingaben. Ich denke, die Lösung besteht darin, die Eingabe mit DOM-Ereignissen manuell zu behandeln, anstatt sich auf den Beschleuniger von Menu zu verlassen.

Um dies zu beheben, müssen wir uns in den Quellcode von Chromium einarbeiten, aber das ist einfach zu viel Arbeit. Das Melden an Chromium wird wahrscheinlich auch nicht funktionieren, da Sie zur Reproduktion einen benutzerdefinierten Menüeintrag zu Chrome hinzufügen müssen, was nicht möglich ist.

Ich schließe dies, da es nicht behoben werden kann, da sich wahrscheinlich niemand darum kümmern würde, und Sie können es umgehen, indem Sie sich die Schlüsselereignisse von DOM anhören.

Für Leute, die wie ich über dieses Problem gestolpert sind: Hier ist das Problem im Chromium-Bugtracker, zum Zeitpunkt des Schreibens ist es immer noch nicht behoben.

Ich umgehe dies, indem ich das Menüelement ohne Zugriffstaste erstelle und im Renderer auf das Tastenereignis Strg+Z lausche. Das funktioniert. Wie kann ich jetzt jedoch die Tastenkombination „Strg+Z“ dazu bringen, neben „Rückgängig“ im Menü angezeigt zu werden?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen