Electron: элемент ввода, удаленный из DOM, использует ^Z, пока его стек отмены не станет пустым

Созданный на 3 дек. 2015  ·  3Комментарии  ·  Источник: electron/electron

Минимальное воспроизведение: https://gist.github.com/DanielDignam/b49084941a2f731501d5

Мы используем узел 4.1.1, Chrome 45.0.2454.85 и Electron 0.35.2 в Windows 10.

Запустите прикрепленное приложение. Обратите внимание, что ^Z правильно сообщает на консоль. Введите что-нибудь в поле ввода и нажмите кнопку, чтобы удалить элемент из DOM. Нажмите ^Z, обратите внимание, что он не сообщает. Нажмите ^Z еще раз и обратите внимание, что это так.

Если вы повторно запустите и вставите что-то в текстовое поле N раз, вы заметите, что количество ^Z, которое требуется, прежде чем будет сообщено, равно N+1.

Подразумевается, что поле ввода все еще обрабатывает события, даже если оно больше не находится в DOM, и не передает ^Z, пока не очистит свой стек отмены.

Это прерывает отмену в нашем приложении, где действия отмены приложения не будут восстановлены на ^Z, если поле ввода было использовано, а затем удалено из DOM.

Мы хотим отменить другое состояние в нашем приложении, когда нет формы/ввода.

<!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 Комментарий

Это ошибка Chromium при обработке входных данных DOM, я думаю, что решение состоит в том, чтобы обрабатывать ввод с событиями DOM вручную, вместо того, чтобы полагаться на ускоритель меню.

Чтобы исправить это, нам нужно копаться в исходном коде Chromium, но это слишком много работы. Сообщить об этом в Chromium тоже вряд ли получится, потому что для его воспроизведения вам нужно добавить пользовательский пункт меню в Chrome, что невозможно.

Я закрываю это, поскольку это не будет исправлено, поскольку, вероятно, никто не будет в этом разбираться, и вы можете обойти это, прослушивая ключевые события DOM.

Для людей, которые столкнулись с этой проблемой, как я: вот проблема в трекере ошибок Chromium, на момент написания она все еще не исправлена.

Я работаю над этим, создавая пункт меню без ускорителя и прослушивая событие клавиши Ctrl + Z в средстве визуализации. Это работает. Однако как мне теперь сделать так, чтобы ярлык «Ctrl + Z» отображался рядом с «Отменить» в меню?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги