Electron: el elemento de entrada eliminado del DOM consume ^Z hasta que su pila de deshacer esté vacía

Creado en 3 dic. 2015  ·  3Comentarios  ·  Fuente: electron/electron

Reproducción mínima: https://gist.github.com/DanielDignam/b49084941a2f731501d5

Estamos usando el nodo 4.1.1, Chrome 45.0.2454.85 y Electron 0.35.2, en Windows 10

Ejecute la aplicación adjunta. Observe que ^Z informa correctamente a la consola. Escriba algo en el cuadro de entrada y presione el botón para eliminar el elemento del DOM. Presiona ^Z para notar que no informa. Presiona ^Z nuevamente y observa que lo hace.

Si vuelve a ejecutar y pega algo en el cuadro de texto N veces, notará que la cantidad de ^Z que se necesitan antes de que se informe es N+1.

La implicación es que el cuadro de entrada todavía está procesando eventos aunque ya no esté en el DOM, y no pasa el ^Z hasta que haya vaciado su pila Deshacer.

Esto interrumpe el deshacer en nuestra aplicación, donde las acciones de deshacer de la aplicación no se restaurarán en ^Z si se usó un campo de entrada y luego se eliminó del DOM.

Queremos deshacer otro estado en nuestra aplicación cuando no hay formulario/entrada.

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

Todos 3 comentarios

Este es un error de Chromium al manejar entradas DOM, creo que la solución es manejar la entrada con eventos DOM manualmente en lugar de confiar en el acelerador de Menu.

Para solucionar esto, tenemos que profundizar en el código fuente de Chromium, pero eso es demasiado trabajo. Es poco probable que informarlo a Chromium también funcione porque para reproducirlo debe agregar un elemento de menú personalizado a Chrome, lo cual no es posible.

Estoy cerrando esto porque no lo arreglaré, ya que probablemente nadie lo investigaría, y puede solucionarlo escuchando los eventos clave de DOM.

Para las personas que se toparon con este problema como yo: aquí está el problema en el rastreador de errores de Chromium, en el momento de escribir este artículo todavía no está solucionado.

Estoy solucionando esto creando el elemento de menú sin un acelerador y escuchando el evento de tecla Ctrl+Z en el renderizador. Esto funciona. Sin embargo, ¿cómo puedo hacer que aparezca el atajo "Ctrl+Z" junto a "Deshacer" en el menú?

¿Fue útil esta página
0 / 5 - 0 calificaciones